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