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 | |
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')
-rw-r--r-- | llvm/include/llvm/Object/Archive.h | 2 | ||||
-rw-r--r-- | llvm/lib/Object/Archive.cpp | 17 | ||||
-rw-r--r-- | llvm/test/Object/archive-symtab.test | 11 |
3 files changed, 24 insertions, 6 deletions
diff --git a/llvm/include/llvm/Object/Archive.h b/llvm/include/llvm/Object/Archive.h index e5d59d832e3..d7f46551827 100644 --- a/llvm/include/llvm/Object/Archive.h +++ b/llvm/include/llvm/Object/Archive.h @@ -62,6 +62,8 @@ public: return reinterpret_cast<const ArchiveMemberHeader *>(Data.data()); } + bool isThinMember() const; + public: Child(const Archive *Parent, const char *Start); 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()) diff --git a/llvm/test/Object/archive-symtab.test b/llvm/test/Object/archive-symtab.test index 6e4c76fb376..8ba4ba0ae54 100644 --- a/llvm/test/Object/archive-symtab.test +++ b/llvm/test/Object/archive-symtab.test @@ -8,6 +8,17 @@ CHECK-NEXT: foo in trivial-object-test2.elf-x86-64 CHECK-NEXT: main in trivial-object-test2.elf-x86-64 CHECK-NOT: bar + +RUN: rm -f %t.a +RUN: llvm-ar rcT %t.a %p/Inputs/trivial-object-test.elf-x86-64 %p/Inputs/trivial-object-test2.elf-x86-64 +RUN: llvm-nm -M %t.a | FileCheck --check-prefix=THIN %s + +THIN: Archive map +THIN-NEXT: main in {{.*}}/Inputs/trivial-object-test.elf-x86-64 +THIN-NEXT: foo in {{.*}}/Inputs/trivial-object-test2.elf-x86-64 +THIN-NEXT: main in {{.*}}/Inputs/trivial-object-test2.elf-x86-64 + + CHECK: trivial-object-test.elf-x86-64: CHECK-NEXT: U SomeOtherFunction CHECK-NEXT: 0000000000000000 T main |