NamePool.h revision affc150dc44fab1911775a49636d0ce85333b634
1//===- NamePool.h ---------------------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9#ifndef MCLD_NAME_POOL_H
10#define MCLD_NAME_POOL_H
11#ifdef ENABLE_UNITTEST
12#include <gtest.h>
13#endif
14
15#include <llvm/ADT/StringRef.h>
16#include <mcld/ADT/HashTable.h>
17#include <mcld/ADT/StringHash.h>
18#include <mcld/ADT/Uncopyable.h>
19#include <mcld/LD/ResolveInfo.h>
20#include <mcld/LD/Resolver.h>
21#include <mcld/LD/ResolveInfoFactory.h>
22#include <utility>
23
24namespace llvm
25{
26  class MCSectionData;
27}
28
29namespace mcld
30{
31
32class Resolver;
33class StringTable;
34class SymbolTableIF;
35
36/** \class NamePool
37 *  \brief Store symbol and search symbol by name. Can help symbol resolution.
38 *
39 *  - MCLinker is responsed for creating NamePool.
40 */
41class NamePool : private Uncopyable
42{
43public:
44  typedef HashTable<ResolveInfo, StringHash<ELF>, ResolveInfoFactory> Table;
45  typedef size_t size_type;
46
47public:
48  NamePool(const Resolver& pResolver, size_type pSize = 3);
49  ~NamePool();
50
51  // -----  modifiers  ----- //
52  /// createSymbol - create a symbol but do not insert into the pool.
53  ResolveInfo* createSymbol(const llvm::StringRef& pName,
54                            bool pIsDyn,
55                            ResolveInfo::Type pType,
56                            ResolveInfo::Desc pDesc,
57                            ResolveInfo::Binding pBinding,
58                            ResolveInfo::SizeType pSize,
59                            ResolveInfo::Visibility pVisibility = ResolveInfo::Default);
60
61  /// insertSymbol - insert a symbol and resolve the symbol immediately
62  /// @param pOldInfo - if pOldInfo is not NULL, the old ResolveInfo being
63  ///                   overriden is kept in pOldInfo.
64  /// @param pResult the result of symbol resultion.
65  /// @note pResult.override is true if the output LDSymbol also need to be
66  ///       overriden
67  void insertSymbol(const llvm::StringRef& pName,
68                    bool pIsDyn,
69                    ResolveInfo::Type pType,
70                    ResolveInfo::Desc pDesc,
71                    ResolveInfo::Binding pBinding,
72                    ResolveInfo::SizeType pSize,
73                    ResolveInfo::Visibility pVisibility,
74                    ResolveInfo* pOldInfo,
75                    Resolver::Result& pResult);
76
77  /// findSymbol - find the resolved output LDSymbol
78  LDSymbol* findSymbol(const llvm::StringRef& pName);
79  const LDSymbol* findSymbol(const llvm::StringRef& pName) const;
80
81  /// findInfo - find the resolved ResolveInfo
82  ResolveInfo* findInfo(const llvm::StringRef& pName);
83  const ResolveInfo* findInfo(const llvm::StringRef& pName) const;
84
85  /// insertString - insert a string
86  /// if the string has existed, modify pString to the existing string
87  /// @return the StringRef points to the hash table
88  llvm::StringRef insertString(const llvm::StringRef& pString);
89
90  // -----  observers  ----- //
91  size_type size() const
92  { return m_Table.numOfEntries(); }
93
94  bool empty() const
95  { return m_Table.empty(); }
96
97  // -----  capacity  ----- //
98  void reserve(size_type pN);
99
100  size_type capacity() const;
101
102private:
103  const Resolver* m_pResolver;
104  Table m_Table;
105
106};
107
108} // namespace of mcld
109
110#endif
111
112