diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2004-11-15 01:40:20 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2004-11-15 01:40:20 +0000 |
commit | b323113b93a14f8032e060b5d05a39c2242e4acc (patch) | |
tree | baf68dc39ebc35aaf93a15fe3a1142a863102726 /lib/Archive | |
parent | 766b793143fa863283498233e8962391da09b63a (diff) | |
download | external_llvm-b323113b93a14f8032e060b5d05a39c2242e4acc.zip external_llvm-b323113b93a14f8032e060b5d05a39c2242e4acc.tar.gz external_llvm-b323113b93a14f8032e060b5d05a39c2242e4acc.tar.bz2 |
* Make sure the string table gets read even if there isn't a foreign
symbol table.
* Make sure we update the file pointer for each member when rebuilding the
symbol table.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17812 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Archive')
-rw-r--r-- | lib/Archive/ArchiveReader.cpp | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/lib/Archive/ArchiveReader.cpp b/lib/Archive/ArchiveReader.cpp index 794e1b2..7f85894 100644 --- a/lib/Archive/ArchiveReader.cpp +++ b/lib/Archive/ArchiveReader.cpp @@ -309,18 +309,25 @@ Archive::loadSymbolTable() { if (mbr->isForeignSymbolTable()) { // Skip the foreign symbol table, we don't do anything with it At += mbr->getSize(); + if (mbr->getSize() % 2 != 0) + At++; delete mbr; - // See if there's a string table too + // Read the next one + FirstFile = At; + mbr = parseMemberHeader(At,End); + } + + if (mbr->isStringTable()) { + // Process the string table entry + strtab.assign((const char*)mbr->getData(),mbr->getSize()); + At += mbr->getSize(); + if (mbr->getSize() % 2 != 0) + At++; + delete mbr; + // Get the next one FirstFile = At; mbr = parseMemberHeader(At,End); - if (mbr->isStringTable()) { - strtab.assign((const char*)mbr->getData(),mbr->getSize()); - At += mbr->getSize(); - delete mbr; - FirstFile = At; - mbr = parseMemberHeader(At,End); - } } // See if its the symbol table @@ -432,6 +439,11 @@ Archive::findModulesDefiningSymbols(const std::set<std::string>& symbols, mbr->getPath().get(); } } + + // Go to the next file location + At += mbr->getSize(); + if (mbr->getSize() % 2 != 0) + At++; } } |