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//===----------------------------------------------------------------------===// 9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#ifndef MCLD_NAME_POOL_H 10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#define MCLD_NAME_POOL_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#ifdef ENABLE_UNITTEST 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <gtest.h> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 15cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <utility> 16cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/ADT/StringRef.h> 18cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/ADT/HashTable.h> 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/ADT/StringHash.h> 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/ADT/Uncopyable.h> 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/ResolveInfo.h> 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/Resolver.h> 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <mcld/LD/ResolveInfoFactory.h> 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Resolver; 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass StringTable; 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass SymbolTableIF; 32cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass SectionData; 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 34affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class NamePool 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief Store symbol and search symbol by name. Can help symbol resolution. 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 37affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * - MCLinker is responsed for creating NamePool. 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 39affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass NamePool : private Uncopyable 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef HashTable<ResolveInfo, StringHash<ELF>, ResolveInfoFactory> Table; 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef size_t size_type; 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 46affc150dc44fab1911775a49636d0ce85333b634Zonr Chang NamePool(const Resolver& pResolver, size_type pSize = 3); 47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ~NamePool(); 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- modifiers ----- // 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// createSymbol - create a symbol but do not insert into the pool. 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo* createSymbol(const llvm::StringRef& pName, 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool pIsDyn, 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Type pType, 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Desc pDesc, 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Binding pBinding, 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::SizeType pSize, 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Visibility pVisibility = ResolveInfo::Default); 58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// insertSymbol - insert a symbol and resolve the symbol immediately 605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param pOldInfo - if pOldInfo is not NULL, the old ResolveInfo being 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// overriden is kept in pOldInfo. 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param pResult the result of symbol resultion. 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @note pResult.override is true if the output LDSymbol also need to be 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// overriden 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void insertSymbol(const llvm::StringRef& pName, 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool pIsDyn, 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Type pType, 685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Desc pDesc, 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Binding pBinding, 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::SizeType pSize, 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Visibility pVisibility, 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo* pOldInfo, 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Resolver::Result& pResult); 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// findSymbol - find the resolved output LDSymbol 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao LDSymbol* findSymbol(const llvm::StringRef& pName); 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const LDSymbol* findSymbol(const llvm::StringRef& pName) const; 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// findInfo - find the resolved ResolveInfo 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo* findInfo(const llvm::StringRef& pName); 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const ResolveInfo* findInfo(const llvm::StringRef& pName) const; 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// insertString - insert a string 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// if the string has existed, modify pString to the existing string 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @return the StringRef points to the hash table 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::StringRef insertString(const llvm::StringRef& pString); 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- observers ----- // 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_type size() const 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Table.numOfEntries(); } 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool empty() const 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Table.empty(); } 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- capacity ----- // 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void reserve(size_type pN); 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_type capacity() const; 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 101affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const Resolver* m_pResolver; 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Table m_Table; 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 110