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
13#include <llvm/ADT/StringRef.h>
14
15namespace mcld {
16
17//===----------------------------------------------------------------------===//
18// LDContext
19//===----------------------------------------------------------------------===//
20LDContext& LDContext::appendSection(LDSection& pSection) {
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  if (pIdx >= m_SectionTable.size())
30    return NULL;
31  return m_SectionTable[pIdx];
32}
33
34const LDSection* LDContext::getSection(unsigned int pIdx) const {
35  if (pIdx >= m_SectionTable.size())
36    return NULL;
37  return m_SectionTable[pIdx];
38}
39
40LDSection* LDContext::getSection(const std::string& pName) {
41  sect_iterator sect_iter, sect_end = sectEnd();
42  for (sect_iter = sectBegin(); sect_iter != sect_end; ++sect_iter) {
43    if (*sect_iter != NULL && (*sect_iter)->name() == pName)
44      return *sect_iter;
45  }
46  return NULL;
47}
48
49const LDSection* LDContext::getSection(const std::string& pName) const {
50  const_sect_iterator sect_iter, sect_end = sectEnd();
51  for (sect_iter = sectBegin(); sect_iter != sect_end; ++sect_iter) {
52    if (*sect_iter != NULL && (*sect_iter)->name() == pName)
53      return *sect_iter;
54  }
55  return NULL;
56}
57
58size_t LDContext::getSectionIdx(const std::string& pName) const {
59  size_t result = 1;
60  size_t size = m_SectionTable.size();
61  for (; result != size; ++result)
62    if (m_SectionTable[result]->name() == pName)
63      return result;
64  return 0;
65}
66
67LDSymbol* LDContext::getSymbol(unsigned int pIdx) {
68  if (pIdx >= m_SymTab.size())
69    return NULL;
70  return m_SymTab[pIdx];
71}
72
73const LDSymbol* LDContext::getSymbol(unsigned int pIdx) const {
74  if (pIdx >= m_SymTab.size())
75    return NULL;
76  return m_SymTab[pIdx];
77}
78
79LDSymbol* LDContext::getSymbol(const llvm::StringRef& pName) {
80  size_t sym = 1;
81  size_t size = m_SymTab.size();
82  for (; sym < size; ++sym)
83    if (m_SymTab[sym]->name() == pName)
84      return m_SymTab[sym];
85  return NULL;
86}
87
88const LDSymbol* LDContext::getSymbol(const llvm::StringRef& pName) const {
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
97}  // namespace mcld
98