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//===----------------------------------------------------------------------===//
937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#ifndef MCLD_LD_ARCHIVE_H_
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#define MCLD_LD_ARCHIVE_H_
11cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/InputTree.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/ADT/HashEntry.h"
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/ADT/HashTable.h"
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/ADT/StringHash.h"
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/GCFactory.h"
17cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
18cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <string>
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include <vector>
20cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
2122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaonamespace mcld {
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
23cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoclass Input;
2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass InputBuilder;
2537b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass InputFactory;
26cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
27cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/** \class Archive
28cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao *  \brief This class define the interfacee to Archive files
29cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao */
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hinesclass Archive {
3137b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
3237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static const char MAGIC[];              ///< magic string
3337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static const char THIN_MAGIC[];         ///< magic of thin archive
3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static const size_t MAGIC_LEN;          ///< length of magic string
3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static const char SVR4_SYMTAB_NAME[];   ///< SVR4 symtab entry name
3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static const char IRIX6_SYMTAB_NAME[];  ///< Irix6 symtab entry name
3737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static const char STRTAB_NAME[];        ///< Name of string table
3837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static const char PAD[];                ///< inter-file align padding
3937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  static const char MEMBER_MAGIC[];       ///< fmag field magic #
4037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  struct MemberHeader {
42cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    char name[16];  ///< Name of the file member.
43cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    char date[12];  ///< File date, decimal seconds since Epoch
44cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    char uid[6];    ///< user id in ASCII decimal
45cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    char gid[6];    ///< group id in ASCII decimal
46cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    char mode[8];   ///< file mode in ASCII octal
47cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    char size[10];  ///< file size in ASCII decimal
48cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    char fmag[2];   ///< Always contains ARFILE_MAGIC_TERMINATOR
49cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  };
50cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
5137b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
5237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  template <typename OFFSET_TYPE>
5337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  struct OffsetCompare {
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines    bool operator()(OFFSET_TYPE X, OFFSET_TYPE Y) const { return (X == Y); }
55cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  };
56cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
5737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  struct MurmurHash3 {
5837b74a387bb3993387029859c2d9d051c41c724eStephen Hines    size_t operator()(uint32_t pKey) const {
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      pKey ^= pKey >> 16;
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      pKey *= 0x85ebca6b;
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      pKey ^= pKey >> 13;
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      pKey *= 0xc2b2ae35;
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      pKey ^= pKey >> 16;
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      return pKey;
65cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    }
66cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  };
67cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
6837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  typedef HashEntry<uint32_t, InputTree::iterator, OffsetCompare<uint32_t> >
6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines      ObjectMemberEntryType;
7037b74a387bb3993387029859c2d9d051c41c724eStephen Hines
7137b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
72cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  typedef HashTable<ObjectMemberEntryType,
73cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                    MurmurHash3,
74cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                    EntryFactory<ObjectMemberEntryType> > ObjectMemberMapType;
75cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
7637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  struct ArchiveMember {
77cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    Input* file;
78cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    InputTree::iterator lastPos;
79cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    InputTree::Mover* move;
80cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  };
81cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
8237b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
83cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  typedef HashEntry<const llvm::StringRef,
84cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                    ArchiveMember,
8537b74a387bb3993387029859c2d9d051c41c724eStephen Hines                    hash::StringCompare<llvm::StringRef> >
8637b74a387bb3993387029859c2d9d051c41c724eStephen Hines      ArchiveMemberEntryType;
87cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
8837b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
89cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  typedef HashTable<ArchiveMemberEntryType,
9087f34658dec9097d987d254a990ea7f311bfc95fStephen Hines                    hash::StringHash<hash::DJB>,
91cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                    EntryFactory<ArchiveMemberEntryType> > ArchiveMemberMapType;
92cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
9337b74a387bb3993387029859c2d9d051c41c724eStephen Hines  struct Symbol {
9437b74a387bb3993387029859c2d9d051c41c724eStephen Hines   public:
9537b74a387bb3993387029859c2d9d051c41c724eStephen Hines    enum Status { Include, Exclude, Unknown };
9637b74a387bb3993387029859c2d9d051c41c724eStephen Hines
9737b74a387bb3993387029859c2d9d051c41c724eStephen Hines    Symbol(const char* pName, uint32_t pOffset, enum Status pStatus)
9837b74a387bb3993387029859c2d9d051c41c724eStephen Hines        : name(pName), fileOffset(pOffset), status(pStatus) {}
9937b74a387bb3993387029859c2d9d051c41c724eStephen Hines
10037b74a387bb3993387029859c2d9d051c41c724eStephen Hines    ~Symbol() {}
10137b74a387bb3993387029859c2d9d051c41c724eStephen Hines
10237b74a387bb3993387029859c2d9d051c41c724eStephen Hines   public:
103cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    std::string name;
104cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    uint32_t fileOffset;
105cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    enum Status status;
106cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  };
107cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
108cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  typedef std::vector<Symbol*> SymTabType;
109cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
11037b74a387bb3993387029859c2d9d051c41c724eStephen Hines public:
11122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Archive(Input& pInputFile, InputBuilder& pBuilder);
112cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
113cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ~Archive();
114cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
115cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getARFile - get the Input& of the archive file
116cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  Input& getARFile();
117cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
118cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getARFile - get the Input& of the archive file
119cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  const Input& getARFile() const;
120cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
121cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// inputs - get the input tree built from this archive
122cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  InputTree& inputs();
123cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
124cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// inputs - get the input tree built from this archive
125cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  const InputTree& inputs() const;
126cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
127cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getObjectMemberMap - get the map that contains the included object files
128cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ObjectMemberMapType& getObjectMemberMap();
129cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
130cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getObjectMemberMap - get the map that contains the included object files
131cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  const ObjectMemberMapType& getObjectMemberMap() const;
132cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
133cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// numOfObjectMember - return the number of included object files
134cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  size_t numOfObjectMember() const;
135cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
136cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// addObjectMember - add a object in the object member map
137cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pFileOffset - file offset in symtab represents a object file
138cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pIter - the iterator in the input tree built from this archive
139cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool addObjectMember(uint32_t pFileOffset, InputTree::iterator pIter);
140cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
141cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// hasObjectMember - check if a object file is included or not
142cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pFileOffset - file offset in symtab represents a object file
143cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool hasObjectMember(uint32_t pFileOffset) const;
144cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
145cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getArchiveMemberMap - get the map that contains the included archive files
146cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ArchiveMemberMapType& getArchiveMemberMap();
147cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
148cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getArchiveMemberMap - get the map that contains the included archive files
149cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  const ArchiveMemberMapType& getArchiveMemberMap() const;
150cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
151cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// addArchiveMember - add an archive in the archive member map
152cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pName    - the name of the new archive member
153cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pLastPos - this records the point to insert the next node in the
154cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ///                   subtree of this archive member
155cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pMove    - this records the direction to insert the next node in
156cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ///                   the subtree of this archive member
157cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool addArchiveMember(const llvm::StringRef& pName,
158cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                        InputTree::iterator pLastPos,
159cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                        InputTree::Mover* pMove);
160cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
161cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// hasArchiveMember - check if an archive file is included or not
162cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool hasArchiveMember(const llvm::StringRef& pName) const;
163cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
164cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getArchiveMember - get a archive member
165cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ArchiveMember* getArchiveMember(const llvm::StringRef& pName);
166cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
167cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getSymbolTable - get the symtab
168cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  SymTabType& getSymbolTable();
169cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
170cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getSymbolTable - get the symtab
171cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  const SymTabType& getSymbolTable() const;
172cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
173cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// setSymTabSize - set the memory size of symtab
174cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  void setSymTabSize(size_t pSize);
175cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
176cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getSymTabSize - get the memory size of symtab
177cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  size_t getSymTabSize() const;
178cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
179cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// numOfSymbols - return the number of symbols in symtab
180cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  size_t numOfSymbols() const;
181cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
182cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// addSymbol - add a symtab entry to symtab
183cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pName - symbol name
184cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// @param pFileOffset - file offset in symtab represents a object file
18537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  void addSymbol(const char* pName,
18637b74a387bb3993387029859c2d9d051c41c724eStephen Hines                 uint32_t pFileOffset,
18737b74a387bb3993387029859c2d9d051c41c724eStephen Hines                 enum Symbol::Status pStatus = Archive::Symbol::Unknown);
188cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
189cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getSymbolName - get the symbol name with the given index
190cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  const std::string& getSymbolName(size_t pSymIdx) const;
191cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
192cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getObjFileOffset - get the file offset that represent a object file
193cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  uint32_t getObjFileOffset(size_t pSymIdx) const;
194cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
195cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getSymbolStatus - get the status of a symbol
196cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  enum Symbol::Status getSymbolStatus(size_t pSymIdx) const;
197cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
198cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// setSymbolStatus - set the status of a symbol
199cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  void setSymbolStatus(size_t pSymIdx, enum Symbol::Status pStatus);
200cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
201cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getStrTable - get the extended name table
202cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  std::string& getStrTable();
203cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
204cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  /// getStrTable - get the extended name table
205cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  const std::string& getStrTable() const;
206cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
20722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// hasStrTable - return true if this archive has extended name table
20822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  bool hasStrTable() const;
20922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
21022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// getMemberFile       - get the member file in an archive member
21122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pArchiveFile - Input reference of the archive member
21222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pIsThinAR    - denote the archive menber is a Thin Archive or not
21322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pName        - the name of the member file we want to get
21422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pPath        - the path of the member file
21522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  /// @param pFileOffset  - the file offset of the member file in a regular AR
21622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Input* getMemberFile(Input& pArchiveFile,
21722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                       bool isThinAR,
21822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                       const std::string& pName,
21922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                       const sys::fs::Path& pPath,
22022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                       off_t pFileOffset = 0);
22122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
22237b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
223cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  typedef GCFactory<Symbol, 0> SymbolFactory;
224cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
22537b74a387bb3993387029859c2d9d051c41c724eStephen Hines private:
226cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  Input& m_ArchiveFile;
22737b74a387bb3993387029859c2d9d051c41c724eStephen Hines  InputTree* m_pInputTree;
228cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ObjectMemberMapType m_ObjectMemberMap;
229cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ArchiveMemberMapType m_ArchiveMemberMap;
230cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  SymbolFactory m_SymbolFactory;
231cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  SymTabType m_SymTab;
232cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  size_t m_SymTabSize;
233cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  std::string m_StrTab;
23422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  InputBuilder& m_Builder;
235cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao};
236cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
23737b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
238cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
23937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#endif  // MCLD_LD_ARCHIVE_H_
240