[llvm] r269784 - Change llvm-objdump, llvm-nm and llvm-size when reporting an object file error

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Tue May 17 14:50:26 PDT 2016


Hi Sanjoy,

This looks like a spurious dependence between MC and libObject. I've
removed it in r269844.

Just for good measure I also moved isNotObjectErrorInvalidFileType out of
the header in r269848.

- Lang.

On Tue, May 17, 2016 at 1:21 PM, Kevin Enderby via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Hi Sanjoy,
>
> Don’t know what is going on but I’ll ask Lang (two offices down from mine)
> and he will likely know what’s up.  We will try to get a fix asap.
>
> Kev
>
> > On May 17, 2016, at 1:15 PM, Sanjoy Das <sanjoy at playingwithpointers.com>
> wrote:
> >
> > On linux I get a link error on ToT that dissappears when I
> > revert this change:
> >
> > Scanning dependencies of target IRTests
> > [ 70%] Building CXX object
> > unittests/ADT/CMakeFiles/ADTTests.dir/APFloatTest.cpp.o
> > [ 70%] Building CXX object
> > unittests/Linker/CMakeFiles/LinkerTests.dir/LinkModulesTest.cpp.o
> > [ 70%] Building CXX object
> >
> unittests/Transforms/Utils/CMakeFiles/UtilsTests.dir/ASanStackFrameLayoutTest.cpp.o
> > [ 70%] Building CXX object
> > unittests/Analysis/CMakeFiles/AnalysisTests.dir/AliasAnalysisTest.cpp.o
> > [ 81%] Built target LLVMCodeGen
> > [ 81%] Building CXX object
> >
> unittests/Analysis/CMakeFiles/AnalysisTests.dir/BlockFrequencyInfoTest.cpp.o
> > [ 81%] Building CXX object
> > unittests/IR/CMakeFiles/IRTests.dir/AsmWriterTest.cpp.o
> > ../../lib/libLLVMMCDisassembler.a(MCRelocationInfo.cpp.o): In function
> > `llvm::object::make_error_code(llvm::object::object_error)':
> > /local/sanjoy/llvm.git/include/llvm/Object/Error.h:40: undefined
> > reference to `llvm::object::object_category()'
> > collect2: error: ld returned 1 exit status
> >
> >
> > Any idea what's going on?
> >
> > On Tue, May 17, 2016 at 10:10 AM, Kevin Enderby via llvm-commits
> > <llvm-commits at lists.llvm.org> wrote:
> >> Author: enderby
> >> Date: Tue May 17 12:10:12 2016
> >> New Revision: 269784
> >>
> >> URL: http://llvm.org/viewvc/llvm-project?rev=269784&view=rev
> >> Log:
> >> Change llvm-objdump, llvm-nm and llvm-size when reporting an object
> file error
> >> when the object is in an archive to use something like libx.a(foo.o) as
> part of
> >> the error message.
> >>
> >> Also changed llvm-objdump and llvm-size to be like llvm-nm and ignore
> non-object
> >> files in archives and not produce any error message.
> >>
> >> To do this Archive::Child::getAsBinary() was changed from ErrorOr<...>
> to
> >> Expected<...> then that was threaded up to its users.
> >>
> >> Converting this interface to Expected<> from ErrorOr<> does involve
> >> touching a number of places. To contain the changes for now the use of
> >> errorToErrorCode() is still used in one place yet to be fully converted.
> >>
> >> Again there some were bugs in the existing code that did not deal with
> the
> >> old ErrorOr<> return values.  So now with Expected<> since they must be
> >> checked and the error handled, I added a TODO and a comments for those.
> >>
> >> Added:
> >>    llvm/trunk/test/Object/Inputs/macho-bad-archive1.a   (with props)
> >>    llvm/trunk/test/Object/Inputs/macho-bad-archive2.a   (with props)
> >> Modified:
> >>    llvm/trunk/include/llvm/Object/Archive.h
> >>    llvm/trunk/include/llvm/Object/Error.h
> >>    llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp
> >>    llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h
> >>    llvm/trunk/lib/Object/Archive.cpp
> >>    llvm/trunk/test/Object/macho-invalid.test
> >>    llvm/trunk/test/Object/nm-archive.test
> >>    llvm/trunk/tools/llvm-cxxdump/llvm-cxxdump.cpp
> >>    llvm/trunk/tools/llvm-nm/llvm-nm.cpp
> >>    llvm/trunk/tools/llvm-objdump/MachODump.cpp
> >>    llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
> >>    llvm/trunk/tools/llvm-objdump/llvm-objdump.h
> >>    llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp
> >>    llvm/trunk/tools/llvm-size/llvm-size.cpp
> >>    llvm/trunk/tools/sancov/sancov.cc
> >>
> >> Modified: llvm/trunk/include/llvm/Object/Archive.h
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/Archive.h?rev=269784&r1=269783&r2=269784&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/include/llvm/Object/Archive.h (original)
> >> +++ llvm/trunk/include/llvm/Object/Archive.h Tue May 17 12:10:12 2016
> >> @@ -101,7 +101,7 @@ public:
> >>
> >>     ErrorOr<MemoryBufferRef> getMemoryBufferRef() const;
> >>
> >> -    ErrorOr<std::unique_ptr<Binary>>
> >> +    Expected<std::unique_ptr<Binary>>
> >>     getAsBinary(LLVMContext *Context = nullptr) const;
> >>   };
> >>
> >>
> >> Modified: llvm/trunk/include/llvm/Object/Error.h
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/Error.h?rev=269784&r1=269783&r2=269784&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/include/llvm/Object/Error.h (original)
> >> +++ llvm/trunk/include/llvm/Object/Error.h Tue May 17 12:10:12 2016
> >> @@ -81,4 +81,34 @@ template <>
> >> struct is_error_code_enum<llvm::object::object_error> : std::true_type
> {};
> >> }
> >>
> >> +namespace llvm {
> >> +namespace object {
> >> +
> >> +// isNotObjectErrorInvalidFileType() is used when looping through the
> children
> >> +// of an archive after calling getAsBinary() on the child and it
> returns an
> >> +// llvm::Error.  In the cases we want to loop through the children and
> ignore the
> >> +// non-objects in the archive this is used to test the error to see if
> an
> >> +// error() function needs to called on the llvm::Error.
> >> +static inline llvm::Error isNotObjectErrorInvalidFileType(llvm::Error
> Err) {
> >> +  if (auto Err2 =
> >> +       handleErrors(std::move(Err),
> >> +         [](std::unique_ptr<ECError> M) {
> >> +           // Try to handle 'M'. If successful, return a success value
> from
> >> +           // the handler.
> >> +           if (M->convertToErrorCode() ==
> object_error::invalid_file_type)
> >> +             return Error::success();
> >> +
> >> +           // We failed to handle 'M' - return it from the handler.
> >> +           // This value will be passed back from catchErrors and
> >> +           // wind up in Err2, where it will be returned from this
> function.
> >> +           return Error(std::move(M));
> >> +         }))
> >> +    return Err2;
> >> +  return Err;
> >> +}
> >> +
> >> +} // end namespace object.
> >> +
> >> +} // end namespace llvm.
> >> +
> >> #endif
> >>
> >> Modified: llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp?rev=269784&r1=269783&r2=269784&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp (original)
> >> +++ llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp Tue May 17 12:10:12
> 2016
> >> @@ -329,10 +329,13 @@ RuntimeDyld::SymbolInfo MCJIT::findSymbo
> >>       report_fatal_error(EC.message());
> >>     if (ChildIt != A->child_end()) {
> >>       // FIXME: Support nested archives?
> >> -      ErrorOr<std::unique_ptr<object::Binary>> ChildBinOrErr =
> >> +      Expected<std::unique_ptr<object::Binary>> ChildBinOrErr =
> >>           (*ChildIt)->getAsBinary();
> >> -      if (ChildBinOrErr.getError())
> >> +      if (!ChildBinOrErr) {
> >> +        // TODO: Actually report errors helpfully.
> >> +        consumeError(ChildBinOrErr.takeError());
> >>         continue;
> >> +      }
> >>       std::unique_ptr<object::Binary> &ChildBin = ChildBinOrErr.get();
> >>       if (ChildBin->isObject()) {
> >>         std::unique_ptr<object::ObjectFile> OF(
> >>
> >> Modified: llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h?rev=269784&r1=269783&r2=269784&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h (original)
> >> +++ llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h Tue May 17
> 12:10:12 2016
> >> @@ -263,10 +263,13 @@ private:
> >>         report_fatal_error(EC.message());
> >>       if (ChildIt != A->child_end()) {
> >>         // FIXME: Support nested archives?
> >> -        ErrorOr<std::unique_ptr<object::Binary>> ChildBinOrErr =
> >> +        Expected<std::unique_ptr<object::Binary>> ChildBinOrErr =
> >>             (*ChildIt)->getAsBinary();
> >> -        if (ChildBinOrErr.getError())
> >> +        if (!ChildBinOrErr) {
> >> +          // TODO: Actually report errors helpfully.
> >> +          consumeError(ChildBinOrErr.takeError());
> >>           continue;
> >> +        }
> >>         std::unique_ptr<object::Binary> &ChildBin = ChildBinOrErr.get();
> >>         if (ChildBin->isObject()) {
> >>           std::vector<std::unique_ptr<object::ObjectFile>> ObjSet;
> >>
> >> Modified: llvm/trunk/lib/Object/Archive.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/Archive.cpp?rev=269784&r1=269783&r2=269784&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/lib/Object/Archive.cpp (original)
> >> +++ llvm/trunk/lib/Object/Archive.cpp Tue May 17 12:10:12 2016
> >> @@ -228,6 +228,11 @@ ErrorOr<StringRef> Archive::Child::getNa
> >>     if (name.substr(3).rtrim(' ').getAsInteger(10, name_size))
> >>       llvm_unreachable("Long name length is not an ingeter");
> >>     return Data.substr(sizeof(ArchiveMemberHeader),
> name_size).rtrim('\0');
> >> +  } else {
> >> +    // It is not a long name so trim the blanks at the end of the name.
> >> +    if (name[name.size() - 1] != '/') {
> >> +      return name.rtrim(' ');
> >> +    }
> >>   }
> >>   // It's a simple name.
> >>   if (name[name.size() - 1] == '/')
> >> @@ -246,16 +251,16 @@ ErrorOr<MemoryBufferRef> Archive::Child:
> >>   return MemoryBufferRef(*Buf, Name);
> >> }
> >>
> >> -ErrorOr<std::unique_ptr<Binary>>
> >> +Expected<std::unique_ptr<Binary>>
> >> Archive::Child::getAsBinary(LLVMContext *Context) const {
> >>   ErrorOr<MemoryBufferRef> BuffOrErr = getMemoryBufferRef();
> >>   if (std::error_code EC = BuffOrErr.getError())
> >> -    return EC;
> >> +    return errorCodeToError(EC);
> >>
> >>   auto BinaryOrErr = createBinary(BuffOrErr.get(), Context);
> >>   if (BinaryOrErr)
> >>     return std::move(*BinaryOrErr);
> >> -  return errorToErrorCode(BinaryOrErr.takeError());
> >> +  return BinaryOrErr.takeError();
> >> }
> >>
> >> ErrorOr<std::unique_ptr<Archive>> Archive::create(MemoryBufferRef
> Source) {
> >>
> >> Added: llvm/trunk/test/Object/Inputs/macho-bad-archive1.a
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/macho-bad-archive1.a?rev=269784&view=auto
> >>
> ==============================================================================
> >> Binary file - no diff available.
> >>
> >> Propchange: llvm/trunk/test/Object/Inputs/macho-bad-archive1.a
> >>
> ------------------------------------------------------------------------------
> >>    svn:mime-type = application/octet-stream
> >>
> >> Added: llvm/trunk/test/Object/Inputs/macho-bad-archive2.a
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/macho-bad-archive2.a?rev=269784&view=auto
> >>
> ==============================================================================
> >> Binary file - no diff available.
> >>
> >> Propchange: llvm/trunk/test/Object/Inputs/macho-bad-archive2.a
> >>
> ------------------------------------------------------------------------------
> >>    svn:mime-type = application/octet-stream
> >>
> >> Modified: llvm/trunk/test/Object/macho-invalid.test
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/macho-invalid.test?rev=269784&r1=269783&r2=269784&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/test/Object/macho-invalid.test (original)
> >> +++ llvm/trunk/test/Object/macho-invalid.test Tue May 17 12:10:12 2016
> >> @@ -56,6 +56,10 @@ RUN: llvm-nm -pax %p/Inputs/macho-invali
> >> RUN:      | FileCheck -check-prefix NAME-PAST-EOF-nm-pax %s
> >> NAME-PAST-EOF-nm-pax: 0000000000000000 64 00 0000 fe000002 bad string
> index
> >>
> >> +RUN: not llvm-objdump -t %p/Inputs/macho-bad-archive1.a 2>&1 \
> >> +RUN:      | FileCheck -check-prefix NAME-PAST-EOF-ARCHIVE %s
> >> +NAME-PAST-EOF-ARCHIVE:
> macho-bad-archive1.a(macho-invalid-symbol-name-past-eof) truncated or
> malformed object (bad string index: 4261412866 for symbol at index 0)
> >> +
> >> RUN: llvm-nm %p/Inputs/macho-invalid-section-index-getSectionRawName
> 2>&1 \
> >> RUN:      | FileCheck -check-prefix INVALID-SECTION-IDX-SYMBOL-SEC %s
> >> INVALID-SECTION-IDX-SYMBOL-SEC: 0000000100000000 S __mh_execute_header
> >> @@ -74,3 +78,6 @@ INVALID-HEADER: The file was not recogni
> >>
> >> RUN: not llvm-objdump -macho -private-headers
> %p/Inputs/macho64-invalid-incomplete-segment-load-command 2>&1 | FileCheck
> -check-prefix INCOMPLETE-SEGMENT-LOADC %s
> >> INCOMPLETE-SEGMENT-LOADC: truncated or malformed object (load commands
> extend past the end of the file)
> >> +
> >> +RUN: not llvm-objdump -macho -private-headers
> %p/Inputs/macho-bad-archive2.a 2>&1 | FileCheck -check-prefix
> INCOMPLETE-SEGMENT-LOADC-ARCHIVE %s
> >> +INCOMPLETE-SEGMENT-LOADC-ARCHIVE:
> macho-bad-archive2.a(macho64-invalid-incomplete-segment-load-command)
> truncated or malformed object (load commands extend past the end of the
> file)
> >>
> >> Modified: llvm/trunk/test/Object/nm-archive.test
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/nm-archive.test?rev=269784&r1=269783&r2=269784&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/test/Object/nm-archive.test (original)
> >> +++ llvm/trunk/test/Object/nm-archive.test Tue May 17 12:10:12 2016
> >> @@ -55,9 +55,10 @@ RUN: llvm-nm %p/Inputs/archive-test.a-em
> >>
> >> This archive has an unaligned member and a unknown format member.
> >> GNU AR is able to parse the unaligned member and warns about the member
> with
> >> -the unknown format. We should probably simply warn on both. For now
> just check
> >> -that we don't produce an error.
> >> -RUN: llvm-nm %p/Inputs/corrupt-archive.a
> >> +the unknown format. We should probably simply warn on both. For now we
> just
> >> +produce an error for the unknown format.
> >> +RUN: not llvm-nm %p/Inputs/corrupt-archive.a 2>&1 | FileCheck %s
> -check-prefix CORRUPT
> >> +CORRUPT: corrupt-archive.a(trivial-object-test2.elf-x86-64) Invalid
> data was encountered while parsing the file
> >>
> >>
> >> RUN: llvm-nm %p/Inputs/thin.a | FileCheck %s -check-prefix THIN
> >>
> >> Modified: llvm/trunk/tools/llvm-cxxdump/llvm-cxxdump.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cxxdump/llvm-cxxdump.cpp?rev=269784&r1=269783&r2=269784&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/tools/llvm-cxxdump/llvm-cxxdump.cpp (original)
> >> +++ llvm/trunk/tools/llvm-cxxdump/llvm-cxxdump.cpp Tue May 17 12:10:12
> 2016
> >> @@ -485,11 +485,17 @@ static void dumpArchive(const Archive *A
> >>   for (auto &ErrorOrChild : Arc->children()) {
> >>     error(ErrorOrChild.getError());
> >>     const Archive::Child &ArcC = *ErrorOrChild;
> >> -    ErrorOr<std::unique_ptr<Binary>> ChildOrErr = ArcC.getAsBinary();
> >> -    if (std::error_code EC = ChildOrErr.getError()) {
> >> +    Expected<std::unique_ptr<Binary>> ChildOrErr = ArcC.getAsBinary();
> >> +    if (!ChildOrErr) {
> >>       // Ignore non-object files.
> >> -      if (EC != object_error::invalid_file_type)
> >> -        reportError(Arc->getFileName(), EC.message());
> >> +      if (auto E =
> isNotObjectErrorInvalidFileType(ChildOrErr.takeError())) {
> >> +        std::string Buf;
> >> +        raw_string_ostream OS(Buf);
> >> +        logAllUnhandledErrors(std::move(E), OS, "");
> >> +        OS.flush();
> >> +        reportError(Arc->getFileName(), Buf);
> >> +      }
> >> +      ChildOrErr.takeError();
> >>       continue;
> >>     }
> >>
> >>
> >> Modified: llvm/trunk/tools/llvm-nm/llvm-nm.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-nm/llvm-nm.cpp?rev=269784&r1=269783&r2=269784&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/tools/llvm-nm/llvm-nm.cpp (original)
> >> +++ llvm/trunk/tools/llvm-nm/llvm-nm.cpp Tue May 17 12:10:12 2016
> >> @@ -190,6 +190,29 @@ static bool error(std::error_code EC, Tw
> >>   return false;
> >> }
> >>
> >> +// This version of error() prints the archive name and member name,
> for example:
> >> +// "libx.a(foo.o)" after the ToolName before the error message.  It
> sets
> >> +// HadError but returns allowing the code to move on to other archive
> members.
> >> +static void error(llvm::Error E, StringRef FileName, const
> Archive::Child &C) {
> >> +  HadError = true;
> >> +  errs() << ToolName << ": " << FileName;
> >> +
> >> +  ErrorOr<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())
> >> +    errs() << "(" << "???" << ")";
> >> +  else
> >> +    errs() << "(" << NameOrErr.get() << ")";
> >> +
> >> +  std::string Buf;
> >> +  raw_string_ostream OS(Buf);
> >> +  logAllUnhandledErrors(std::move(E), OS, "");
> >> +  OS.flush();
> >> +  errs() << " " << Buf << "\n";
> >> +}
> >> +
> >> namespace {
> >> struct NMSymbol {
> >>   uint64_t Address;
> >> @@ -1066,9 +1089,12 @@ static void dumpSymbolNamesFromFile(std:
> >>       if (error(I->getError()))
> >>         return;
> >>       auto &C = I->get();
> >> -      ErrorOr<std::unique_ptr<Binary>> ChildOrErr =
> C.getAsBinary(&Context);
> >> -      if (ChildOrErr.getError())
> >> +      Expected<std::unique_ptr<Binary>> ChildOrErr =
> C.getAsBinary(&Context);
> >> +      if (!ChildOrErr) {
> >> +        if (auto E =
> isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))
> >> +          error(std::move(E), Filename, C);
> >>         continue;
> >> +      }
> >>       if (SymbolicFile *O = dyn_cast<SymbolicFile>(&*ChildOrErr.get()))
> {
> >>         if (!checkMachOAndArchFlags(O, Filename))
> >>           return;
> >> @@ -1124,10 +1150,14 @@ static void dumpSymbolNamesFromFile(std:
> >>                 if (error(AI->getError()))
> >>                   return;
> >>                 auto &C = AI->get();
> >> -                ErrorOr<std::unique_ptr<Binary>> ChildOrErr =
> >> +                Expected<std::unique_ptr<Binary>> ChildOrErr =
> >>                     C.getAsBinary(&Context);
> >> -                if (ChildOrErr.getError())
> >> +                if (!ChildOrErr) {
> >> +                  if (auto E = isNotObjectErrorInvalidFileType(
> >> +                                       ChildOrErr.takeError()))
> >> +                    error(std::move(E), Filename, C);
> >>                   continue;
> >> +                }
> >>                 if (SymbolicFile *O =
> >>                         dyn_cast<SymbolicFile>(&*ChildOrErr.get())) {
> >>                   if (PrintFileName) {
> >> @@ -1181,10 +1211,14 @@ static void dumpSymbolNamesFromFile(std:
> >>               if (error(AI->getError()))
> >>                 return;
> >>               auto &C = AI->get();
> >> -              ErrorOr<std::unique_ptr<Binary>> ChildOrErr =
> >> +              Expected<std::unique_ptr<Binary>> ChildOrErr =
> >>                   C.getAsBinary(&Context);
> >> -              if (ChildOrErr.getError())
> >> +              if (!ChildOrErr) {
> >> +                if (auto E = isNotObjectErrorInvalidFileType(
> >> +                                     ChildOrErr.takeError()))
> >> +                  error(std::move(E), Filename, C);
> >>                 continue;
> >> +              }
> >>               if (SymbolicFile *O =
> >>                       dyn_cast<SymbolicFile>(&*ChildOrErr.get())) {
> >>                 if (PrintFileName)
> >> @@ -1233,9 +1267,13 @@ static void dumpSymbolNamesFromFile(std:
> >>           if (error(AI->getError()))
> >>             return;
> >>           auto &C = AI->get();
> >> -          ErrorOr<std::unique_ptr<Binary>> ChildOrErr =
> C.getAsBinary(&Context);
> >> -          if (ChildOrErr.getError())
> >> +          Expected<std::unique_ptr<Binary>> ChildOrErr =
> C.getAsBinary(&Context);
> >> +          if (!ChildOrErr) {
> >> +            if (auto E = isNotObjectErrorInvalidFileType(
> >> +                                 ChildOrErr.takeError()))
> >> +              error(std::move(E), Filename, C);
> >>             continue;
> >> +          }
> >>           if (SymbolicFile *O =
> dyn_cast<SymbolicFile>(&*ChildOrErr.get())) {
> >>             if (PrintFileName) {
> >>               ArchiveName = A->getFileName();
> >>
> >> Modified: llvm/trunk/tools/llvm-objdump/MachODump.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/MachODump.cpp?rev=269784&r1=269783&r2=269784&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/tools/llvm-objdump/MachODump.cpp (original)
> >> +++ llvm/trunk/tools/llvm-objdump/MachODump.cpp Tue May 17 12:10:12 2016
> >> @@ -1211,7 +1211,7 @@ static void ProcessMachO(StringRef Filen
> >>   // If we are doing some processing here on the Mach-O file print the
> header
> >>   // info.  And don't print it otherwise like in the case of printing
> the
> >>   // UniversalHeaders or ArchiveHeaders.
> >> -  if (Disassemble || PrivateHeaders || ExportsTrie || Rebase || Bind ||
> >> +  if (Disassemble || PrivateHeaders || ExportsTrie || Rebase || Bind
> || SymbolTable ||
> >>       LazyBind || WeakBind || IndirectSymbols || DataInCode ||
> LinkOptHints ||
> >>       DylibsUsed || DylibId || ObjcMetaData || (FilterSections.size()
> != 0)) {
> >>     outs() << Filename;
> >> @@ -1244,8 +1244,10 @@ static void ProcessMachO(StringRef Filen
> >>     PrintDylibs(MachOOF, false);
> >>   if (DylibId)
> >>     PrintDylibs(MachOOF, true);
> >> -  if (SymbolTable)
> >> -    PrintSymbolTable(MachOOF);
> >> +  if (SymbolTable) {
> >> +    StringRef ArchiveName = ArchiveMemberName == StringRef() ? "" :
> Filename;
> >> +    PrintSymbolTable(MachOOF, ArchiveName);
> >> +  }
> >>   if (UnwindInfo)
> >>     printMachOUnwindInfo(MachOOF);
> >>   if (PrivateHeaders) {
> >> @@ -1552,9 +1554,12 @@ void llvm::ParseInputMachO(StringRef Fil
> >>       if (std::error_code EC = I->getError())
> >>         report_error(Filename, EC);
> >>       auto &C = I->get();
> >> -      ErrorOr<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();
> >> -      if (ChildOrErr.getError())
> >> +      Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();
> >> +      if (!ChildOrErr) {
> >> +        if (auto E =
> isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))
> >> +          report_error(Filename, C, std::move(E));
> >>         continue;
> >> +      }
> >>       if (MachOObjectFile *O =
> dyn_cast<MachOObjectFile>(&*ChildOrErr.get())) {
> >>         if (!checkMachOAndArchFlags(O, Filename))
> >>           return;
> >> @@ -1603,9 +1608,12 @@ void llvm::ParseInputMachO(StringRef Fil
> >>                 if (std::error_code EC = AI->getError())
> >>                   report_error(Filename, EC);
> >>                 auto &C = AI->get();
> >> -                ErrorOr<std::unique_ptr<Binary>> ChildOrErr =
> C.getAsBinary();
> >> -                if (ChildOrErr.getError())
> >> +                Expected<std::unique_ptr<Binary>> ChildOrErr =
> C.getAsBinary();
> >> +                if (!ChildOrErr) {
> >> +                  if (auto E =
> isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))
> >> +                    report_error(Filename, C, std::move(E));
> >>                   continue;
> >> +                }
> >>                 if (MachOObjectFile *O =
> >>                         dyn_cast<MachOObjectFile>(&*ChildOrErr.get()))
> >>                   ProcessMachO(Filename, O, O->getFileName(),
> ArchitectureName);
> >> @@ -1648,9 +1656,12 @@ void llvm::ParseInputMachO(StringRef Fil
> >>               if (std::error_code EC = AI->getError())
> >>                 report_error(Filename, EC);
> >>               auto &C = AI->get();
> >> -              ErrorOr<std::unique_ptr<Binary>> ChildOrErr =
> C.getAsBinary();
> >> -              if (ChildOrErr.getError())
> >> +              Expected<std::unique_ptr<Binary>> ChildOrErr =
> C.getAsBinary();
> >> +              if (!ChildOrErr) {
> >> +                if (auto E =
> isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))
> >> +                  report_error(Filename, C, std::move(E));
> >>                 continue;
> >> +              }
> >>               if (MachOObjectFile *O =
> >>                       dyn_cast<MachOObjectFile>(&*ChildOrErr.get()))
> >>                 ProcessMachO(Filename, O, O->getFileName());
> >> @@ -1687,9 +1698,12 @@ void llvm::ParseInputMachO(StringRef Fil
> >>           if (std::error_code EC = AI->getError())
> >>             report_error(Filename, EC);
> >>           auto &C = AI->get();
> >> -          ErrorOr<std::unique_ptr<Binary>> ChildOrErr =
> C.getAsBinary();
> >> -          if (ChildOrErr.getError())
> >> +          Expected<std::unique_ptr<Binary>> ChildOrErr =
> C.getAsBinary();
> >> +          if (!ChildOrErr) {
> >> +            if (auto E =
> isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))
> >> +              report_error(Filename, C, std::move(E));
> >>             continue;
> >> +          }
> >>           if (MachOObjectFile *O =
> >>                   dyn_cast<MachOObjectFile>(&*ChildOrErr.get())) {
> >>             if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(O))
> >>
> >> Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp?rev=269784&r1=269783&r2=269784&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp (original)
> >> +++ llvm/trunk/tools/llvm-objdump/llvm-objdump.cpp Tue May 17 12:10:12
> 2016
> >> @@ -281,6 +281,36 @@ LLVM_ATTRIBUTE_NORETURN void llvm::repor
> >>   exit(1);
> >> }
> >>
> >> +LLVM_ATTRIBUTE_NORETURN void llvm::report_error(StringRef ArchiveName,
> >> +                                                StringRef FileName,
> >> +                                                llvm::Error E) {
> >> +  assert(E);
> >> +  errs() << ToolName << ": ";
> >> +  if (ArchiveName != "")
> >> +    errs() << ArchiveName << "(" << FileName << ")";
> >> +  else
> >> +    errs() << FileName;
> >> +  std::string Buf;
> >> +  raw_string_ostream OS(Buf);
> >> +  logAllUnhandledErrors(std::move(E), OS, "");
> >> +  OS.flush();
> >> +  errs() << " " << Buf;
> >> +  exit(1);
> >> +}
> >> +
> >> +LLVM_ATTRIBUTE_NORETURN void llvm::report_error(StringRef ArchiveName,
> >> +                                                const
> object::Archive::Child &C,
> >> +                                                llvm::Error E) {
> >> +  ErrorOr<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())
> >> +    llvm::report_error(ArchiveName, "???", std::move(E));
> >> +  else
> >> +    llvm::report_error(ArchiveName, NameOrErr.get(), std::move(E));
> >> +}
> >> +
> >> static const Target *getTarget(const ObjectFile *Obj = nullptr) {
> >>   // Figure out the target triple.
> >>   llvm::Triple TheTriple("unknown-unknown-unknown");
> >> @@ -1346,7 +1376,7 @@ void llvm::PrintSectionContents(const Ob
> >>   }
> >> }
> >>
> >> -void llvm::PrintSymbolTable(const ObjectFile *o) {
> >> +void llvm::PrintSymbolTable(const ObjectFile *o, StringRef
> ArchiveName) {
> >>   outs() << "SYMBOL TABLE:\n";
> >>
> >>   if (const COFFObjectFile *coff = dyn_cast<const COFFObjectFile>(o)) {
> >> @@ -1359,7 +1389,7 @@ void llvm::PrintSymbolTable(const Object
> >>     uint64_t Address = *AddressOrError;
> >>     Expected<SymbolRef::Type> TypeOrError = Symbol.getType();
> >>     if (!TypeOrError)
> >> -      report_error(o->getFileName(), TypeOrError.takeError());
> >> +      report_error(ArchiveName, o->getFileName(),
> TypeOrError.takeError());
> >>     SymbolRef::Type Type = *TypeOrError;
> >>     uint32_t Flags = Symbol.getFlags();
> >>     Expected<section_iterator> SectionOrErr = Symbol.getSection();
> >> @@ -1371,7 +1401,7 @@ void llvm::PrintSymbolTable(const Object
> >>     } else {
> >>       Expected<StringRef> NameOrErr = Symbol.getName();
> >>       if (!NameOrErr)
> >> -        report_error(o->getFileName(), NameOrErr.takeError());
> >> +        report_error(ArchiveName, o->getFileName(),
> NameOrErr.takeError());
> >>       Name = *NameOrErr;
> >>     }
> >>
> >> @@ -1603,12 +1633,16 @@ static void printFirstPrivateFileHeader(
> >>     report_fatal_error("Invalid/Unsupported object file format");
> >> }
> >>
> >> -static void DumpObject(const ObjectFile *o) {
> >> +static void DumpObject(const ObjectFile *o, const Archive *a =
> nullptr) {
> >> +  StringRef ArchiveName = a != nullptr ? a->getFileName() : "";
> >>   // Avoid other output when using a raw option.
> >>   if (!RawClangAST) {
> >>     outs() << '\n';
> >> -    outs() << o->getFileName()
> >> -           << ":\tfile format " << o->getFileFormatName() << "\n\n";
> >> +    if (a)
> >> +      outs() << a->getFileName() << "(" << o->getFileName() << ")";
> >> +    else
> >> +      outs() << o->getFileName();
> >> +    outs() << ":\tfile format " << o->getFileFormatName() << "\n\n";
> >>   }
> >>
> >>   if (Disassemble)
> >> @@ -1620,7 +1654,7 @@ static void DumpObject(const ObjectFile
> >>   if (SectionContents)
> >>     PrintSectionContents(o);
> >>   if (SymbolTable)
> >> -    PrintSymbolTable(o);
> >> +    PrintSymbolTable(o, ArchiveName);
> >>   if (UnwindInfo)
> >>     PrintUnwindInfo(o);
> >>   if (PrivateHeaders)
> >> @@ -1654,12 +1688,14 @@ static void DumpArchive(const Archive *a
> >>     if (std::error_code EC = ErrorOrChild.getError())
> >>       report_error(a->getFileName(), EC);
> >>     const Archive::Child &C = *ErrorOrChild;
> >> -    ErrorOr<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();
> >> -    if (std::error_code EC = ChildOrErr.getError())
> >> -      if (EC != object_error::invalid_file_type)
> >> -        report_error(a->getFileName(), EC);
> >> +    Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary();
> >> +    if (!ChildOrErr) {
> >> +      if (auto E =
> isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))
> >> +        report_error(a->getFileName(), C, std::move(E));
> >> +      continue;
> >> +    }
> >>     if (ObjectFile *o = dyn_cast<ObjectFile>(&*ChildOrErr.get()))
> >> -      DumpObject(o);
> >> +      DumpObject(o, a);
> >>     else
> >>       report_error(a->getFileName(), object_error::invalid_file_type);
> >>   }
> >>
> >> Modified: llvm/trunk/tools/llvm-objdump/llvm-objdump.h
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/llvm-objdump.h?rev=269784&r1=269783&r2=269784&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/tools/llvm-objdump/llvm-objdump.h (original)
> >> +++ llvm/trunk/tools/llvm-objdump/llvm-objdump.h Tue May 17 12:10:12
> 2016
> >> @@ -13,6 +13,7 @@
> >> #include "llvm/Support/CommandLine.h"
> >> #include "llvm/Support/Compiler.h"
> >> #include "llvm/Support/DataTypes.h"
> >> +#include "llvm/Object/Archive.h"
> >>
> >> namespace llvm {
> >> class StringRef;
> >> @@ -21,6 +22,7 @@ namespace object {
> >>   class COFFObjectFile;
> >>   class MachOObjectFile;
> >>   class ObjectFile;
> >> +  class Archive;
> >>   class RelocationRef;
> >> }
> >>
> >> @@ -84,9 +86,15 @@ void printRawClangAST(const object::Obje
> >> void PrintRelocations(const object::ObjectFile *o);
> >> void PrintSectionHeaders(const object::ObjectFile *o);
> >> void PrintSectionContents(const object::ObjectFile *o);
> >> -void PrintSymbolTable(const object::ObjectFile *o);
> >> +void PrintSymbolTable(const object::ObjectFile *o, StringRef
> ArchiveName);
> >> LLVM_ATTRIBUTE_NORETURN void report_error(StringRef File,
> std::error_code EC);
> >> LLVM_ATTRIBUTE_NORETURN void report_error(StringRef File, llvm::Error
> E);
> >> +LLVM_ATTRIBUTE_NORETURN void report_error(StringRef FileName,
> >> +                                          StringRef ArchiveName,
> >> +                                          llvm::Error E);
> >> +LLVM_ATTRIBUTE_NORETURN void report_error(StringRef ArchiveName,
> >> +                                          const object::Archive::Child
> &C,
> >> +                                          llvm::Error E);
> >>
> >> } // end namespace llvm
> >>
> >>
> >> Modified: llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp?rev=269784&r1=269783&r2=269784&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp (original)
> >> +++ llvm/trunk/tools/llvm-readobj/llvm-readobj.cpp Tue May 17 12:10:12
> 2016
> >> @@ -421,14 +421,17 @@ static void dumpArchive(const Archive *A
> >>     if (std::error_code EC = ErrorOrChild.getError())
> >>       reportError(Arc->getFileName(), EC.message());
> >>     const auto &Child = *ErrorOrChild;
> >> -    ErrorOr<std::unique_ptr<Binary>> ChildOrErr = Child.getAsBinary();
> >> -    if (std::error_code EC = ChildOrErr.getError()) {
> >> -      // Ignore non-object files.
> >> -      if (EC != object_error::invalid_file_type)
> >> -        reportError(Arc->getFileName(), EC.message());
> >> +    Expected<std::unique_ptr<Binary>> ChildOrErr = Child.getAsBinary();
> >> +    if (!ChildOrErr) {
> >> +      if (auto E =
> isNotObjectErrorInvalidFileType(ChildOrErr.takeError())) {
> >> +        std::string Buf;
> >> +        raw_string_ostream OS(Buf);
> >> +        logAllUnhandledErrors(ChildOrErr.takeError(), OS, "");
> >> +        OS.flush();
> >> +        reportError(Arc->getFileName(), Buf);
> >> +      }
> >>       continue;
> >>     }
> >> -
> >>     if (ObjectFile *Obj = dyn_cast<ObjectFile>(&*ChildOrErr.get()))
> >>       dumpObject(Obj);
> >>     else
> >>
> >> Modified: llvm/trunk/tools/llvm-size/llvm-size.cpp
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-size/llvm-size.cpp?rev=269784&r1=269783&r2=269784&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/tools/llvm-size/llvm-size.cpp (original)
> >> +++ llvm/trunk/tools/llvm-size/llvm-size.cpp Tue May 17 12:10:12 2016
> >> @@ -99,6 +99,29 @@ static bool error(std::error_code ec) {
> >>   return true;
> >> }
> >>
> >> +// This version of error() prints the archive name and member name,
> for example:
> >> +// "libx.a(foo.o)" after the ToolName before the error message.  It
> sets
> >> +// HadError but returns allowing the code to move on to other archive
> members.
> >> +static void error(llvm::Error E, StringRef FileName, const
> Archive::Child &C) {
> >> +  HadError = true;
> >> +  errs() << ToolName << ": " << FileName;
> >> +
> >> +  ErrorOr<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())
> >> +    errs() << "(" << "???" << ")";
> >> +  else
> >> +    errs() << "(" << NameOrErr.get() << ")";
> >> +
> >> +  std::string Buf;
> >> +  raw_string_ostream OS(Buf);
> >> +  logAllUnhandledErrors(std::move(E), OS, "");
> >> +  OS.flush();
> >> +  errs() << " " << Buf << "\n";
> >> +}
> >> +
> >> /// Get the length of the string that represents @p num in Radix
> including the
> >> /// leading 0x or 0 for hexadecimal and octal respectively.
> >> static size_t getNumLengthAsString(uint64_t num) {
> >> @@ -480,9 +503,12 @@ static void printFileSectionSizes(String
> >>          i != e; ++i) {
> >>       if (error(i->getError()))
> >>         exit(1);
> >> -      ErrorOr<std::unique_ptr<Binary>> ChildOrErr =
> i->get().getAsBinary();
> >> -      if (error(ChildOrErr.getError()))
> >> +      Expected<std::unique_ptr<Binary>> ChildOrErr =
> i->get().getAsBinary();
> >> +      if (!ChildOrErr) {
> >> +        if (auto E =
> isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))
> >> +          error(std::move(E), a->getFileName(), i->get());
> >>         continue;
> >> +      }
> >>       if (ObjectFile *o = dyn_cast<ObjectFile>(&*ChildOrErr.get())) {
> >>         MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(o);
> >>         if (!checkMachOAndArchFlags(o, file))
> >> @@ -542,9 +568,13 @@ static void printFileSectionSizes(String
> >>                    i != e; ++i) {
> >>                 if (error(i->getError()))
> >>                   exit(1);
> >> -                ErrorOr<std::unique_ptr<Binary>> ChildOrErr =
> i->get().getAsBinary();
> >> -                if (error(ChildOrErr.getError()))
> >> +                Expected<std::unique_ptr<Binary>> ChildOrErr =
> >> +
> i->get().getAsBinary();
> >> +                if (!ChildOrErr) {
> >> +                  if (auto E =
> isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))
> >> +                    error(std::move(E), a->getFileName(), i->get());
> >>                   continue;
> >> +                }
> >>                 if (ObjectFile *o =
> dyn_cast<ObjectFile>(&*ChildOrErr.get())) {
> >>                   MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(o);
> >>                   if (OutputFormat == sysv)
> >> @@ -618,9 +648,13 @@ static void printFileSectionSizes(String
> >>                  i != e; ++i) {
> >>               if (error(i->getError()))
> >>                 exit(1);
> >> -              ErrorOr<std::unique_ptr<Binary>> ChildOrErr =
> i->get().getAsBinary();
> >> -              if (error(ChildOrErr.getError()))
> >> +              Expected<std::unique_ptr<Binary>> ChildOrErr =
> >> +                                                i->get().getAsBinary();
> >> +              if (!ChildOrErr) {
> >> +                if (auto E =
> isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))
> >> +                  error(std::move(E), a->getFileName(), i->get());
> >>                 continue;
> >> +              }
> >>               if (ObjectFile *o =
> dyn_cast<ObjectFile>(&*ChildOrErr.get())) {
> >>                 MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(o);
> >>                 if (OutputFormat == sysv)
> >> @@ -681,9 +715,12 @@ static void printFileSectionSizes(String
> >>              i != e; ++i) {
> >>           if (error(i->getError()))
> >>             exit(1);
> >> -          ErrorOr<std::unique_ptr<Binary>> ChildOrErr =
> i->get().getAsBinary();
> >> -          if (error(ChildOrErr.getError()))
> >> +          Expected<std::unique_ptr<Binary>> ChildOrErr =
> i->get().getAsBinary();
> >> +          if (!ChildOrErr) {
> >> +            if (auto E =
> isNotObjectErrorInvalidFileType(ChildOrErr.takeError()))
> >> +              error(std::move(E), UA->getFileName(), i->get());
> >>             continue;
> >> +          }
> >>           if (ObjectFile *o = dyn_cast<ObjectFile>(&*ChildOrErr.get()))
> {
> >>             MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(o);
> >>             if (OutputFormat == sysv)
> >>
> >> Modified: llvm/trunk/tools/sancov/sancov.cc
> >> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/sancov/sancov.cc?rev=269784&r1=269783&r2=269784&view=diff
> >>
> ==============================================================================
> >> --- llvm/trunk/tools/sancov/sancov.cc (original)
> >> +++ llvm/trunk/tools/sancov/sancov.cc Tue May 17 12:10:12 2016
> >> @@ -414,8 +414,8 @@ visitObjectFiles(const object::Archive &
> >>   for (auto &ErrorOrChild : A.children()) {
> >>     FailIfError(ErrorOrChild);
> >>     const object::Archive::Child &C = *ErrorOrChild;
> >> -    ErrorOr<std::unique_ptr<object::Binary>> ChildOrErr =
> C.getAsBinary();
> >> -    FailIfError(ChildOrErr);
> >> +    Expected<std::unique_ptr<object::Binary>> ChildOrErr =
> C.getAsBinary();
> >> +    FailIfError(errorToErrorCode(ChildOrErr.takeError()));
> >>     if (auto *O = dyn_cast<object::ObjectFile>(&*ChildOrErr.get()))
> >>       Fn(*O);
> >>     else
> >>
> >>
> >> _______________________________________________
> >> llvm-commits mailing list
> >> llvm-commits at lists.llvm.org
> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> >
> >
> >
> > --
> > Sanjoy Das
> > http://playingwithpointers.com
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160517/55635579/attachment-0001.html>


More information about the llvm-commits mailing list