NamePool.h revision 5460a1f25d9ddecb5c70667267d66d51af177a99
15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- StrSymPool.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//===----------------------------------------------------------------------===// 95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifndef MCLD_STRING_SYMBOL_POOL_H 105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#define MCLD_STRING_SYMBOL_POOL_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/StringRef.h> 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/ADT/HashTable.h> 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/ADT/StringHash.h> 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/ADT/Uncopyable.h> 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/ResolveInfo.h> 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/Resolver.h> 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/ResolveInfoFactory.h> 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <utility> 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace llvm 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao class MCSectionData; 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Resolver; 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass StringTable; 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass SymbolTableIF; 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/** \class StrSymPool 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief Store symbol and search symbol by name. Can help symbol resolution. 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * - MCLinker is responsed for creating StrSymPool. 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass StrSymPool : private Uncopyable 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef HashTable<ResolveInfo, StringHash<ELF>, ResolveInfoFactory> Table; 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef size_t size_type; 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao StrSymPool(const Resolver& pResolver, size_type pSize = 3); 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ~StrSymPool(); 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- modifiers ----- // 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// createSymbol - create a symbol but do not insert into the pool. 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo* createSymbol(const llvm::StringRef& pName, 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool pIsDyn, 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Type pType, 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Desc pDesc, 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Binding pBinding, 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::SizeType pSize, 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Visibility pVisibility = ResolveInfo::Default); 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// insertSymbol - insert a symbol and resolve the symbol immediately 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param pOldInfo - if pOldInfo is not NULL, the old ResolveInfo being 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// overriden is kept in pOldInfo. 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param pResult the result of symbol resultion. 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @note pResult.override is true if the output LDSymbol also need to be 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// overriden 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void insertSymbol(const llvm::StringRef& pName, 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool pIsDyn, 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Type pType, 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Desc pDesc, 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Binding pBinding, 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::SizeType pSize, 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 LDSymbol* findSymbol(const llvm::StringRef& pName); 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const LDSymbol* findSymbol(const llvm::StringRef& pName) const; 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// findInfo - find the resolved ResolveInfo 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo* findInfo(const llvm::StringRef& pName); 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const ResolveInfo* findInfo(const llvm::StringRef& pName) const; 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 ----- // 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_type size() const 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Table.numOfEntries(); } 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool empty() const 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Table.empty(); } 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- capacity ----- // 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void reserve(size_type pN); 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_type capacity() const; 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Resolver* m_pResolver; 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Table m_Table; 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 112