1 //===- SectionSymbolSet.h -------------------------------------------------===//
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 #ifndef MCLD_LD_SECTIONSYMBOLSET_H_
10 #define MCLD_LD_SECTIONSYMBOLSET_H_
11 
12 #include "mcld/ADT/HashTable.h"
13 #include "mcld/ADT/HashEntry.h"
14 #include "mcld/MC/SymbolCategory.h"
15 
16 namespace mcld {
17 
18 class LDSection;
19 class NamePool;
20 class LDSymbol;
21 
22 /** \class SectionSymbolSet
23  *  \brief SectionSymbolSet contains the section symbols defined by linker for
24  *   the output sections
25  */
26 class SectionSymbolSet {
27  public:
28   typedef SymbolCategory SymbolTable;
29 
30  public:
31   SectionSymbolSet();
32   ~SectionSymbolSet();
33 
34   /// add - create and add an section symbol for the output
35   /// LDSection
36   bool add(LDSection& pOutSect, NamePool& pNamePool);
37 
38   /// finalize - set section symbols' fragmentRef and push it into the output
39   /// symbol table
40   bool finalize(LDSection& pOutSect, SymbolTable& pSymTab, bool relocatable);
41 
42   /// get - get the section symbol for section pOutpSect
43   LDSymbol* get(const LDSection& pOutSect);
44   const LDSymbol* get(const LDSection& pOutSect) const;
45 
46  private:
47   /// sectCompare - hash compare function for LDSection*
48   struct SectCompare {
operatorSectCompare49     bool operator()(const LDSection* X, const LDSection* Y) const {
50       return (X == Y);
51     }
52   };
53 
54   /// SectPtrHash - hash function for LDSection*
55   struct SectPtrHash {
operatorSectPtrHash56     size_t operator()(const LDSection* pKey) const {
57       return (unsigned((uintptr_t)pKey) >> 4) ^
58              (unsigned((uintptr_t)pKey) >> 9);
59     }
60   };
61 
62   typedef HashEntry<const LDSection*, LDSymbol*, SectCompare> SectHashEntryType;
63   typedef HashTable<SectHashEntryType,
64                     SectPtrHash,
65                     EntryFactory<SectHashEntryType> > SectHashTableType;
66 
67  private:
68   SectHashTableType* m_pSectionSymbolMap;
69 };
70 
71 }  // namespace mcld
72 
73 #endif  // MCLD_LD_SECTIONSYMBOLSET_H_
74