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