//===- 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