• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
19 class LDSection;
20 class NamePool;
21 class LDSymbol;
22 
23 /** \class SectionSymbolSet
24  *  \brief SectionSymbolSet contains the section symbols defined by linker for
25  *   the output sections
26  */
27 class SectionSymbolSet
28 {
29 public:
30   typedef SymbolCategory SymbolTable;
31 
32 public:
33   SectionSymbolSet();
34   ~SectionSymbolSet();
35 
36   /// add - create and add an section symbol for the output
37   /// LDSection
38   bool add(LDSection& pOutSect, NamePool& pNamePool);
39 
40   /// finalize - set section symbols' fragmentRef and push it into the output
41   /// symbol table
42   bool finalize(LDSection& pOutSect, SymbolTable& pSymTab, bool relocatable);
43 
44   /// get - get the section symbol for section pOutpSect
45   LDSymbol* get(const LDSection& pOutSect);
46   const LDSymbol* get(const LDSection& pOutSect) const;
47 
48 private:
49   /// sectCompare - hash compare function for LDSection*
50   struct SectCompare
51   {
operatorSectCompare52     bool operator()(const LDSection* X, const LDSection* Y) const
53     { return (X==Y); }
54   };
55 
56   /// SectPtrHash - hash function for LDSection*
57   struct SectPtrHash
58   {
operatorSectPtrHash59     size_t operator()(const LDSection* pKey) const
60     {
61       return (unsigned((uintptr_t)pKey) >> 4) ^
62              (unsigned((uintptr_t)pKey) >> 9);
63     }
64   };
65 
66   typedef HashEntry<const LDSection*, LDSymbol*, SectCompare> SectHashEntryType;
67   typedef HashTable<SectHashEntryType,
68                     SectPtrHash,
69                     EntryFactory<SectHashEntryType> > SectHashTableType;
70 
71 private:
72   SectHashTableType* m_pSectionSymbolMap;
73 };
74 
75 } // namespace of mcld
76 
77 #endif
78 
79