diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2015-07-22 19:34:26 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2015-07-22 19:34:26 +0000 |
commit | be9ab2682e3bd88424016121e72c4485964ca90a (patch) | |
tree | 00b53fd79b5784f54e3e53ac67b7e8faa0d7a633 /llvm/lib/Object/Archive.cpp | |
parent | 240bd9c875551d9d48ef27681f7b81d6ef1bd0cd (diff) | |
download | bcm5719-llvm-be9ab2682e3bd88424016121e72c4485964ca90a.tar.gz bcm5719-llvm-be9ab2682e3bd88424016121e72c4485964ca90a.zip |
Fix fetching the symbol table of a thin archive.
We were trying to read it as an external file.
llvm-svn: 242926
Diffstat (limited to 'llvm/lib/Object/Archive.cpp')
-rw-r--r-- | llvm/lib/Object/Archive.cpp | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp index a1e5eb27689..941f72bb6a6 100644 --- a/llvm/lib/Object/Archive.cpp +++ b/llvm/lib/Object/Archive.cpp @@ -87,17 +87,17 @@ Archive::Child::Child(const Archive *Parent, const char *Start) if (!Start) return; - const ArchiveMemberHeader *Header = - reinterpret_cast<const ArchiveMemberHeader *>(Start); uint64_t Size = sizeof(ArchiveMemberHeader); - if (!Parent->IsThin || Header->getName() == "/" || Header->getName() == "//") - Size += Header->getSize(); Data = StringRef(Start, Size); + if (!isThinMember()) { + Size += getRawSize(); + Data = StringRef(Start, Size); + } // Setup StartOfFile and PaddingBytes. StartOfFile = sizeof(ArchiveMemberHeader); // Don't include attached name. - StringRef Name = Header->getName(); + StringRef Name = getRawName(); if (Name.startswith("#1/")) { uint64_t NameSize; if (Name.substr(3).rtrim(" ").getAsInteger(10, NameSize)) @@ -116,8 +116,13 @@ uint64_t Archive::Child::getRawSize() const { return getHeader()->getSize(); } +bool Archive::Child::isThinMember() const { + StringRef Name = getHeader()->getName(); + return Parent->IsThin && Name != "/" && Name != "//"; +} + ErrorOr<StringRef> Archive::Child::getBuffer() const { - if (!Parent->IsThin) + if (!isThinMember()) return StringRef(Data.data() + StartOfFile, getSize()); ErrorOr<StringRef> Name = getName(); if (std::error_code EC = Name.getError()) |