From f4586039f6c620864227f50917d3c488ec95e6be Mon Sep 17 00:00:00 2001 From: Kevin Enderby Date: Fri, 29 Jul 2016 17:44:13 +0000 Subject: The next step along the way to getting good error messages for bad archives. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- llvm/tools/llvm-objdump/llvm-objdump.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp') 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 NameOrErr = C.getName(); + Expected 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); } -- cgit v1.2.3