• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- NamePool.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_NAMEPOOL_H
10 #define MCLD_LD_NAMEPOOL_H
11 
12 #include <mcld/Config/Config.h>
13 #include <mcld/ADT/HashTable.h>
14 #include <mcld/ADT/StringHash.h>
15 #include <mcld/ADT/Uncopyable.h>
16 #include <mcld/LD/Resolver.h>
17 #include <mcld/LD/ResolveInfo.h>
18 #include <mcld/Support/GCFactory.h>
19 
20 #include <utility>
21 
22 #include <llvm/ADT/StringRef.h>
23 
24 namespace mcld {
25 
26 class StringTable;
27 class SymbolTableIF;
28 class SectionData;
29 
30 /** \class NamePool
31  *  \brief Store symbol and search symbol by name. Can help symbol resolution.
32  *
33  *  - MCLinker is responsed for creating NamePool.
34  */
35 class NamePool : private Uncopyable
36 {
37 public:
38   typedef HashTable<ResolveInfo, hash::StringHash<hash::DJB> > Table;
39   typedef Table::iterator syminfo_iterator;
40   typedef Table::const_iterator const_syminfo_iterator;
41 
42   typedef GCFactory<ResolveInfo*, 128> FreeInfoSet;
43   typedef FreeInfoSet::iterator freeinfo_iterator;
44   typedef FreeInfoSet::const_iterator const_freeinfo_iterator;
45 
46   typedef size_t size_type;
47 
48 public:
49   explicit NamePool(size_type pSize = 3);
50 
51   ~NamePool();
52 
53   // -----  modifiers  ----- //
54   /// createSymbol - create a symbol but do not insert into the pool.
55   /// The created symbol did not go through the path of symbol resolution.
56   ResolveInfo* createSymbol(const llvm::StringRef& pName,
57                             bool pIsDyn,
58                             ResolveInfo::Type pType,
59                             ResolveInfo::Desc pDesc,
60                             ResolveInfo::Binding pBinding,
61                             ResolveInfo::SizeType pSize,
62                             ResolveInfo::Visibility pVisibility = ResolveInfo::Default);
63 
64   /// insertSymbol - insert a symbol and resolve the symbol immediately
65   /// @param pOldInfo - if pOldInfo is not NULL, the old ResolveInfo being
66   ///                   overriden is kept in pOldInfo.
67   /// @param pResult the result of symbol resultion.
68   /// @note pResult.override is true if the output LDSymbol also need to be
69   ///       overriden
70   void insertSymbol(const llvm::StringRef& pName,
71                     bool pIsDyn,
72                     ResolveInfo::Type pType,
73                     ResolveInfo::Desc pDesc,
74                     ResolveInfo::Binding pBinding,
75                     ResolveInfo::SizeType pSize,
76                     LDSymbol::ValueType pValue,
77                     ResolveInfo::Visibility pVisibility,
78                     ResolveInfo* pOldInfo,
79                     Resolver::Result& pResult);
80 
81   /// findSymbol - find the resolved output LDSymbol
82   const LDSymbol* findSymbol(const llvm::StringRef& pName) const;
83   LDSymbol*       findSymbol(const llvm::StringRef& pName);
84 
85   /// findInfo - find the resolved ResolveInfo
86   const ResolveInfo* findInfo(const llvm::StringRef& pName) const;
87   ResolveInfo*       findInfo(const llvm::StringRef& pName);
88 
89   /// insertString - insert a string
90   /// if the string has existed, modify pString to the existing string
91   /// @return the StringRef points to the hash table
92   llvm::StringRef insertString(const llvm::StringRef& pString);
93 
94   // -----  observers  ----- //
size()95   size_type size() const
96   { return m_Table.numOfEntries(); }
97 
empty()98   bool empty() const
99   { return m_Table.empty(); }
100 
101   // syminfo_iterator - traverse the ResolveInfo in the resolved HashTable
syminfo_begin()102   syminfo_iterator syminfo_begin()
103   { return m_Table.begin(); }
104 
syminfo_end()105   syminfo_iterator syminfo_end()
106   { return m_Table.end(); }
107 
syminfo_begin()108   const_syminfo_iterator syminfo_begin() const
109   { return m_Table.begin(); }
110 
syminfo_end()111   const_syminfo_iterator syminfo_end() const
112   { return m_Table.end(); }
113 
114   // freeinfo_iterator - traverse the ResolveInfo those do not need to be
115   // resolved, for example, local symbols
freeinfo_begin()116   freeinfo_iterator freeinfo_begin()
117   { return m_FreeInfoSet.begin(); }
118 
freeinfo_end()119   freeinfo_iterator freeinfo_end()
120   { return m_FreeInfoSet.end(); }
121 
freeinfo_begin()122   const_freeinfo_iterator freeinfo_begin() const
123   { return m_FreeInfoSet.begin(); }
124 
freeinfo_end()125   const_freeinfo_iterator freeinfo_end() const
126   { return m_FreeInfoSet.end(); }
127 
128   // -----  capacity  ----- //
129   void reserve(size_type pN);
130 
131   size_type capacity() const;
132 
133 private:
134   Resolver* m_pResolver;
135   Table m_Table;
136   FreeInfoSet m_FreeInfoSet;
137 };
138 
139 } // namespace of mcld
140 
141 #endif
142 
143