summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-07-22 19:34:26 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-07-22 19:34:26 +0000
commitbe9ab2682e3bd88424016121e72c4485964ca90a (patch)
tree00b53fd79b5784f54e3e53ac67b7e8faa0d7a633 /llvm
parent240bd9c875551d9d48ef27681f7b81d6ef1bd0cd (diff)
downloadbcm5719-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.h2
-rw-r--r--llvm/lib/Object/Archive.cpp17
-rw-r--r--llvm/test/Object/archive-symtab.test11
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
OpenPOWER on IntegriCloud