C++程序  |  95行  |  2.21 KB

//===- SectionsCmd.cpp ----------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <mcld/Script/SectionsCmd.h>
#include <mcld/Support/raw_ostream.h>
#include <cassert>

using namespace mcld;

//===----------------------------------------------------------------------===//
// SectionsCmd
//===----------------------------------------------------------------------===//
SectionsCmd::SectionsCmd()
  : ScriptCommand(ScriptCommand::SECTIONS)
{
}

SectionsCmd::~SectionsCmd()
{
  for (iterator it = begin(), ie = end(); it != ie; ++it) {
    if (*it != NULL)
      delete *it;
  }
}

void SectionsCmd::dump() const
{
  mcld::outs() << "SECTIONS\n{\n";

  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
    switch ((*it)->getKind()) {
    case ScriptCommand::ENTRY:
    case ScriptCommand::ASSIGNMENT:
    case ScriptCommand::OUTPUT_SECT_DESC:
      mcld::outs() << "\t";
      (*it)->dump();
      break;
    default:
      assert(0);
      break;
    }
  }

  mcld::outs() << "}\n";
}

void SectionsCmd::push_back(ScriptCommand* pCommand)
{
  switch (pCommand->getKind()) {
  case ScriptCommand::ENTRY:
  case ScriptCommand::ASSIGNMENT:
  case ScriptCommand::OUTPUT_SECT_DESC:
    m_SectionCommands.push_back(pCommand);
    break;
  default:
    assert(0);
    break;
  }
}

void SectionsCmd::activate(Module& pModule)
{
  // Assignment between output sections
  SectionCommands assignments;

  for (const_iterator it = begin(), ie = end(); it != ie; ++it) {
    switch ((*it)->getKind()) {
    case ScriptCommand::ENTRY:
      (*it)->activate(pModule);
      break;
    case ScriptCommand::ASSIGNMENT:
      assignments.push_back(*it);
      break;
    case ScriptCommand::OUTPUT_SECT_DESC: {
      (*it)->activate(pModule);

      iterator assign, assignEnd = assignments.end();
      for (assign = assignments.begin(); assign != assignEnd; ++assign)
        (*assign)->activate(pModule);
      assignments.clear();

      break;
    }
    default:
      assert(0);
      break;
    }
  }
}