1cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===- Archive.cpp --------------------------------------------------------===//
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#include <mcld/LD/Archive.h>
1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/MC/InputBuilder.h>
1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/MC/MCLDInput.h>
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/MC/AttributeSet.h>
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/MC/ContextFactory.h>
14cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao#include <llvm/ADT/StringRef.h>
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/MemoryAreaFactory.h>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/Support/MsgHandling.h>
17cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
18cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaousing namespace mcld;
19cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
20cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao//===----------------------------------------------------------------------===//
21cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao// Archive
22cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst char   Archive::MAGIC[]            = "!<arch>\n";
23cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst char   Archive::THIN_MAGIC[]       = "!<thin>\n";
24cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst size_t Archive::MAGIC_LEN          = sizeof(Archive::MAGIC) - 1;
25cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst char   Archive::SVR4_SYMTAB_NAME[] = "/               ";
26cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst char   Archive::STRTAB_NAME[]      = "//              ";
27cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst char   Archive::PAD[]              = "\n";
28cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst char   Archive::MEMBER_MAGIC[]     = "`\n";
29cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoArchive::Archive(Input& pInputFile, InputBuilder& pBuilder)
31cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao : m_ArchiveFile(pInputFile),
32cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao   m_pInputTree(NULL),
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   m_SymbolFactory(32),
3422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao   m_Builder(pBuilder)
35cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // FIXME: move creation of input tree out of Archive.
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pInputTree = new InputTree();
38cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
39cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
40cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoArchive::~Archive()
41cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
42cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  delete m_pInputTree;
43cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
44cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
45cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getARFile - get the Input& of the archive file
46cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoInput& Archive::getARFile()
47cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
48cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_ArchiveFile;
49cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
50cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
51cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getARFile - get the Input& of the archive file
52cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst Input& Archive::getARFile() const
53cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
54cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_ArchiveFile;
55cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
56cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
57cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// inputs - get the input tree built from this archive
58cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoInputTree& Archive::inputs()
59cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
60cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return *m_pInputTree;
61cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
62cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
63cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// inputs - get the input tree built from this archive
64cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst InputTree& Archive::inputs() const
65cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
66cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return *m_pInputTree;
67cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
68cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
69cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getObjectMemberMap - get the map that contains the included object files
70cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoArchive::ObjectMemberMapType& Archive::getObjectMemberMap()
71cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
72cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_ObjectMemberMap;
73cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
74cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
75cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getObjectMemberMap - get the map that contains the included object files
76cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst Archive::ObjectMemberMapType& Archive::getObjectMemberMap() const
77cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
78cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_ObjectMemberMap;
79cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
80cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
81cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// numOfObjectMember - return the number of included object files
82cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaosize_t Archive::numOfObjectMember() const
83cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
84cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_ObjectMemberMap.numOfEntries();
85cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
86cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
87cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// addObjectMember - add a object in the object member map
88cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// @param pFileOffset - file offset in symtab represents a object file
89cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// @param pIter - the iterator in the input tree built from this archive
90cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaobool Archive::addObjectMember(uint32_t pFileOffset, InputTree::iterator pIter)
91cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
92cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool exist;
93cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ObjectMemberEntryType* entry = m_ObjectMemberMap.insert(pFileOffset, exist);
94cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  if (!exist)
95cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    entry->setValue(pIter);
96cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return !exist;
97cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
98cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
99cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// hasObjectMember - check if a object file is included or not
100cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// @param pFileOffset - file offset in symtab represents a object file
101cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaobool Archive::hasObjectMember(uint32_t pFileOffset) const
102cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
103cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return (m_ObjectMemberMap.find(pFileOffset) != m_ObjectMemberMap.end());
104cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
105cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
106cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getArchiveMemberMap - get the map that contains the included archive files
107cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoArchive::ArchiveMemberMapType& Archive::getArchiveMemberMap()
108cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
109cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_ArchiveMemberMap;
110cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
111cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
112cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getArchiveMemberMap - get the map that contains the included archive files
113cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst Archive::ArchiveMemberMapType& Archive::getArchiveMemberMap() const
114cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
115cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_ArchiveMemberMap;
116cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
117cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
118cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// addArchiveMember - add an archive in the archive member map
119cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// @param pName    - the name of the new archive member
120cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// @param pLastPos - this records the point to insert the next node in the
121cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao///                   subtree of this archive member
122cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// @param pMove    - this records the direction to insert the next node in the
123cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao///                   subtree of this archive member
124cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaobool Archive::addArchiveMember(const llvm::StringRef& pName,
125cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                               InputTree::iterator pLastPos,
126cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                               InputTree::Mover* pMove)
127cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
128cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  bool exist;
129cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ArchiveMemberEntryType* entry = m_ArchiveMemberMap.insert(pName, exist);
130cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  if (!exist) {
131cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    ArchiveMember& ar = entry->value();
1326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    if (pLastPos == m_pInputTree->root())
1336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines      ar.file = &m_ArchiveFile;
1346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    else
1356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines      ar.file = *pLastPos;
136cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    ar.lastPos = pLastPos;
137cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    ar.move = pMove;
138cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  }
139cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return !exist;
140cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
141cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
142cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// hasArchiveMember - check if an archive file is included or not
143cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaobool Archive::hasArchiveMember(const llvm::StringRef& pName) const
144cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
145cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return (m_ArchiveMemberMap.find(pName) != m_ArchiveMemberMap.end());
146cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
147cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
148cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getArchiveMember - get a archive member
149cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoArchive::ArchiveMember* Archive::getArchiveMember(const llvm::StringRef& pName)
150cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
151cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  ArchiveMemberMapType::iterator it = m_ArchiveMemberMap.find(pName);
152cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  if (it != m_ArchiveMemberMap.end())
153cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao    return &(it.getEntry()->value());
154cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return NULL;
155cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
156cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
157cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getSymbolTable - get the symtab
158cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei LiaoArchive::SymTabType& Archive::getSymbolTable()
159cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
160cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_SymTab;
161cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
162cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
163cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getSymbolTable - get the symtab
164cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst Archive::SymTabType& Archive::getSymbolTable() const
165cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
166cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_SymTab;
167cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
168cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
169cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// setSymTabSize - set the memory size of symtab
170cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaovoid Archive::setSymTabSize(size_t pSize)
171cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
172cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  m_SymTabSize = pSize;
173cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
174cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
175cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getSymTabSize - get the memory size of symtab
176cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaosize_t Archive::getSymTabSize() const
177cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
178cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_SymTabSize;
179cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
180cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
181cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// numOfSymbols - return the number of symbols in symtab
182cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaosize_t Archive::numOfSymbols() const
183cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
184cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_SymTab.size();
185cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
186cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
187cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// addSymbol - add a symtab entry to symtab
188cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// @param pName - symbol name
189cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// @param pFileOffset - file offset in symtab represents a object file
190cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaovoid Archive::addSymbol(const char* pName,
191cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                        uint32_t pFileOffset,
192cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                        enum Archive::Symbol::Status pStatus)
193cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
194cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  Symbol* entry = m_SymbolFactory.allocate();
195cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  new (entry) Symbol(pName, pFileOffset, pStatus);
196cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  m_SymTab.push_back(entry);
197cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
198cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
199cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getSymbolName - get the symbol name with the given index
200cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst std::string& Archive::getSymbolName(size_t pSymIdx) const
201cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
202cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  assert(pSymIdx < numOfSymbols());
203cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_SymTab[pSymIdx]->name;
204cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
205cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
206cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getObjFileOffset - get the file offset that represent a object file
207cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaouint32_t Archive::getObjFileOffset(size_t pSymIdx) const
208cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
209cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  assert(pSymIdx < numOfSymbols());
210cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_SymTab[pSymIdx]->fileOffset;
211cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
212cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
213cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getSymbolStatus - get the status of a symbol
214cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoenum Archive::Symbol::Status Archive::getSymbolStatus(size_t pSymIdx) const
215cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
216cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  assert(pSymIdx < numOfSymbols());
217cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_SymTab[pSymIdx]->status;
218cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
219cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
220cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// setSymbolStatus - set the status of a symbol
221cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaovoid Archive::setSymbolStatus(size_t pSymIdx,
222cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao                              enum Archive::Symbol::Status pStatus)
223cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
224cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  assert(pSymIdx < numOfSymbols());
225cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  m_SymTab[pSymIdx]->status = pStatus;
226cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
227cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
228cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getStrTable - get the extended name table
229cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaostd::string& Archive::getStrTable()
230cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
231cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_StrTab;
232cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
233cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
234cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao/// getStrTable - get the extended name table
235cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liaoconst std::string& Archive::getStrTable() const
236cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao{
237cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao  return m_StrTab;
238cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao}
239cedee4b38f4786845183be7f5916dd520a170ae0Shih-wei Liao
24022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// hasStrTable()
24122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaobool Archive::hasStrTable() const
24222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
24322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return (m_StrTab.size() > 0);
24422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
24522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
24622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// getMemberFile - get the member file in an archive member
24722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @param pArchiveFile - Input reference of the archive member
24822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @param pIsThinAR    - denote the archive menber is a Thin Archive or not
24922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @param pName        - the name of the member file we want to get
25022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @param pPath        - the path of the member file
25122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// @param pFileOffset  - the file offset of the member file in a regular AR
25222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// FIXME: maybe we should not construct input file here
25322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei LiaoInput* Archive::getMemberFile(Input& pArchiveFile,
25422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                              bool isThinAR,
25522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                              const std::string& pName,
25622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                              const sys::fs::Path& pPath,
25722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                              off_t pFileOffset)
25822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao{
25922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Input* member = NULL;
26022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  if (!isThinAR) {
26122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    member = m_Builder.createInput(pName, pPath, Input::Unknown, pFileOffset);
26222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    assert(member != NULL);
26322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    member->setMemArea(pArchiveFile.memArea());
26422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_Builder.setContext(*member);
26522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
26622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  else {
26722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    member = m_Builder.createInput(pName, pPath, Input::Unknown);
26822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    assert(member != NULL);
26922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    if (!m_Builder.setMemory(*member, FileHandle::ReadOnly)) {
27022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      error(diag::err_cannot_open_input) << member->name() << member->path();
27122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao      return NULL;
27222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    }
27322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_Builder.setContext(*member);
27422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
27522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  return member;
27622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao}
27722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
278