| //===- LDContext.cpp ------------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #include <mcld/LD/LDContext.h> |
| #include <mcld/LD/LDSection.h> |
| #include <mcld/LD/LDSymbol.h> |
| #include <llvm/ADT/StringRef.h> |
| |
| using namespace mcld; |
| |
| //===----------------------------------------------------------------------===// |
| // LDContext |
| //===----------------------------------------------------------------------===// |
| LDContext& LDContext::appendSection(LDSection& pSection) |
| { |
| if (LDFileFormat::Relocation == pSection.kind()) |
| m_RelocSections.push_back(&pSection); |
| pSection.setIndex(m_SectionTable.size()); |
| m_SectionTable.push_back(&pSection); |
| return *this; |
| } |
| |
| LDSection* LDContext::getSection(unsigned int pIdx) |
| { |
| if (pIdx >= m_SectionTable.size()) |
| return NULL; |
| return m_SectionTable[pIdx]; |
| } |
| |
| const LDSection* LDContext::getSection(unsigned int pIdx) const |
| { |
| if (pIdx >= m_SectionTable.size()) |
| return NULL; |
| return m_SectionTable[pIdx]; |
| } |
| |
| LDSection* LDContext::getSection(const std::string& pName) |
| { |
| sect_iterator sect_iter, sect_end = sectEnd(); |
| for (sect_iter = sectBegin(); sect_iter != sect_end; ++sect_iter) { |
| if(NULL != *sect_iter && (*sect_iter)->name() == pName) |
| return *sect_iter; |
| } |
| return NULL; |
| } |
| |
| const LDSection* LDContext::getSection(const std::string& pName) const |
| { |
| const_sect_iterator sect_iter, sect_end = sectEnd(); |
| for (sect_iter = sectBegin(); sect_iter != sect_end; ++sect_iter) { |
| if(NULL != *sect_iter && (*sect_iter)->name() == pName) |
| return *sect_iter; |
| } |
| return NULL; |
| } |
| |
| size_t LDContext::getSectionIdx(const std::string& pName) const |
| { |
| size_t result = 1; |
| size_t size = m_SectionTable.size(); |
| for (; result != size; ++result) |
| if (m_SectionTable[result]->name() == pName) |
| return result; |
| return 0; |
| } |
| |
| LDSymbol* LDContext::getSymbol(unsigned int pIdx) |
| { |
| if (pIdx >= m_SymTab.size()) |
| return NULL; |
| return m_SymTab[pIdx]; |
| } |
| |
| const LDSymbol* LDContext::getSymbol(unsigned int pIdx) const |
| { |
| if (pIdx >= m_SymTab.size()) |
| return NULL; |
| return m_SymTab[pIdx]; |
| } |
| |
| |
| LDSymbol* LDContext::getSymbol(const llvm::StringRef& pName) |
| { |
| size_t sym = 1; |
| size_t size = m_SymTab.size(); |
| for (; sym < size; ++sym) |
| if (m_SymTab[sym]->name() == pName) |
| return m_SymTab[sym]; |
| return NULL; |
| } |
| |
| const LDSymbol* LDContext::getSymbol(const llvm::StringRef& pName) const |
| { |
| size_t sym = 1; |
| size_t size = m_SymTab.size(); |
| for (; sym < size; ++sym) |
| if (m_SymTab[sym]->name() == pName) |
| return m_SymTab[sym]; |
| return NULL; |
| } |