1f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===- SectionsCmd.cpp ----------------------------------------------------===// 2f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 3f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// The MCLinker Project 4f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 5f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// This file is distributed under the University of Illinois Open Source 6f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// License. See LICENSE.TXT for details. 7f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 8f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/SectionsCmd.h" 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines 1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/raw_ostream.h" 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines 13f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <cassert> 14f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 1537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 16f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 17f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 18f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// SectionsCmd 19f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 2037b74a387bb3993387029859c2d9d051c41c724eStephen HinesSectionsCmd::SectionsCmd() : ScriptCommand(ScriptCommand::SECTIONS) { 21f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 22f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 2337b74a387bb3993387029859c2d9d051c41c724eStephen HinesSectionsCmd::~SectionsCmd() { 24f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines for (iterator it = begin(), ie = end(); it != ie; ++it) { 25f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (*it != NULL) 26f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines delete *it; 27f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 28f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 29f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 3037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid SectionsCmd::dump() const { 31f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines mcld::outs() << "SECTIONS\n{\n"; 32f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 33f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines for (const_iterator it = begin(), ie = end(); it != ie; ++it) { 34f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines switch ((*it)->getKind()) { 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines case ScriptCommand::ENTRY: 3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines case ScriptCommand::ASSIGNMENT: 3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines case ScriptCommand::OUTPUT_SECT_DESC: 3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines mcld::outs() << "\t"; 3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines (*it)->dump(); 4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines default: 4237b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(0); 4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 44f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 45f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 46f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 47f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines mcld::outs() << "}\n"; 48f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 49f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 5037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid SectionsCmd::push_back(ScriptCommand* pCommand) { 51f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines switch (pCommand->getKind()) { 5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines case ScriptCommand::ENTRY: 5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines case ScriptCommand::ASSIGNMENT: 5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines case ScriptCommand::OUTPUT_SECT_DESC: 5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines m_SectionCommands.push_back(pCommand); 5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines default: 5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(0); 5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 60f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 61f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 62f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 6337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid SectionsCmd::activate(Module& pModule) { 64f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // Assignment between output sections 65f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines SectionCommands assignments; 66f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 67f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines for (const_iterator it = begin(), ie = end(); it != ie; ++it) { 68f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines switch ((*it)->getKind()) { 6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines case ScriptCommand::ENTRY: 7037b74a387bb3993387029859c2d9d051c41c724eStephen Hines (*it)->activate(pModule); 7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 7237b74a387bb3993387029859c2d9d051c41c724eStephen Hines case ScriptCommand::ASSIGNMENT: 7337b74a387bb3993387029859c2d9d051c41c724eStephen Hines assignments.push_back(*it); 7437b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 7537b74a387bb3993387029859c2d9d051c41c724eStephen Hines case ScriptCommand::OUTPUT_SECT_DESC: { 7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines (*it)->activate(pModule); 77f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 7837b74a387bb3993387029859c2d9d051c41c724eStephen Hines iterator assign, assignEnd = assignments.end(); 7937b74a387bb3993387029859c2d9d051c41c724eStephen Hines for (assign = assignments.begin(); assign != assignEnd; ++assign) 8037b74a387bb3993387029859c2d9d051c41c724eStephen Hines (*assign)->activate(pModule); 8137b74a387bb3993387029859c2d9d051c41c724eStephen Hines assignments.clear(); 82f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 8437b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 8537b74a387bb3993387029859c2d9d051c41c724eStephen Hines default: 8637b74a387bb3993387029859c2d9d051c41c724eStephen Hines assert(0); 8737b74a387bb3993387029859c2d9d051c41c724eStephen Hines break; 88f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 89f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 90f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines 9237b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 93