1cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===- Archive.h ----------------------------------------------------------===//
2cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//
3cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//                     The MCLinker Project
4cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//
5cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao// This file is distributed under the University of Illinois Open Source
6cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao// License. See LICENSE.TXT for details.
7cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//
8cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===//
9cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#ifndef MCLD_ARCHIVE_H
10cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#define MCLD_ARCHIVE_H
11cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#ifdef ENABLE_UNITTEST
12cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <gtest.h>
13cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#endif
14cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
15cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/ADT/HashEntry.h>
16cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/ADT/HashTable.h>
17cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/ADT/StringHash.h>
18cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/Support/GCFactory.h>
19cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <mcld/MC/InputTree.h>
20cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
21cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <vector>
22cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <string>
23cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
24cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaonamespace mcld
25cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
26cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass InputTree;
27cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass Input;
28cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
29cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/** \class Archive
30cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao *  \brief This class define the interfacee to Archive files
31cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao */
32cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass Archive
33cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
34cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaopublic:
35cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  static const char   MAGIC[];             ///< magic string
36cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  static const char   THIN_MAGIC[];        ///< magic of thin archive
37cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  static const size_t MAGIC_LEN;           ///< length of magic string
38cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  static const char   SVR4_SYMTAB_NAME[];  ///< SVR4 symtab entry name
39cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  static const char   STRTAB_NAME[];       ///< Name of string table
40cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  static const char   PAD[];               ///< inter-file align padding
41cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  static const char   MEMBER_MAGIC[];      ///< fmag field magic #
42cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
43cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  struct MemberHeader
44cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  {
45cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    char name[16];  ///< Name of the file member.
46cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    char date[12];  ///< File date, decimal seconds since Epoch
47cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    char uid[6];    ///< user id in ASCII decimal
48cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    char gid[6];    ///< group id in ASCII decimal
49cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    char mode[8];   ///< file mode in ASCII octal
50cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    char size[10];  ///< file size in ASCII decimal
51cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    char fmag[2];   ///< Always contains ARFILE_MAGIC_TERMINATOR
52cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  };
53cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
54cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoprivate:
55cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  template<typename OFFSET_TYPE>
56cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  struct OffsetCompare
57cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  {
58cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    bool operator()(OFFSET_TYPE X, OFFSET_TYPE Y) const
59cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    { return (X == Y); }
60cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  };
61cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
62cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  struct MurmurHash3
63cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  {
64cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    size_t operator()(uint32_t pKey) const
65cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    {
66cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao      size_t h;
67cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao      h ^= h >> 16;
68cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao      h *= 0x85ebca6b;
69cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao      h ^= h >> 13;
70cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao      h *= 0xc2b2ae35;
71cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao      h ^= h >> 16;
72cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao      return h;
73cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    }
74cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  };
75cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
76cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  typedef HashEntry<uint32_t,
77cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                    InputTree::iterator,
78cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                    OffsetCompare<uint32_t> > ObjectMemberEntryType;
79cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaopublic:
80cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  typedef HashTable<ObjectMemberEntryType,
81cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                    MurmurHash3,
82cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                    EntryFactory<ObjectMemberEntryType> > ObjectMemberMapType;
83cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
84cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  struct ArchiveMember
85cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  {
86cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    Input* file;
87cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    InputTree::iterator lastPos;
88cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    InputTree::Mover* move;
89cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  };
90cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
91cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoprivate:
92cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  typedef HashEntry<const llvm::StringRef,
93cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                    ArchiveMember,
94cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                    StringCompare<llvm::StringRef> > ArchiveMemberEntryType;
95cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
96cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaopublic:
97cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  typedef HashTable<ArchiveMemberEntryType,
98cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                    StringHash<ELF>,
99cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                    EntryFactory<ArchiveMemberEntryType> > ArchiveMemberMapType;
100cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
101cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  struct Symbol
102cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  {
103cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  public:
104cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    enum Status
105cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    {
106cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao      Include,
107cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao      Exclude,
108cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao      Unknown
109cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    };
110cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
111cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    Symbol(const char* pName,
112cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao           uint32_t pOffset,
113cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao           enum Status pStatus)
114cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao     : name(pName), fileOffset(pOffset), status(pStatus)
115cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    {}
116cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
117cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    ~Symbol()
118cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    {}
119cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
120cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  public:
121cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    std::string name;
122cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    uint32_t fileOffset;
123cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    enum Status status;
124cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  };
125cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
126cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  typedef std::vector<Symbol*> SymTabType;
127cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
128cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaopublic:
129cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  Archive(Input& pInputFile, InputFactory& pInputFactory);
130cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
131cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ~Archive();
132cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
133cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getARFile - get the Input& of the archive file
134cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  Input& getARFile();
135cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
136cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getARFile - get the Input& of the archive file
137cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  const Input& getARFile() const;
138cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
139cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// inputs - get the input tree built from this archive
140cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  InputTree& inputs();
141cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
142cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// inputs - get the input tree built from this archive
143cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  const InputTree& inputs() const;
144cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
145cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getObjectMemberMap - get the map that contains the included object files
146cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ObjectMemberMapType& getObjectMemberMap();
147cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
148cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getObjectMemberMap - get the map that contains the included object files
149cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  const ObjectMemberMapType& getObjectMemberMap() const;
150cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
151cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// numOfObjectMember - return the number of included object files
152cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  size_t numOfObjectMember() const;
153cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
154cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// addObjectMember - add a object in the object member map
155cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pFileOffset - file offset in symtab represents a object file
156cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pIter - the iterator in the input tree built from this archive
157cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool addObjectMember(uint32_t pFileOffset, InputTree::iterator pIter);
158cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
159cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// hasObjectMember - check if a object file is included or not
160cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pFileOffset - file offset in symtab represents a object file
161cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool hasObjectMember(uint32_t pFileOffset) const;
162cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
163cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getArchiveMemberMap - get the map that contains the included archive files
164cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ArchiveMemberMapType& getArchiveMemberMap();
165cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
166cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getArchiveMemberMap - get the map that contains the included archive files
167cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  const ArchiveMemberMapType& getArchiveMemberMap() const;
168cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
169cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// addArchiveMember - add an archive in the archive member map
170cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pName    - the name of the new archive member
171cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pLastPos - this records the point to insert the next node in the
172cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ///                   subtree of this archive member
173cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pMove    - this records the direction to insert the next node in
174cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ///                   the subtree of this archive member
175cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool addArchiveMember(const llvm::StringRef& pName,
176cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                        InputTree::iterator pLastPos,
177cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                        InputTree::Mover* pMove);
178cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
179cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// hasArchiveMember - check if an archive file is included or not
180cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool hasArchiveMember(const llvm::StringRef& pName) const;
181cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
182cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getArchiveMember - get a archive member
183cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ArchiveMember* getArchiveMember(const llvm::StringRef& pName);
184cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
185cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getSymbolTable - get the symtab
186cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  SymTabType& getSymbolTable();
187cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
188cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getSymbolTable - get the symtab
189cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  const SymTabType& getSymbolTable() const;
190cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
191cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// setSymTabSize - set the memory size of symtab
192cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  void setSymTabSize(size_t pSize);
193cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
194cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getSymTabSize - get the memory size of symtab
195cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  size_t getSymTabSize() const;
196cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
197cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// numOfSymbols - return the number of symbols in symtab
198cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  size_t numOfSymbols() const;
199cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
200cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// addSymbol - add a symtab entry to symtab
201cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pName - symbol name
202cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pFileOffset - file offset in symtab represents a object file
203cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  void
204cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  addSymbol(const char* pName,
205cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao            uint32_t pFileOffset,
206cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao            enum Symbol::Status pStatus = Archive::Symbol::Unknown);
207cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
208cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getSymbolName - get the symbol name with the given index
209cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  const std::string& getSymbolName(size_t pSymIdx) const;
210cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
211cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getObjFileOffset - get the file offset that represent a object file
212cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  uint32_t getObjFileOffset(size_t pSymIdx) const;
213cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
214cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getSymbolStatus - get the status of a symbol
215cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  enum Symbol::Status getSymbolStatus(size_t pSymIdx) const;
216cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
217cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// setSymbolStatus - set the status of a symbol
218cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  void setSymbolStatus(size_t pSymIdx, enum Symbol::Status pStatus);
219cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
220cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getStrTable - get the extended name table
221cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  std::string& getStrTable();
222cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
223cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getStrTable - get the extended name table
224cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  const std::string& getStrTable() const;
225cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
226cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoprivate:
227cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  typedef GCFactory<Symbol, 0> SymbolFactory;
228cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
229cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoprivate:
230cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  Input& m_ArchiveFile;
231cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  InputTree *m_pInputTree;
232cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ObjectMemberMapType m_ObjectMemberMap;
233cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ArchiveMemberMapType m_ArchiveMemberMap;
234cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  SymbolFactory m_SymbolFactory;
235cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  SymTabType m_SymTab;
236cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  size_t m_SymTabSize;
237cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  std::string m_StrTab;
238cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao};
239cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
240cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao} // namespace of mcld
241cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
242cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#endif
243cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
244