summaryrefslogtreecommitdiff
path: root/tools/llvm-ar
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2016-07-13 21:13:05 +0000
committerLang Hames <lhames@gmail.com>2016-07-13 21:13:05 +0000
commit9b42acafff06fbba8d335fa77079fc4e72002ac4 (patch)
tree00632ed82e9606126df11f3acc0853b96bbc7214 /tools/llvm-ar
parent3d35f0d482cf5ce6cf87d10a108ade79e7cc2065 (diff)
[Object] Change Archive::child_iterator for better interop with Error/Expected.
See http://reviews.llvm.org/D22079 Changes the Archive::child_begin and Archive::children to require a reference to an Error. If iterator increment fails (because the archive header is damaged) the iterator will be set to 'end()', and the error stored in the given Error&. The Error value should be checked by the user immediately after the loop. E.g.: Error Err; for (auto &C : A->children(Err)) { // Do something with archive child C. } // Check the error immediately after the loop. if (Err) return Err; Failure to check the Error will result in an abort() when the Error goes out of scope (as guaranteed by the Error class). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275316 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-ar')
-rw-r--r--tools/llvm-ar/llvm-ar.cpp68
1 files changed, 36 insertions, 32 deletions
diff --git a/tools/llvm-ar/llvm-ar.cpp b/tools/llvm-ar/llvm-ar.cpp
index d52355216b0..865152b6af8 100644
--- a/tools/llvm-ar/llvm-ar.cpp
+++ b/tools/llvm-ar/llvm-ar.cpp
@@ -405,35 +405,37 @@ static void performReadOperation(ArchiveOperation Operation,
fail("extracting from a thin archive is not supported");
bool Filter = !Members.empty();
- for (auto &ChildOrErr : OldArchive->children()) {
- failIfError(ChildOrErr.getError());
- const object::Archive::Child &C = *ChildOrErr;
-
- ErrorOr<StringRef> NameOrErr = C.getName();
- failIfError(NameOrErr.getError());
- StringRef Name = NameOrErr.get();
-
- if (Filter) {
- auto I = std::find(Members.begin(), Members.end(), Name);
- if (I == Members.end())
- continue;
- Members.erase(I);
- }
+ {
+ Error Err;
+ for (auto &C : OldArchive->children(Err)) {
+ ErrorOr<StringRef> NameOrErr = C.getName();
+ failIfError(NameOrErr.getError());
+ StringRef Name = NameOrErr.get();
- switch (Operation) {
- default:
- llvm_unreachable("Not a read operation");
- case Print:
- doPrint(Name, C);
- break;
- case DisplayTable:
- doDisplayTable(Name, C);
- break;
- case Extract:
- doExtract(Name, C);
- break;
+ if (Filter) {
+ auto I = std::find(Members.begin(), Members.end(), Name);
+ if (I == Members.end())
+ continue;
+ Members.erase(I);
+ }
+
+ switch (Operation) {
+ default:
+ llvm_unreachable("Not a read operation");
+ case Print:
+ doPrint(Name, C);
+ break;
+ case DisplayTable:
+ doDisplayTable(Name, C);
+ break;
+ case Extract:
+ doExtract(Name, C);
+ break;
+ }
}
+ failIfError(std::move(Err));
}
+
if (Members.empty())
return;
for (StringRef Name : Members)
@@ -531,9 +533,8 @@ computeNewArchiveMembers(ArchiveOperation Operation,
int InsertPos = -1;
StringRef PosName = sys::path::filename(RelPos);
if (OldArchive) {
- for (auto &ChildOrErr : OldArchive->children()) {
- failIfError(ChildOrErr.getError());
- auto &Child = ChildOrErr.get();
+ Error Err;
+ for (auto &Child : OldArchive->children(Err)) {
int Pos = Ret.size();
ErrorOr<StringRef> NameOrErr = Child.getName();
failIfError(NameOrErr.getError());
@@ -568,6 +569,7 @@ computeNewArchiveMembers(ArchiveOperation Operation,
if (MemberI != Members.end())
Members.erase(MemberI);
}
+ failIfError(std::move(Err));
}
if (Operation == Delete)
@@ -764,9 +766,11 @@ static void runMRIScript() {
"Could not parse library");
Archives.push_back(std::move(*LibOrErr));
object::Archive &Lib = *Archives.back();
- for (auto &MemberOrErr : Lib.children()) {
- failIfError(MemberOrErr.getError());
- addMember(NewMembers, *MemberOrErr);
+ {
+ Error Err;
+ for (auto &Member : Lib.children(Err))
+ addMember(NewMembers, Member);
+ failIfError(std::move(Err));
}
break;
}