LDContext.cpp revision 22add6ff3426df1a85089fe6a6e1597ee3b6f300
1//===- LDContext.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/LD/LDContext.h>
10#include <mcld/LD/LDSection.h>
11#include <mcld/LD/LDSymbol.h>
12#include <llvm/ADT/StringRef.h>
13
14using namespace mcld;
15
16//===----------------------------------------------------------------------===//
17// LDContext
18//===----------------------------------------------------------------------===//
19LDContext& LDContext::appendSection(LDSection& pSection)
20{
21  if (LDFileFormat::Relocation == pSection.kind())
22    m_RelocSections.push_back(&pSection);
23  pSection.setIndex(m_SectionTable.size());
24  m_SectionTable.push_back(&pSection);
25  return *this;
26}
27
28LDSection* LDContext::getSection(unsigned int pIdx)
29{
30  if (pIdx >= m_SectionTable.size())
31    return NULL;
32  return m_SectionTable[pIdx];
33}
34
35const LDSection* LDContext::getSection(unsigned int pIdx) const
36{
37  if (pIdx >= m_SectionTable.size())
38    return NULL;
39  return m_SectionTable[pIdx];
40}
41
42LDSection* LDContext::getSection(const std::string& pName)
43{
44  sect_iterator sect_iter, sect_end = sectEnd();
45  for (sect_iter = sectBegin(); sect_iter != sect_end; ++sect_iter) {
46    if(NULL != *sect_iter && (*sect_iter)->name() == pName)
47      return *sect_iter;
48  }
49  return NULL;
50}
51
52const LDSection* LDContext::getSection(const std::string& pName) const
53{
54  const_sect_iterator sect_iter, sect_end = sectEnd();
55  for (sect_iter = sectBegin(); sect_iter != sect_end; ++sect_iter) {
56    if(NULL != *sect_iter && (*sect_iter)->name() == pName)
57      return *sect_iter;
58  }
59  return NULL;
60}
61
62size_t LDContext::getSectionIdx(const std::string& pName) const
63{
64  size_t result = 1;
65  size_t size = m_SectionTable.size();
66  for (; result != size; ++result)
67    if (m_SectionTable[result]->name() == pName)
68      return result;
69  return 0;
70}
71
72LDSymbol* LDContext::getSymbol(unsigned int pIdx)
73{
74  if (pIdx >= m_SymTab.size())
75    return NULL;
76  return m_SymTab[pIdx];
77}
78
79const LDSymbol* LDContext::getSymbol(unsigned int pIdx) const
80{
81  if (pIdx >= m_SymTab.size())
82    return NULL;
83  return m_SymTab[pIdx];
84}
85
86
87LDSymbol* LDContext::getSymbol(const llvm::StringRef& pName)
88{
89  size_t sym = 1;
90  size_t size = m_SymTab.size();
91  for (; sym < size; ++sym)
92    if (m_SymTab[sym]->name() == pName)
93      return m_SymTab[sym];
94  return NULL;
95}
96
97const LDSymbol* LDContext::getSymbol(const llvm::StringRef& pName) const
98{
99  size_t sym = 1;
100  size_t size = m_SymTab.size();
101  for (; sym < size; ++sym)
102    if (m_SymTab[sym]->name() == pName)
103      return m_SymTab[sym];
104  return NULL;
105}
106