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