summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Object/Archive.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Object/Archive.cpp')
-rw-r--r--llvm/lib/Object/Archive.cpp49
1 files changed, 23 insertions, 26 deletions
diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp
index 7579a9ac98d..719d1042e5d 100644
--- a/llvm/lib/Object/Archive.cpp
+++ b/llvm/lib/Object/Archive.cpp
@@ -23,20 +23,6 @@ using namespace object;
static const char *Magic = "!<arch>\n";
-static bool isInternalMember(const ArchiveMemberHeader &amh) {
- static const char *const internals[] = {
- "/",
- "//"
- };
-
- StringRef name = amh.getName();
- for (std::size_t i = 0; i < sizeof(internals) / sizeof(*internals); ++i) {
- if (name == internals[i])
- return true;
- }
- return false;
-}
-
void Archive::anchor() { }
StringRef ArchiveMemberHeader::getName() const {
@@ -93,16 +79,13 @@ unsigned ArchiveMemberHeader::getGID() const {
return Ret;
}
-static const ArchiveMemberHeader *toHeader(const char *base) {
- return reinterpret_cast<const ArchiveMemberHeader *>(base);
-}
-
Archive::Child::Child(const Archive *Parent, const char *Start)
: Parent(Parent) {
if (!Start)
return;
- const ArchiveMemberHeader *Header = toHeader(Start);
+ const ArchiveMemberHeader *Header =
+ reinterpret_cast<const ArchiveMemberHeader *>(Start);
Data = StringRef(Start, sizeof(ArchiveMemberHeader) + Header->getSize());
// Setup StartOfFile and PaddingBytes.
@@ -173,7 +156,8 @@ error_code Archive::Child::getName(StringRef &Result) const {
uint64_t name_size;
if (name.substr(3).rtrim(" ").getAsInteger(10, name_size))
llvm_unreachable("Long name length is not an ingeter");
- Result = Data.substr(sizeof(ArchiveMemberHeader), name_size);
+ Result = Data.substr(sizeof(ArchiveMemberHeader), name_size)
+ .rtrim(StringRef("\0", 1));
return object_error::success;
}
// It's a simple name.
@@ -252,6 +236,8 @@ Archive::Archive(MemoryBuffer *source, error_code &ec)
if (Name == "__.SYMDEF") {
Format = K_BSD;
SymbolTable = i;
+ ++i;
+ FirstRegular = i;
ec = object_error::success;
return;
}
@@ -262,8 +248,11 @@ Archive::Archive(MemoryBuffer *source, error_code &ec)
ec = i->getName(Name);
if (ec)
return;
- if (Name == StringRef("__.SYMDEF SORTED\0\0\0", 20))
+ if (Name == "__.SYMDEF SORTED") {
SymbolTable = i;
+ ++i;
+ }
+ FirstRegular = i;
return;
}
@@ -281,12 +270,15 @@ Archive::Archive(MemoryBuffer *source, error_code &ec)
if (Name == "//") {
Format = K_GNU;
StringTable = i;
+ ++i;
+ FirstRegular = i;
ec = object_error::success;
return;
}
if (Name[0] != '/') {
Format = K_GNU;
+ FirstRegular = i;
ec = object_error::success;
return;
}
@@ -301,26 +293,31 @@ Archive::Archive(MemoryBuffer *source, error_code &ec)
++i;
if (i == e) {
+ FirstRegular = i;
ec = object_error::success;
return;
}
Name = i->getRawName();
- if (Name == "//")
+ if (Name == "//") {
StringTable = i;
+ ++i;
+ }
+ FirstRegular = i;
ec = object_error::success;
}
-Archive::child_iterator Archive::begin_children(bool skip_internal) const {
+Archive::child_iterator Archive::begin_children(bool SkipInternal) const {
if (Data->getBufferSize() == 8) // empty archive.
return end_children();
+
+ if (SkipInternal)
+ return FirstRegular;
+
const char *Loc = Data->getBufferStart() + strlen(Magic);
Child c(this, Loc);
- // Skip internals at the beginning of an archive.
- if (skip_internal && isInternalMember(*toHeader(Loc)))
- return c.getNext();
return c;
}
OpenPOWER on IntegriCloud