diff options
Diffstat (limited to 'llvm/tools/llvm-objdump')
-rw-r--r-- | llvm/tools/llvm-objdump/MachODump.cpp | 25 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.cpp | 19 | ||||
-rw-r--r-- | llvm/tools/llvm-objdump/llvm-objdump.h | 11 |
3 files changed, 40 insertions, 15 deletions
diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp index b97cdca9d6a..fe7cf0dd335 100644 --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -1266,7 +1266,7 @@ static void ProcessMachO(StringRef Filename, MachOObjectFile *MachOOF, PrintDylibs(MachOOF, true); if (SymbolTable) { StringRef ArchiveName = ArchiveMemberName == StringRef() ? "" : Filename; - PrintSymbolTable(MachOOF, ArchiveName); + PrintSymbolTable(MachOOF, ArchiveName, ArchitectureName); } if (UnwindInfo) printMachOUnwindInfo(MachOOF); @@ -1604,7 +1604,7 @@ void llvm::ParseInputMachO(StringRef Filename) { I != E; ++I) { if (ArchFlags[i] == I->getArchTypeName()) { ArchFound = true; - ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = + Expected<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile(); std::string ArchitectureName = ""; if (ArchFlags.size() > 1) @@ -1613,6 +1613,11 @@ void llvm::ParseInputMachO(StringRef Filename) { ObjectFile &O = *ObjOrErr.get(); if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(&O)) ProcessMachO(Filename, MachOOF, "", ArchitectureName); + } else if (auto E = isNotObjectErrorInvalidFileType( + ObjOrErr.takeError())) { + report_error(Filename, StringRef(), std::move(E), + ArchitectureName); + continue; } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr = I->getAsArchive()) { std::unique_ptr<Archive> &A = *AOrErr; @@ -1631,7 +1636,7 @@ void llvm::ParseInputMachO(StringRef Filename) { Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary(); if (!ChildOrErr) { if (auto E = isNotObjectErrorInvalidFileType(ChildOrErr.takeError())) - report_error(Filename, C, std::move(E)); + report_error(Filename, C, std::move(E), ArchitectureName); continue; } if (MachOObjectFile *O = @@ -1657,13 +1662,17 @@ void llvm::ParseInputMachO(StringRef Filename) { I != E; ++I) { if (MachOObjectFile::getHostArch().getArchName() == I->getArchTypeName()) { - ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile(); + Expected<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile(); std::string ArchiveName; ArchiveName.clear(); if (ObjOrErr) { ObjectFile &O = *ObjOrErr.get(); if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(&O)) ProcessMachO(Filename, MachOOF); + } else if (auto E = isNotObjectErrorInvalidFileType( + ObjOrErr.takeError())) { + report_error(Filename, std::move(E)); + continue; } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr = I->getAsArchive()) { std::unique_ptr<Archive> &A = *AOrErr; @@ -1697,7 +1706,7 @@ void llvm::ParseInputMachO(StringRef Filename) { for (MachOUniversalBinary::object_iterator I = UB->begin_objects(), E = UB->end_objects(); I != E; ++I) { - ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile(); + Expected<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile(); std::string ArchitectureName = ""; if (moreThanOneArch) ArchitectureName = I->getArchTypeName(); @@ -1705,6 +1714,10 @@ void llvm::ParseInputMachO(StringRef Filename) { ObjectFile &Obj = *ObjOrErr.get(); if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(&Obj)) ProcessMachO(Filename, MachOOF, "", ArchitectureName); + } else if (auto E = isNotObjectErrorInvalidFileType( + ObjOrErr.takeError())) { + report_error(StringRef(), Filename, std::move(E), ArchitectureName); + continue; } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr = I->getAsArchive()) { std::unique_ptr<Archive> &A = *AOrErr; outs() << "Archive : " << Filename; @@ -1721,7 +1734,7 @@ void llvm::ParseInputMachO(StringRef Filename) { Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary(); if (!ChildOrErr) { if (auto E = isNotObjectErrorInvalidFileType(ChildOrErr.takeError())) - report_error(Filename, C, std::move(E)); + report_error(Filename, C, std::move(E), ArchitectureName); continue; } if (MachOObjectFile *O = diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 3089ff75303..2ee34e48e41 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -284,13 +284,16 @@ LLVM_ATTRIBUTE_NORETURN void llvm::report_error(StringRef File, LLVM_ATTRIBUTE_NORETURN void llvm::report_error(StringRef ArchiveName, StringRef FileName, - llvm::Error E) { + llvm::Error E, + StringRef ArchitectureName) { assert(E); errs() << ToolName << ": "; if (ArchiveName != "") errs() << ArchiveName << "(" << FileName << ")"; else errs() << FileName; + if (!ArchitectureName.empty()) + errs() << " (for architecture " << ArchitectureName << ")"; std::string Buf; raw_string_ostream OS(Buf); logAllUnhandledErrors(std::move(E), OS, ""); @@ -301,15 +304,17 @@ LLVM_ATTRIBUTE_NORETURN void llvm::report_error(StringRef ArchiveName, LLVM_ATTRIBUTE_NORETURN void llvm::report_error(StringRef ArchiveName, const object::Archive::Child &C, - llvm::Error E) { + llvm::Error E, + StringRef ArchitectureName) { 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)); + llvm::report_error(ArchiveName, "???", std::move(E), ArchitectureName); else - llvm::report_error(ArchiveName, NameOrErr.get(), std::move(E)); + llvm::report_error(ArchiveName, NameOrErr.get(), std::move(E), + ArchitectureName); } static const Target *getTarget(const ObjectFile *Obj = nullptr) { @@ -1377,7 +1382,8 @@ void llvm::PrintSectionContents(const ObjectFile *Obj) { } } -void llvm::PrintSymbolTable(const ObjectFile *o, StringRef ArchiveName) { +void llvm::PrintSymbolTable(const ObjectFile *o, StringRef ArchiveName, + StringRef ArchitectureName) { outs() << "SYMBOL TABLE:\n"; if (const COFFObjectFile *coff = dyn_cast<const COFFObjectFile>(o)) { @@ -1402,7 +1408,8 @@ void llvm::PrintSymbolTable(const ObjectFile *o, StringRef ArchiveName) { } else { Expected<StringRef> NameOrErr = Symbol.getName(); if (!NameOrErr) - report_error(ArchiveName, o->getFileName(), NameOrErr.takeError()); + report_error(ArchiveName, o->getFileName(), NameOrErr.takeError(), + ArchitectureName); Name = *NameOrErr; } diff --git a/llvm/tools/llvm-objdump/llvm-objdump.h b/llvm/tools/llvm-objdump/llvm-objdump.h index 51a600d9a04..439018963cb 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.h +++ b/llvm/tools/llvm-objdump/llvm-objdump.h @@ -86,15 +86,20 @@ void printRawClangAST(const object::ObjectFile *o); void PrintRelocations(const object::ObjectFile *o); void PrintSectionHeaders(const object::ObjectFile *o); void PrintSectionContents(const object::ObjectFile *o); -void PrintSymbolTable(const object::ObjectFile *o, StringRef ArchiveName); +void PrintSymbolTable(const object::ObjectFile *o, StringRef ArchiveName, + StringRef ArchitectureName = StringRef()); 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::Error E, + StringRef ArchitectureName + = StringRef()); LLVM_ATTRIBUTE_NORETURN void report_error(StringRef ArchiveName, const object::Archive::Child &C, - llvm::Error E); + llvm::Error E, + StringRef ArchitectureName + = StringRef()); } // end namespace llvm |