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//===----------------------------------------------------------------------===// 9f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Script/SectionsCmd.h> 10f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Support/raw_ostream.h> 11f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <cassert> 12f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 13f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesusing namespace mcld; 14f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 15f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 16f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// SectionsCmd 17f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 18f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesSectionsCmd::SectionsCmd() 19f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines : ScriptCommand(ScriptCommand::SECTIONS) 20f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 21f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 22f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 23f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesSectionsCmd::~SectionsCmd() 24f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 25f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines for (iterator it = begin(), ie = end(); it != ie; ++it) { 26f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (*it != NULL) 27f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines delete *it; 28f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 29f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 30f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 31f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesvoid SectionsCmd::dump() const 32f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 33f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines mcld::outs() << "SECTIONS\n{\n"; 34f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 35f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines for (const_iterator it = begin(), ie = end(); it != ie; ++it) { 36f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines switch ((*it)->getKind()) { 37f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptCommand::ENTRY: 38f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptCommand::ASSIGNMENT: 39f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptCommand::OUTPUT_SECT_DESC: 40f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines mcld::outs() << "\t"; 41f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines (*it)->dump(); 42f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 43f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines default: 44f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines assert(0); 45f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 46f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 47f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 48f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 49f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines mcld::outs() << "}\n"; 50f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 51f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 52f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesvoid SectionsCmd::push_back(ScriptCommand* pCommand) 53f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 54f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines switch (pCommand->getKind()) { 55f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptCommand::ENTRY: 56f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptCommand::ASSIGNMENT: 57f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptCommand::OUTPUT_SECT_DESC: 58f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines m_SectionCommands.push_back(pCommand); 59f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 60f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines default: 61f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines assert(0); 62f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 63f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 64f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 65f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 66f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesvoid SectionsCmd::activate(Module& pModule) 67f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 68f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines // Assignment between output sections 69f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines SectionCommands assignments; 70f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 71f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines for (const_iterator it = begin(), ie = end(); it != ie; ++it) { 72f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines switch ((*it)->getKind()) { 73f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptCommand::ENTRY: 74f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines (*it)->activate(pModule); 75f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 76f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptCommand::ASSIGNMENT: 77f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines assignments.push_back(*it); 78f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 79f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines case ScriptCommand::OUTPUT_SECT_DESC: { 80f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines (*it)->activate(pModule); 81f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 82f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines iterator assign, assignEnd = assignments.end(); 83f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines for (assign = assignments.begin(); assign != assignEnd; ++assign) 84f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines (*assign)->activate(pModule); 85f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines assignments.clear(); 86f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 87f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 88f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 89f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines default: 90f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines assert(0); 91f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines break; 92f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 93f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines } 94f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 95