Skip to content

Commit 18886db

Browse files
committedFeb 1, 2019
[llvm-objcopy][NFC] More error propagation (executeObjcopyOnArchive)
Summary: Replace some reportError() calls with error propagation that was missed from rL352625. Note this also adds an error check during Archive iteration that was being hidden by a different error check before: ``` for (const Archive::Child &Child : Ar.children(Err)) { Expected<std::unique_ptr<Binary>> ChildOrErr = Child.getAsBinary(); if (!ChildOrErr) // This aborts, so Err is never checked reportError(Ar.getFileName(), ChildOrErr.takeError()); ``` Err is being checked after the loop, so during happy runs, everything is fine. But when reportError is changed to return the error instead of aborting, the fact that Err is never checked is now noticed in tests that trigger an error during the loop. Reviewers: jhenderson, dblaikie, alexshap Reviewed By: dblaikie Subscribers: llvm-commits, lhames, jakehehrlich Tags: #llvm Differential Revision: https://reviews.llvm.org/D57462 llvm-svn: 352888
1 parent 94b9709 commit 18886db

File tree

1 file changed

+18
-14
lines changed

1 file changed

+18
-14
lines changed
 

‎llvm/tools/llvm-objcopy/llvm-objcopy.cpp

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,13 @@ static Error deepWriteArchive(StringRef ArcName,
9696
ArrayRef<NewArchiveMember> NewMembers,
9797
bool WriteSymtab, object::Archive::Kind Kind,
9898
bool Deterministic, bool Thin) {
99-
Error E =
100-
writeArchive(ArcName, NewMembers, WriteSymtab, Kind, Deterministic, Thin);
101-
if (!Thin || E)
102-
return E;
99+
if (Error E = writeArchive(ArcName, NewMembers, WriteSymtab, Kind,
100+
Deterministic, Thin))
101+
return createFileError(ArcName, std::move(E));
102+
103+
if (!Thin)
104+
return Error::success();
105+
103106
for (const NewArchiveMember &Member : NewMembers) {
104107
// Internally, FileBuffer will use the buffer created by
105108
// FileOutputBuffer::create, for regular files (that is the case for
@@ -149,14 +152,17 @@ static Error executeObjcopyOnArchive(const CopyConfig &Config,
149152
std::vector<NewArchiveMember> NewArchiveMembers;
150153
Error Err = Error::success();
151154
for (const Archive::Child &Child : Ar.children(Err)) {
155+
// FIXME: Archive::child_iterator requires that Err be checked *during* loop
156+
// iteration, and hence does not allow early returns.
157+
cantFail(std::move(Err));
152158
Expected<std::unique_ptr<Binary>> ChildOrErr = Child.getAsBinary();
153159
if (!ChildOrErr)
154-
reportError(Ar.getFileName(), ChildOrErr.takeError());
160+
return createFileError(Ar.getFileName(), ChildOrErr.takeError());
155161
Binary *Bin = ChildOrErr->get();
156162

157163
Expected<StringRef> ChildNameOrErr = Child.getName();
158164
if (!ChildNameOrErr)
159-
reportError(Ar.getFileName(), ChildNameOrErr.takeError());
165+
return createFileError(Ar.getFileName(), ChildNameOrErr.takeError());
160166

161167
MemBuffer MB(ChildNameOrErr.get());
162168
if (Error E = executeObjcopyOnBinary(Config, *Bin, MB))
@@ -165,19 +171,17 @@ static Error executeObjcopyOnArchive(const CopyConfig &Config,
165171
Expected<NewArchiveMember> Member =
166172
NewArchiveMember::getOldMember(Child, Config.DeterministicArchives);
167173
if (!Member)
168-
reportError(Ar.getFileName(), Member.takeError());
174+
return createFileError(Ar.getFileName(), Member.takeError());
169175
Member->Buf = MB.releaseMemoryBuffer();
170176
Member->MemberName = Member->Buf->getBufferIdentifier();
171177
NewArchiveMembers.push_back(std::move(*Member));
172178
}
173-
174179
if (Err)
175-
reportError(Config.InputFilename, std::move(Err));
176-
if (Error E = deepWriteArchive(Config.OutputFilename, NewArchiveMembers,
177-
Ar.hasSymbolTable(), Ar.kind(),
178-
Config.DeterministicArchives, Ar.isThin()))
179-
reportError(Config.OutputFilename, std::move(E));
180-
return Error::success();
180+
return createFileError(Config.InputFilename, std::move(Err));
181+
182+
return deepWriteArchive(Config.OutputFilename, NewArchiveMembers,
183+
Ar.hasSymbolTable(), Ar.kind(),
184+
Config.DeterministicArchives, Ar.isThin());
181185
}
182186

183187
static void restoreDateOnFile(StringRef Filename,

0 commit comments

Comments
 (0)
Please sign in to comment.