You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.3 KiB
93 lines
2.3 KiB
7 months ago
|
//===- 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
|