• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
SectionSymbolSet()27 SectionSymbolSet::SectionSymbolSet()
28 {
29   m_pSectionSymbolMap = new SectHashTableType(16);
30 }
31 
~SectionSymbolSet()32 SectionSymbolSet::~SectionSymbolSet()
33 {
34   delete m_pSectionSymbolMap;
35 }
36 
add(LDSection & pOutSect,NamePool & pNamePool)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 
finalize(LDSection & pOutSect,SymbolTable & pSymTab,bool relocatable)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 
get(const LDSection & pOutSect)99 LDSymbol* SectionSymbolSet::get(const LDSection& pOutSect)
100 {
101   SectHashTableType::iterator entry = m_pSectionSymbolMap->find(&pOutSect);
102   return entry.getEntry()->value();
103 }
104 
get(const LDSection & pOutSect) const105 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