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