summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-10-31 20:06:13 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-10-31 20:06:13 +0000
commit8f23882f497d0ce85a595e46e2cf10c7f3cc5f29 (patch)
tree8a44068766282e52c90094deed55cbfb28782010
parent476be8f94a3eccef3a67bb5770a12900da6b3bbb (diff)
downloadbcm5719-llvm-8f23882f497d0ce85a595e46e2cf10c7f3cc5f29.tar.gz
bcm5719-llvm-8f23882f497d0ce85a595e46e2cf10c7f3cc5f29.zip
Simplify the handling of the archive string table.
We only need to store a StringRef llvm-svn: 251746
-rw-r--r--llvm/include/llvm/Object/Archive.h2
-rw-r--r--llvm/lib/Object/Archive.cpp22
2 files changed, 11 insertions, 13 deletions
diff --git a/llvm/include/llvm/Object/Archive.h b/llvm/include/llvm/Object/Archive.h
index 32c72a0cc3d..0d394fd98b6 100644
--- a/llvm/include/llvm/Object/Archive.h
+++ b/llvm/include/llvm/Object/Archive.h
@@ -218,7 +218,7 @@ public:
private:
child_iterator SymbolTable;
- child_iterator StringTable;
+ StringRef StringTable;
child_iterator FirstRegular;
unsigned Format : 2;
unsigned IsThin : 1;
diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp
index 667732baa27..2e71b8205d4 100644
--- a/llvm/lib/Object/Archive.cpp
+++ b/llvm/lib/Object/Archive.cpp
@@ -179,17 +179,11 @@ ErrorOr<StringRef> Archive::Child::getName() const {
std::size_t offset;
if (name.substr(1).rtrim(" ").getAsInteger(10, offset))
llvm_unreachable("Long name offset is not an integer");
- const char *addr = Parent->StringTable->Data.begin()
- + sizeof(ArchiveMemberHeader)
- + offset;
+
// Verify it.
- if (Parent->StringTable == Parent->child_end()
- || addr < (Parent->StringTable->Data.begin()
- + sizeof(ArchiveMemberHeader))
- || addr > (Parent->StringTable->Data.begin()
- + sizeof(ArchiveMemberHeader)
- + Parent->StringTable->getSize()))
+ if (offset >= Parent->StringTable.size())
return object_error::parse_failed;
+ const char *addr = Parent->StringTable.begin() + offset;
// GNU long file names end with a "/\n".
if (Parent->kind() == K_GNU || Parent->kind() == K_MIPS64) {
@@ -240,7 +234,7 @@ ErrorOr<std::unique_ptr<Archive>> Archive::create(MemoryBufferRef Source) {
Archive::Archive(MemoryBufferRef Source, std::error_code &ec)
: Binary(Binary::ID_Archive, Source), SymbolTable(child_end()),
- StringTable(child_end()), FirstRegular(child_end()) {
+ FirstRegular(child_end()) {
StringRef Buffer = Data.getBuffer();
// Check for sufficient magic.
if (Buffer.startswith(ThinMagic)) {
@@ -328,7 +322,9 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec)
if (Name == "//") {
Format = has64SymTable ? K_MIPS64 : K_GNU;
- StringTable = i;
+ // The string table is never an external member, so we just assert on the
+ // ErrorOr.
+ StringTable = *i->getBuffer();
++i;
FirstRegular = i;
ec = std::error_code();
@@ -360,7 +356,9 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec)
Name = i->getRawName();
if (Name == "//") {
- StringTable = i;
+ // The string table is never an external member, so we just assert on the
+ // ErrorOr.
+ StringTable = *i->getBuffer();
++i;
}
OpenPOWER on IntegriCloud