1f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===- ScriptFile.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/ScriptFile.h"
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/ADT/HashEntry.h"
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/ADT/HashTable.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/ADT/StringHash.h"
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/AssertCmd.h"
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/EntryCmd.h"
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/GroupCmd.h"
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/InputCmd.h"
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/Operand.h"
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/OutputArchCmd.h"
2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/OutputCmd.h"
2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/OutputFormatCmd.h"
2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/RpnExpr.h"
2337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/ScriptCommand.h"
2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/SearchDirCmd.h"
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/SectionsCmd.h"
2637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/StringList.h"
2737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Script/StrToken.h"
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/Input.h"
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/InputBuilder.h"
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/MemoryArea.h"
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/InputTree.h"
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines
33f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <llvm/Support/Casting.h>
34f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <llvm/Support/ManagedStatic.h>
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines
36f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <cassert>
37f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
3837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld {
39f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hinestypedef HashEntry<std::string, void*, hash::StringCompare<std::string> >
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ParserStrEntry;
42f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinestypedef HashTable<ParserStrEntry,
43f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                  hash::StringHash<hash::DJB>,
44f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                  EntryFactory<ParserStrEntry> > ParserStrPool;
45f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesstatic llvm::ManagedStatic<ParserStrPool> g_ParserStrPool;
46f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
47f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===//
48f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// ScriptFile
49f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===//
50f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesScriptFile::ScriptFile(Kind pKind, Input& pInput, InputBuilder& pBuilder)
5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines    : m_Kind(pKind),
5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Input(pInput),
5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Name(pInput.path().native()),
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pInputTree(NULL),
5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_Builder(pBuilder),
5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bHasSectionsCmd(false),
5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bInSectionsCmd(false),
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bInOutputSectDesc(false),
5937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pRpnExpr(NULL),
6037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_pStringList(NULL),
6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines      m_bAsNeeded(false) {
62f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  // FIXME: move creation of input tree out of ScriptFile.
63f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  m_pInputTree = new InputTree();
64f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
65f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
6637b74a387bb3993387029859c2d9d051c41c724eStephen HinesScriptFile::~ScriptFile() {
67f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  for (iterator it = begin(), ie = end(); it != ie; ++it) {
68f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    if (*it != NULL)
69f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines      delete *it;
70f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  }
7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  if (m_pInputTree != NULL)
72f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    delete m_pInputTree;
73f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
74f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
7537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ScriptFile::dump() const {
76f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  for (const_iterator it = begin(), ie = end(); it != ie; ++it)
77f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    (*it)->dump();
78f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
79f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
8037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ScriptFile::activate(Module& pModule) {
81f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  for (const_iterator it = begin(), ie = end(); it != ie; ++it)
82f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    (*it)->activate(pModule);
83f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
84f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
8537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ScriptFile::addEntryPoint(const std::string& pSymbol) {
86f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  EntryCmd* entry = new EntryCmd(pSymbol);
87f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
88f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  if (m_bInSectionsCmd) {
89f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    assert(!m_CommandQueue.empty());
90f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    SectionsCmd* sections = llvm::cast<SectionsCmd>(back());
91f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    sections->push_back(entry);
92f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  } else {
93f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    m_CommandQueue.push_back(entry);
94f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  }
95f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
96f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
9737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ScriptFile::addOutputFormatCmd(const std::string& pName) {
98f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  m_CommandQueue.push_back(new OutputFormatCmd(pName));
99f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
100f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
101f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesvoid ScriptFile::addOutputFormatCmd(const std::string& pDefault,
102f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                    const std::string& pBig,
10337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                    const std::string& pLittle) {
104f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  m_CommandQueue.push_back(new OutputFormatCmd(pDefault, pBig, pLittle));
105f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
106f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
10737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ScriptFile::addInputCmd(StringList& pStringList,
10837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             ObjectReader& pObjectReader,
10937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             ArchiveReader& pArchiveReader,
11037b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             DynObjReader& pDynObjReader,
11137b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             const LinkerConfig& pConfig) {
11237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_CommandQueue.push_back(new InputCmd(pStringList,
11337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        *m_pInputTree,
11437b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        m_Builder,
11537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        pObjectReader,
11637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        pArchiveReader,
11737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        pDynObjReader,
11837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                        pConfig));
11937b74a387bb3993387029859c2d9d051c41c724eStephen Hines}
12037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
121f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesvoid ScriptFile::addGroupCmd(StringList& pStringList,
122f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                             GroupReader& pGroupReader,
12337b74a387bb3993387029859c2d9d051c41c724eStephen Hines                             const LinkerConfig& pConfig) {
12437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_CommandQueue.push_back(new GroupCmd(
12537b74a387bb3993387029859c2d9d051c41c724eStephen Hines      pStringList, *m_pInputTree, m_Builder, pGroupReader, pConfig));
126f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
127f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
12837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ScriptFile::addOutputCmd(const std::string& pFileName) {
129f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  m_CommandQueue.push_back(new OutputCmd(pFileName));
130f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
131f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
13237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ScriptFile::addSearchDirCmd(const std::string& pPath) {
133f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  m_CommandQueue.push_back(new SearchDirCmd(pPath));
134f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
135f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
13637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ScriptFile::addOutputArchCmd(const std::string& pArch) {
137f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  m_CommandQueue.push_back(new OutputArchCmd(pArch));
138f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
139f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
14037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ScriptFile::addAssertCmd(RpnExpr& pRpnExpr, const std::string& pMessage) {
141f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  m_CommandQueue.push_back(new AssertCmd(pRpnExpr, pMessage));
142f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
143f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
144f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesvoid ScriptFile::addAssignment(const std::string& pSymbolName,
145f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                               RpnExpr& pRpnExpr,
14637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                               Assignment::Type pType) {
147f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  if (m_bInSectionsCmd) {
148f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    assert(!m_CommandQueue.empty());
149f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    SectionsCmd* sections = llvm::cast<SectionsCmd>(back());
150f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    if (m_bInOutputSectDesc) {
151f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines      assert(!sections->empty());
152f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines      OutputSectDesc* output_desc =
15337b74a387bb3993387029859c2d9d051c41c724eStephen Hines          llvm::cast<OutputSectDesc>(sections->back());
154f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines      output_desc->push_back(new Assignment(Assignment::INPUT_SECTION,
155f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                            pType,
156f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                            *(SymOperand::create(pSymbolName)),
157f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                            pRpnExpr));
158f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    } else {
159f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines      sections->push_back(new Assignment(Assignment::OUTPUT_SECTION,
160f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                         pType,
161f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                         *(SymOperand::create(pSymbolName)),
162f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                         pRpnExpr));
163f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    }
164f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  } else {
165f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines    m_CommandQueue.push_back(new Assignment(Assignment::OUTSIDE_SECTIONS,
166f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                            pType,
167f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                            *(SymOperand::create(pSymbolName)),
168f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines                                            pRpnExpr));
169f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  }
170f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
171f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
17237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool ScriptFile::hasSectionsCmd() const {
173f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return m_bHasSectionsCmd;
174f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
175f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
17637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ScriptFile::enterSectionsCmd() {
177f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  m_bHasSectionsCmd = true;
178f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  m_bInSectionsCmd = true;
179f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  m_CommandQueue.push_back(new SectionsCmd());
180f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
181f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
18237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ScriptFile::leaveSectionsCmd() {
183f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  m_bInSectionsCmd = false;
184f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
185f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
186f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesvoid ScriptFile::enterOutputSectDesc(const std::string& pName,
18737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                     const OutputSectDesc::Prolog& pProlog) {
188f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(!m_CommandQueue.empty());
189f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(m_bInSectionsCmd);
190f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  SectionsCmd* sections = llvm::cast<SectionsCmd>(back());
191f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  sections->push_back(new OutputSectDesc(pName, pProlog));
192f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
193f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  m_bInOutputSectDesc = true;
194f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
195f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
19637b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ScriptFile::leaveOutputSectDesc(const OutputSectDesc::Epilog& pEpilog) {
197f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(!m_CommandQueue.empty());
198f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(m_bInSectionsCmd);
199f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  SectionsCmd* sections = llvm::cast<SectionsCmd>(back());
200f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
201f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(!sections->empty() && m_bInOutputSectDesc);
202f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  OutputSectDesc* output_desc = llvm::cast<OutputSectDesc>(sections->back());
203f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  output_desc->setEpilog(pEpilog);
204f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
205f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  m_bInOutputSectDesc = false;
206f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
207f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
208f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesvoid ScriptFile::addInputSectDesc(InputSectDesc::KeepPolicy pPolicy,
20937b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                  const InputSectDesc::Spec& pSpec) {
210f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(!m_CommandQueue.empty());
211f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(m_bInSectionsCmd);
212f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  SectionsCmd* sections = llvm::cast<SectionsCmd>(back());
213f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
214f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  assert(!sections->empty() && m_bInOutputSectDesc);
215f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  OutputSectDesc* output_sect = llvm::cast<OutputSectDesc>(sections->back());
216f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
217f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  output_sect->push_back(new InputSectDesc(pPolicy, pSpec, *output_sect));
218f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
219f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
22037b74a387bb3993387029859c2d9d051c41c724eStephen HinesRpnExpr* ScriptFile::createRpnExpr() {
221f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  m_pRpnExpr = RpnExpr::create();
222f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return m_pRpnExpr;
223f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
224f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
22537b74a387bb3993387029859c2d9d051c41c724eStephen HinesStringList* ScriptFile::createStringList() {
226f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  m_pStringList = StringList::create();
227f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return m_pStringList;
228f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
229f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
23037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ScriptFile::setAsNeeded(bool pEnable) {
231f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  m_bAsNeeded = pEnable;
232f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
233f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
234f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesconst std::string& ScriptFile::createParserStr(const char* pText,
23537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                               size_t pLength) {
236f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  bool exist = false;
237f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  ParserStrEntry* entry =
23837b74a387bb3993387029859c2d9d051c41c724eStephen Hines      g_ParserStrPool->insert(std::string(pText, pLength), exist);
239f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  return entry->key();
240f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
241f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
24237b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid ScriptFile::clearParserStrPool() {
243f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines  g_ParserStrPool->clear();
244f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines}
245f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines
24637b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
247