mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-09 10:20:34 +00:00
Fix fetching the symbol table of a thin archive.
We were trying to read it as an external file. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242926 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -62,6 +62,8 @@ public:
|
|||||||
return reinterpret_cast<const ArchiveMemberHeader *>(Data.data());
|
return reinterpret_cast<const ArchiveMemberHeader *>(Data.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isThinMember() const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Child(const Archive *Parent, const char *Start);
|
Child(const Archive *Parent, const char *Start);
|
||||||
|
|
||||||
|
|||||||
@@ -87,17 +87,17 @@ Archive::Child::Child(const Archive *Parent, const char *Start)
|
|||||||
if (!Start)
|
if (!Start)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const ArchiveMemberHeader *Header =
|
|
||||||
reinterpret_cast<const ArchiveMemberHeader *>(Start);
|
|
||||||
uint64_t Size = sizeof(ArchiveMemberHeader);
|
uint64_t Size = sizeof(ArchiveMemberHeader);
|
||||||
if (!Parent->IsThin || Header->getName() == "/" || Header->getName() == "//")
|
|
||||||
Size += Header->getSize();
|
|
||||||
Data = StringRef(Start, Size);
|
Data = StringRef(Start, Size);
|
||||||
|
if (!isThinMember()) {
|
||||||
|
Size += getRawSize();
|
||||||
|
Data = StringRef(Start, Size);
|
||||||
|
}
|
||||||
|
|
||||||
// Setup StartOfFile and PaddingBytes.
|
// Setup StartOfFile and PaddingBytes.
|
||||||
StartOfFile = sizeof(ArchiveMemberHeader);
|
StartOfFile = sizeof(ArchiveMemberHeader);
|
||||||
// Don't include attached name.
|
// Don't include attached name.
|
||||||
StringRef Name = Header->getName();
|
StringRef Name = getRawName();
|
||||||
if (Name.startswith("#1/")) {
|
if (Name.startswith("#1/")) {
|
||||||
uint64_t NameSize;
|
uint64_t NameSize;
|
||||||
if (Name.substr(3).rtrim(" ").getAsInteger(10, NameSize))
|
if (Name.substr(3).rtrim(" ").getAsInteger(10, NameSize))
|
||||||
@@ -116,8 +116,13 @@ uint64_t Archive::Child::getRawSize() const {
|
|||||||
return getHeader()->getSize();
|
return getHeader()->getSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Archive::Child::isThinMember() const {
|
||||||
|
StringRef Name = getHeader()->getName();
|
||||||
|
return Parent->IsThin && Name != "/" && Name != "//";
|
||||||
|
}
|
||||||
|
|
||||||
ErrorOr<StringRef> Archive::Child::getBuffer() const {
|
ErrorOr<StringRef> Archive::Child::getBuffer() const {
|
||||||
if (!Parent->IsThin)
|
if (!isThinMember())
|
||||||
return StringRef(Data.data() + StartOfFile, getSize());
|
return StringRef(Data.data() + StartOfFile, getSize());
|
||||||
ErrorOr<StringRef> Name = getName();
|
ErrorOr<StringRef> Name = getName();
|
||||||
if (std::error_code EC = Name.getError())
|
if (std::error_code EC = Name.getError())
|
||||||
|
|||||||
@@ -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-NEXT: main in trivial-object-test2.elf-x86-64
|
||||||
CHECK-NOT: bar
|
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: trivial-object-test.elf-x86-64:
|
||||||
CHECK-NEXT: U SomeOtherFunction
|
CHECK-NEXT: U SomeOtherFunction
|
||||||
CHECK-NEXT: 0000000000000000 T main
|
CHECK-NEXT: 0000000000000000 T main
|
||||||
|
|||||||
Reference in New Issue
Block a user