diff options
author | Kevin Enderby <enderby@apple.com> | 2016-07-29 17:44:13 +0000 |
---|---|---|
committer | Kevin Enderby <enderby@apple.com> | 2016-07-29 17:44:13 +0000 |
commit | f4586039f6c620864227f50917d3c488ec95e6be (patch) | |
tree | d63675cf10720b06d4aaa6b3b8de26031a7df140 /llvm/tools | |
parent | a51575ffa215c0a3558740694b3831b773498d15 (diff) | |
download | bcm5719-llvm-f4586039f6c620864227f50917d3c488ec95e6be.tar.gz bcm5719-llvm-f4586039f6c620864227f50917d3c488ec95e6be.zip |
The next step along the way to getting good error messages for bad archives.
As mentioned in commit log for r276686 this next step is adding a new
method in the ArchiveMemberHeader class to get the full name that
does proper error checking, and can be use for error messages.
To do this the name of ArchiveMemberHeader::getName() is changed to
ArchiveMemberHeader::getRawName() to be consistent with
Archive::Child::getRawName(). Then the “new” method is the addition
of a new implementation of ArchiveMemberHeader::getName() which gets
the full name and provides proper error checking. Which is mostly a rewrite
of what was Archive::Child::getName() and cleaning up incorrect uses of
llvm_unreachable() in the code which were actually just cases of errors
in the input Archives.
Then Archive::Child::getName() is changed to return Expected<> and use
the new implementation of ArchiveMemberHeader::getName() .
Also needed to change Archive::getMemoryBufferRef() with these
changes to return Expected<> as well to propagate Errors up.
As well as changing Archive::isThinMember() to return Expected<> .
llvm-svn: 277177
Diffstat (limited to 'llvm/tools')
-rw-r--r-- | llvm/tools/dsymutil/BinaryHolder.cpp | 4 | ||||
-rw-r--r-- | llvm/tools/llvm-ar/llvm-ar.cpp | 8 | ||||
-rw-r--r-- | llvm/tools/llvm-nm/llvm-nm.cpp | 13 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/MachODump.cpp | 15 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 7 | ||||
-rw-r--r-- | llvm/tools/llvm-size/llvm-size.cpp | 7 |
6 files changed, 33 insertions, 21 deletions
diff --git a/llvm/tools/dsymutil/BinaryHolder.cpp b/llvm/tools/dsymutil/BinaryHolder.cpp index e45f7fefe08..abb4ea083c4 100644 --- a/llvm/tools/dsymutil/BinaryHolder.cpp +++ b/llvm/tools/dsymutil/BinaryHolder.cpp @@ -115,8 +115,8 @@ BinaryHolder::GetArchiveMemberBuffers(StringRef Filename, if (Verbose) outs() << "\tfound member in current archive.\n"; auto ErrOrMem = Child.getMemoryBufferRef(); - if (auto Err = ErrOrMem.getError()) - return Err; + if (!ErrOrMem) + return errorToErrorCode(ErrOrMem.takeError()); Buffers.push_back(*ErrOrMem); } } diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp index dc1755de7d6..f52f9c376c1 100644 --- a/llvm/tools/llvm-ar/llvm-ar.cpp +++ b/llvm/tools/llvm-ar/llvm-ar.cpp @@ -409,8 +409,8 @@ static void performReadOperation(ArchiveOperation Operation, { Error Err; for (auto &C : OldArchive->children(Err)) { - ErrorOr<StringRef> NameOrErr = C.getName(); - failIfError(NameOrErr.getError()); + Expected<StringRef> NameOrErr = C.getName(); + failIfError(NameOrErr.takeError()); StringRef Name = NameOrErr.get(); if (Filter) { @@ -537,8 +537,8 @@ computeNewArchiveMembers(ArchiveOperation Operation, Error Err; for (auto &Child : OldArchive->children(Err)) { int Pos = Ret.size(); - ErrorOr<StringRef> NameOrErr = Child.getName(); - failIfError(NameOrErr.getError()); + Expected<StringRef> NameOrErr = Child.getName(); + failIfError(NameOrErr.takeError()); StringRef Name = NameOrErr.get(); if (Name == PosName) { assert(AddAfter || AddBefore); diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp index 9b2f5220bad..424303b1695 100644 --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -198,13 +198,14 @@ static void error(llvm::Error E, StringRef FileName, const Archive::Child &C, HadError = true; errs() << ToolName << ": " << FileName; - ErrorOr<StringRef> NameOrErr = C.getName(); + Expected<StringRef> NameOrErr = C.getName(); // TODO: if we have a error getting the name then it would be nice to print // the index of which archive member this is and or its offset in the // archive instead of "???" as the name. - if (NameOrErr.getError()) + if (!NameOrErr) { + consumeError(NameOrErr.takeError()); errs() << "(" << "???" << ")"; - else + } else errs() << "(" << NameOrErr.get() << ")"; if (!ArchitectureName.empty()) @@ -1099,9 +1100,11 @@ static void dumpSymbolNamesFromFile(std::string &Filename) { ErrorOr<Archive::Child> C = I->getMember(); if (error(C.getError())) return; - ErrorOr<StringRef> FileNameOrErr = C->getName(); - if (error(FileNameOrErr.getError())) + Expected<StringRef> FileNameOrErr = C->getName(); + if (!FileNameOrErr) { + error(FileNameOrErr.takeError(), Filename); return; + } StringRef SymName = I->getName(); outs() << SymName << " in " << FileNameOrErr.get() << "\n"; } diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp index 10cd407e377..8d924e568b7 100644 --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -1521,16 +1521,23 @@ static void printArchiveChild(StringRef Filename, const Archive::Child &C, } if (verbose) { - ErrorOr<StringRef> NameOrErr = C.getName(); - if (NameOrErr.getError()) { - StringRef RawName = C.getRawName(); + Expected<StringRef> NameOrErr = C.getName(); + if (!NameOrErr) { + consumeError(NameOrErr.takeError()); + Expected<StringRef> NameOrErr = C.getRawName(); + if (!NameOrErr) + report_error(Filename, C, NameOrErr.takeError(), ArchitectureName); + StringRef RawName = NameOrErr.get(); outs() << RawName << "\n"; } else { StringRef Name = NameOrErr.get(); outs() << Name << "\n"; } } else { - StringRef RawName = C.getRawName(); + Expected<StringRef> NameOrErr = C.getRawName(); + if (!NameOrErr) + report_error(Filename, C, NameOrErr.takeError(), ArchitectureName); + StringRef RawName = NameOrErr.get(); outs() << RawName << "\n"; } } diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index ed55c918b58..7482965b784 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -312,13 +312,14 @@ LLVM_ATTRIBUTE_NORETURN void llvm::report_error(StringRef ArchiveName, const object::Archive::Child &C, llvm::Error E, StringRef ArchitectureName) { - ErrorOr<StringRef> NameOrErr = C.getName(); + Expected<StringRef> NameOrErr = C.getName(); // TODO: if we have a error getting the name then it would be nice to print // the index of which archive member this is and or its offset in the // archive instead of "???" as the name. - if (NameOrErr.getError()) + if (!NameOrErr) { + consumeError(NameOrErr.takeError()); llvm::report_error(ArchiveName, "???", std::move(E), ArchitectureName); - else + } else llvm::report_error(ArchiveName, NameOrErr.get(), std::move(E), ArchitectureName); } diff --git a/llvm/tools/llvm-size/llvm-size.cpp b/llvm/tools/llvm-size/llvm-size.cpp index c5966ead4b6..4ecfcc2df10 100644 --- a/llvm/tools/llvm-size/llvm-size.cpp +++ b/llvm/tools/llvm-size/llvm-size.cpp @@ -114,13 +114,14 @@ static void error(llvm::Error E, StringRef FileName, const Archive::Child &C, HadError = true; errs() << ToolName << ": " << FileName; - ErrorOr<StringRef> NameOrErr = C.getName(); + Expected<StringRef> NameOrErr = C.getName(); // TODO: if we have a error getting the name then it would be nice to print // the index of which archive member this is and or its offset in the // archive instead of "???" as the name. - if (NameOrErr.getError()) + if (!NameOrErr) { + consumeError(NameOrErr.takeError()); errs() << "(" << "???" << ")"; - else + } else errs() << "(" << NameOrErr.get() << ")"; if (!ArchitectureName.empty()) |