//===- 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> 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; } } } } // namespace mcld