Home | History | Annotate | Download | only in LD
      1 //===- SectionSymbolSet.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/SectionSymbolSet.h>
     10 #include <mcld/LD/LDSection.h>
     11 #include <mcld/LD/RelocData.h>
     12 #include <mcld/LD/SectionData.h>
     13 #include <mcld/LD/EhFrame.h>
     14 #include <mcld/LD/ResolveInfo.h>
     15 #include <mcld/LD/LDSymbol.h>
     16 #include <mcld/LD/NamePool.h>
     17 #include <mcld/Fragment/FragmentRef.h>
     18 #include <mcld/LD/LDFileFormat.h>
     19 
     20 
     21 using namespace mcld;
     22 
     23 //===----------------------------------------------------------------------===//
     24 // SectionSymbolSet
     25 //===----------------------------------------------------------------------===//
     26 
     27 SectionSymbolSet::SectionSymbolSet()
     28 {
     29   m_pSectionSymbolMap = new SectHashTableType(16);
     30 }
     31 
     32 SectionSymbolSet::~SectionSymbolSet()
     33 {
     34   delete m_pSectionSymbolMap;
     35 }
     36 
     37 bool SectionSymbolSet::add(LDSection& pOutSect, NamePool& pNamePool)
     38 {
     39   // create the resolveInfo for this section symbol
     40   llvm::StringRef sym_name = llvm::StringRef(pOutSect.name());
     41   ResolveInfo* sym_info = pNamePool.createSymbol(sym_name,
     42                                                  false,
     43                                                  ResolveInfo::Section,
     44                                                  ResolveInfo::Define,
     45                                                  ResolveInfo::Local,
     46                                                  0x0, // size
     47                                                  ResolveInfo::Default);
     48 
     49   // create the output section symbol and set its fragRef to the first fragment
     50   // of the section
     51   LDSymbol* sym = LDSymbol::Create(*sym_info);
     52   sym_info->setSymPtr(sym);
     53 
     54   // insert the symbol to the Section to Symbol hash map
     55   bool exist = false;
     56   SectHashTableType::entry_type* entry =
     57                             m_pSectionSymbolMap->insert(&pOutSect, exist);
     58   assert(!exist);
     59   entry->setValue(sym);
     60 
     61   return true;
     62 }
     63 
     64 bool SectionSymbolSet::finalize(LDSection& pOutSect,
     65                                 SymbolTable& pSymTab, bool relocatable)
     66 {
     67   if (!relocatable && pOutSect.size() == 0)
     68       return true;
     69 
     70   LDSymbol* sym = get(pOutSect);
     71   assert(NULL != sym);
     72   SectionData* data = NULL;
     73   switch (pOutSect.kind()) {
     74     case LDFileFormat::Relocation:
     75       // Relocation section should not have section symbol.
     76       return true;
     77 
     78     case LDFileFormat::EhFrame:
     79       if (EhFrame *ehframe = pOutSect.getEhFrame())
     80           data = ehframe->getSectionData();
     81       break;
     82 
     83     default:
     84       data = pOutSect.getSectionData();
     85       break;
     86   }
     87   FragmentRef* frag_ref;
     88   if (data && !data->empty())
     89     frag_ref = FragmentRef::Create(data->front(), 0x0);
     90   else
     91     frag_ref = FragmentRef::Null();
     92   sym->setFragmentRef(frag_ref);
     93   // push symbol into output symbol table
     94   pSymTab.add(*sym);
     95 
     96   return true;
     97 }
     98 
     99 LDSymbol* SectionSymbolSet::get(const LDSection& pOutSect)
    100 {
    101   SectHashTableType::iterator entry = m_pSectionSymbolMap->find(&pOutSect);
    102   return entry.getEntry()->value();
    103 }
    104 
    105 const LDSymbol* SectionSymbolSet::get(const LDSection& pOutSect) const
    106 {
    107   SectHashTableType::iterator entry = m_pSectionSymbolMap->find(&pOutSect);
    108   return entry.getEntry()->value();
    109 }
    110 
    111