Home | History | Annotate | Download | only in LD
      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 
     14 using namespace mcld;
     15 
     16 //===----------------------------------------------------------------------===//
     17 // LDContext
     18 //===----------------------------------------------------------------------===//
     19 LDContext& 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 
     28 LDSection* LDContext::getSection(unsigned int pIdx)
     29 {
     30   if (pIdx >= m_SectionTable.size())
     31     return NULL;
     32   return m_SectionTable[pIdx];
     33 }
     34 
     35 const LDSection* LDContext::getSection(unsigned int pIdx) const
     36 {
     37   if (pIdx >= m_SectionTable.size())
     38     return NULL;
     39   return m_SectionTable[pIdx];
     40 }
     41 
     42 LDSection* 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 
     52 const 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 
     62 size_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 
     72 LDSymbol* LDContext::getSymbol(unsigned int pIdx)
     73 {
     74   if (pIdx >= m_SymTab.size())
     75     return NULL;
     76   return m_SymTab[pIdx];
     77 }
     78 
     79 const 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 
     87 LDSymbol* 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 
     97 const 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