1affc150dc44fab1911775a49636d0ce85333b634Zonr Chang//===- NamePool.h ---------------------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_LD_NAMEPOOL_H_ 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LD_NAMEPOOL_H_ 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/ADT/HashTable.h" 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/ADT/StringHash.h" 1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Config/Config.h" 1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/ResolveInfo.h" 1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LD/Resolver.h" 1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Compiler.h" 1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/GCFactory.h" 196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <llvm/ADT/StringRef.h> 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <utility> 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 26affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class NamePool 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief Store symbol and search symbol by name. Can help symbol resolution. 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 29affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * - MCLinker is responsed for creating NamePool. 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 3137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass NamePool { 3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 3387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef HashTable<ResolveInfo, hash::StringHash<hash::DJB> > Table; 3487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef Table::iterator syminfo_iterator; 3587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef Table::const_iterator const_syminfo_iterator; 3687f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 3787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef GCFactory<ResolveInfo*, 128> FreeInfoSet; 3887f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef FreeInfoSet::iterator freeinfo_iterator; 3987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines typedef FreeInfoSet::const_iterator const_freeinfo_iterator; 4087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef size_t size_type; 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines public: 4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao explicit NamePool(size_type pSize = 3); 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ~NamePool(); 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- modifiers ----- // 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// createSymbol - create a symbol but do not insert into the pool. 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// The created symbol did not go through the path of symbol resolution. 5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo* createSymbol( 5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines const llvm::StringRef& pName, 5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool pIsDyn, 5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Type pType, 5537b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Desc pDesc, 5637b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Binding pBinding, 5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::SizeType pSize, 5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo::Visibility pVisibility = ResolveInfo::Default); 5987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// insertSymbol - insert a symbol and resolve the symbol immediately 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param pOldInfo - if pOldInfo is not NULL, the old ResolveInfo being 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// overriden is kept in pOldInfo. 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param pResult the result of symbol resultion. 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @note pResult.override is true if the output LDSymbol also need to be 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// overriden 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void insertSymbol(const llvm::StringRef& pName, 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool pIsDyn, 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Type pType, 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Desc pDesc, 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Binding pBinding, 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::SizeType pSize, 7287f34658dec9097d987d254a990ea7f311bfc95fStephen Hines LDSymbol::ValueType pValue, 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Visibility pVisibility, 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo* pOldInfo, 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Resolver::Result& pResult); 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// findSymbol - find the resolved output LDSymbol 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const LDSymbol* findSymbol(const llvm::StringRef& pName) const; 7937b74a387bb3993387029859c2d9d051c41c724eStephen Hines LDSymbol* findSymbol(const llvm::StringRef& pName); 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// findInfo - find the resolved ResolveInfo 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const ResolveInfo* findInfo(const llvm::StringRef& pName) const; 8337b74a387bb3993387029859c2d9d051c41c724eStephen Hines ResolveInfo* findInfo(const llvm::StringRef& pName); 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// insertString - insert a string 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// if the string has existed, modify pString to the existing string 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @return the StringRef points to the hash table 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::StringRef insertString(const llvm::StringRef& pString); 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- observers ----- // 9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines size_type size() const { return m_Table.numOfEntries(); } 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 9337b74a387bb3993387029859c2d9d051c41c724eStephen Hines bool empty() const { return m_Table.empty(); } 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 9587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // syminfo_iterator - traverse the ResolveInfo in the resolved HashTable 9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines syminfo_iterator syminfo_begin() { return m_Table.begin(); } 9787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 9837b74a387bb3993387029859c2d9d051c41c724eStephen Hines syminfo_iterator syminfo_end() { return m_Table.end(); } 9987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines const_syminfo_iterator syminfo_begin() const { return m_Table.begin(); } 10187f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10237b74a387bb3993387029859c2d9d051c41c724eStephen Hines const_syminfo_iterator syminfo_end() const { return m_Table.end(); } 10387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10487f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // freeinfo_iterator - traverse the ResolveInfo those do not need to be 10587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines // resolved, for example, local symbols 10637b74a387bb3993387029859c2d9d051c41c724eStephen Hines freeinfo_iterator freeinfo_begin() { return m_FreeInfoSet.begin(); } 10787f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 10837b74a387bb3993387029859c2d9d051c41c724eStephen Hines freeinfo_iterator freeinfo_end() { return m_FreeInfoSet.end(); } 10987f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11037b74a387bb3993387029859c2d9d051c41c724eStephen Hines const_freeinfo_iterator freeinfo_begin() const { 11137b74a387bb3993387029859c2d9d051c41c724eStephen Hines return m_FreeInfoSet.begin(); 11237b74a387bb3993387029859c2d9d051c41c724eStephen Hines } 11387f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 11437b74a387bb3993387029859c2d9d051c41c724eStephen Hines const_freeinfo_iterator freeinfo_end() const { return m_FreeInfoSet.end(); } 11587f34658dec9097d987d254a990ea7f311bfc95fStephen Hines 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- capacity ----- // 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void reserve(size_type pN); 1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_type capacity() const; 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12137b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Resolver* m_pResolver; 1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Table m_Table; 1246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines FreeInfoSet m_FreeInfoSet; 1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12637b74a387bb3993387029859c2d9d051c41c724eStephen Hines private: 12737b74a387bb3993387029859c2d9d051c41c724eStephen Hines DISALLOW_COPY_AND_ASSIGN(NamePool); 12837b74a387bb3993387029859c2d9d051c41c724eStephen Hines}; 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 13037b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 131affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 13237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif // MCLD_LD_NAMEPOOL_H_ 133