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