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 15 namespace mcld { 16 17 //===----------------------------------------------------------------------===// 18 // LDContext 19 //===----------------------------------------------------------------------===// 20 LDContext& 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 28 LDSection* LDContext::getSection(unsigned int pIdx) { 29 if (pIdx >= m_SectionTable.size()) 30 return NULL; 31 return m_SectionTable[pIdx]; 32 } 33 34 const LDSection* LDContext::getSection(unsigned int pIdx) const { 35 if (pIdx >= m_SectionTable.size()) 36 return NULL; 37 return m_SectionTable[pIdx]; 38 } 39 40 LDSection* 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 49 const 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 58 size_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 67 LDSymbol* LDContext::getSymbol(unsigned int pIdx) { 68 if (pIdx >= m_SymTab.size()) 69 return NULL; 70 return m_SymTab[pIdx]; 71 } 72 73 const LDSymbol* LDContext::getSymbol(unsigned int pIdx) const { 74 if (pIdx >= m_SymTab.size()) 75 return NULL; 76 return m_SymTab[pIdx]; 77 } 78 79 LDSymbol* 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 88 const 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