summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Object/Archive.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-10-31 21:44:42 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-10-31 21:44:42 +0000
commit43358761f744da4ca6caf24bda2b7b92fddf4473 (patch)
treedc6486e7bd5272cf700bbe726c6ed1e5eb17085e /llvm/lib/Object/Archive.cpp
parent47b01d4f4fdee7f76057069e169ed49bebcb2260 (diff)
downloadbcm5719-llvm-43358761f744da4ca6caf24bda2b7b92fddf4473.tar.gz
bcm5719-llvm-43358761f744da4ca6caf24bda2b7b92fddf4473.zip
Don't store a Child to the first regular member.
This is a bit ugly, but has a few advantages: * Archive is now easy to copy since there is no Archive -> Child -> Archive loop. * It makes it clear that we already checked for errors when finding the Child data. llvm-svn: 251750
Diffstat (limited to 'llvm/lib/Object/Archive.cpp')
-rw-r--r--llvm/lib/Object/Archive.cpp25
1 files changed, 17 insertions, 8 deletions
diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp
index 4bb50a0f757..d50a69951e1 100644
--- a/llvm/lib/Object/Archive.cpp
+++ b/llvm/lib/Object/Archive.cpp
@@ -82,6 +82,10 @@ unsigned ArchiveMemberHeader::getGID() const {
return Ret;
}
+Archive::Child::Child(const Archive *Parent, StringRef Data,
+ uint16_t StartOfFile)
+ : Parent(Parent), Data(Data), StartOfFile(StartOfFile) {}
+
Archive::Child::Child(const Archive *Parent, const char *Start)
: Parent(Parent) {
if (!Start)
@@ -232,8 +236,13 @@ ErrorOr<std::unique_ptr<Archive>> Archive::create(MemoryBufferRef Source) {
return std::move(Ret);
}
+void Archive::setFirstRegular(const Child &C) {
+ FirstRegularData = C.Data;
+ FirstRegularStartOfFile = C.StartOfFile;
+}
+
Archive::Archive(MemoryBufferRef Source, std::error_code &ec)
- : Binary(Binary::ID_Archive, Source), FirstRegular(child_end()) {
+ : Binary(Binary::ID_Archive, Source) {
StringRef Buffer = Data.getBuffer();
// Check for sufficient magic.
if (Buffer.startswith(ThinMagic)) {
@@ -281,7 +290,7 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec)
// there is no error.
SymbolTable = *i->getBuffer();
++i;
- FirstRegular = i;
+ setFirstRegular(*i);
ec = std::error_code();
return;
}
@@ -300,7 +309,7 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec)
SymbolTable = *i->getBuffer();
++i;
}
- FirstRegular = i;
+ setFirstRegular(*i);
return;
}
@@ -331,14 +340,14 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec)
// ErrorOr.
StringTable = *i->getBuffer();
++i;
- FirstRegular = i;
+ setFirstRegular(*i);
ec = std::error_code();
return;
}
if (Name[0] != '/') {
Format = has64SymTable ? K_MIPS64 : K_GNU;
- FirstRegular = i;
+ setFirstRegular(*i);
ec = std::error_code();
return;
}
@@ -355,7 +364,7 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec)
++i;
if (i == e) {
- FirstRegular = i;
+ setFirstRegular(*i);
ec = std::error_code();
return;
}
@@ -369,7 +378,7 @@ Archive::Archive(MemoryBufferRef Source, std::error_code &ec)
++i;
}
- FirstRegular = i;
+ setFirstRegular(*i);
ec = std::error_code();
}
@@ -378,7 +387,7 @@ Archive::child_iterator Archive::child_begin(bool SkipInternal) const {
return child_end();
if (SkipInternal)
- return FirstRegular;
+ return Child(this, FirstRegularData, FirstRegularStartOfFile);
const char *Loc = Data.getBufferStart() + strlen(Magic);
Child c(this, Loc);
OpenPOWER on IntegriCloud