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 156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Config/Config.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/Resolver.h> 2022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LD/ResolveInfo.h> 216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Support/GCFactory.h> 226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <utility> 246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <llvm/ADT/StringRef.h> 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld { 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass StringTable; 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass SymbolTableIF; 31cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass SectionData; 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 33affc150dc44fab1911775a49636d0ce85333b634Zonr Chang/** \class NamePool 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * \brief Store symbol and search symbol by name. Can help symbol resolution. 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao * 36affc150dc44fab1911775a49636d0ce85333b634Zonr Chang * - MCLinker is responsed for creating NamePool. 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao */ 38affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass NamePool : private Uncopyable 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 41f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines typedef HashTable<ResolveInfo, hash::StringHash<hash::ELF> > Table; 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef size_t size_type; 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao explicit NamePool(size_type pSize = 3); 4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 47affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ~NamePool(); 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- modifiers ----- // 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// createSymbol - create a symbol but do not insert into the pool. 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// The created symbol did not go through the path of symbol resolution. 525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo* createSymbol(const llvm::StringRef& pName, 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool pIsDyn, 545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Type pType, 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Desc pDesc, 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Binding pBinding, 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::SizeType pSize, 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Visibility pVisibility = ResolveInfo::Default); 59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 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, 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo::Visibility pVisibility, 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ResolveInfo* pOldInfo, 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Resolver::Result& pResult); 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// findSymbol - find the resolved output LDSymbol 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const LDSymbol* findSymbol(const llvm::StringRef& pName) const; 7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LDSymbol* findSymbol(const llvm::StringRef& pName); 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// findInfo - find the resolved ResolveInfo 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const ResolveInfo* findInfo(const llvm::StringRef& pName) const; 8222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao ResolveInfo* findInfo(const llvm::StringRef& pName); 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// insertString - insert a string 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// if the string has existed, modify pString to the existing string 865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @return the StringRef points to the hash table 875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::StringRef insertString(const llvm::StringRef& pString); 885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- observers ----- // 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_type size() const 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Table.numOfEntries(); } 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao bool empty() const 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao { return m_Table.empty(); } 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // ----- capacity ----- // 975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao void reserve(size_type pN); 985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao size_type capacity() const; 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 1026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines typedef GCFactory<ResolveInfo*, 128> FreeInfoSet; 1036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines 1046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesprivate: 10522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Resolver* m_pResolver; 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Table m_Table; 1076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines FreeInfoSet m_FreeInfoSet; 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of mcld 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 114