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