diff options
author | Kevin Enderby <enderby@apple.com> | 2016-05-31 20:35:34 +0000 |
---|---|---|
committer | Kevin Enderby <enderby@apple.com> | 2016-05-31 20:35:34 +0000 |
commit | 9acb109930dd2584438f0d985a964ac3924faf0e (patch) | |
tree | e89a92630b53f358afe577b135a911fb57f315bd /llvm/tools/llvm-nm/llvm-nm.cpp | |
parent | 87ea3b05b9d1cc1f7512b53b191f265a93b1ec01 (diff) | |
download | bcm5719-llvm-9acb109930dd2584438f0d985a964ac3924faf0e.tar.gz bcm5719-llvm-9acb109930dd2584438f0d985a964ac3924faf0e.zip |
Change llvm-objdump, llvm-nm and llvm-size when reporting an object file error
when the object is from a slice of a Mach-O Universal Binary use something like
"foo.o (for architecture i386)" as part of the error message when expected.
Also fixed places in these tools that were ignoring object file errors from
MachOUniversalBinary::getAsObjectFile() when the code moved on to see if
the slice was an archive.
To do this MachOUniversalBinary::getAsObjectFile() and
MachOUniversalBinary::getObjectForArch() were changed from returning
ErrorOr<...> to Expected<...> then that was threaded up to its users.
Converting these interfaces 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 two places yet to be fully converted.
llvm-svn: 271332
Diffstat (limited to 'llvm/tools/llvm-nm/llvm-nm.cpp')
-rw-r--r-- | llvm/tools/llvm-nm/llvm-nm.cpp | 57 |
1 files changed, 49 insertions, 8 deletions
diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp index a9234229062..d838ad870ba 100644 --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -193,7 +193,8 @@ static bool error(std::error_code EC, Twine Path = Twine()) { // 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) { +static void error(llvm::Error E, StringRef FileName, const Archive::Child &C, + StringRef ArchitectureName = StringRef()) { HadError = true; errs() << ToolName << ": " << FileName; @@ -206,6 +207,28 @@ static void error(llvm::Error E, StringRef FileName, const Archive::Child &C) { else errs() << "(" << NameOrErr.get() << ")"; + if (!ArchitectureName.empty()) + errs() << " (for architecture " << ArchitectureName << ") "; + + std::string Buf; + raw_string_ostream OS(Buf); + logAllUnhandledErrors(std::move(E), OS, ""); + OS.flush(); + errs() << " " << Buf << "\n"; +} + +// This version of error() prints the file name and which architecture slice it +// is from, for example: "foo.o (for architecture i386)" after the ToolName +// before the error message. It sets HadError but returns allowing the code to +// move on to other architecture slices. +static void error(llvm::Error E, StringRef FileName, + StringRef ArchitectureName = StringRef()) { + HadError = true; + errs() << ToolName << ": " << FileName; + + if (!ArchitectureName.empty()) + errs() << " (for architecture " << ArchitectureName << ") "; + std::string Buf; raw_string_ostream OS(Buf); logAllUnhandledErrors(std::move(E), OS, ""); @@ -1123,7 +1146,7 @@ static void dumpSymbolNamesFromFile(std::string &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 ArchiveName; std::string ArchitectureName; @@ -1141,6 +1164,11 @@ static void dumpSymbolNamesFromFile(std::string &Filename) { } dumpSymbolNamesFromObject(Obj, false, ArchiveName, ArchitectureName); + } else if (auto E = isNotObjectErrorInvalidFileType( + ObjOrErr.takeError())) { + error(std::move(E), Filename, ArchFlags.size() > 1 ? + StringRef(I->getArchTypeName()) : StringRef()); + continue; } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr = I->getAsArchive()) { std::unique_ptr<Archive> &A = *AOrErr; @@ -1154,8 +1182,10 @@ static void dumpSymbolNamesFromFile(std::string &Filename) { C.getAsBinary(&Context); if (!ChildOrErr) { if (auto E = isNotObjectErrorInvalidFileType( - ChildOrErr.takeError())) - error(std::move(E), Filename, C); + ChildOrErr.takeError())) { + error(std::move(E), Filename, C, ArchFlags.size() > 1 ? + StringRef(I->getArchTypeName()) : StringRef()); + } continue; } if (SymbolicFile *O = @@ -1196,12 +1226,16 @@ static void dumpSymbolNamesFromFile(std::string &Filename) { E = UB->end_objects(); I != E; ++I) { if (HostArchName == 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 &Obj = *ObjOrErr.get(); dumpSymbolNamesFromObject(Obj, false); + } else if (auto E = isNotObjectErrorInvalidFileType( + ObjOrErr.takeError())) { + error(std::move(E), Filename); + return; } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr = I->getAsArchive()) { std::unique_ptr<Archive> &A = *AOrErr; @@ -1241,7 +1275,7 @@ static void dumpSymbolNamesFromFile(std::string &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 ArchiveName; std::string ArchitectureName; ArchiveName.clear(); @@ -1260,6 +1294,11 @@ static void dumpSymbolNamesFromFile(std::string &Filename) { outs() << ":\n"; } dumpSymbolNamesFromObject(Obj, false, ArchiveName, ArchitectureName); + } else if (auto E = isNotObjectErrorInvalidFileType( + ObjOrErr.takeError())) { + error(std::move(E), Filename, moreThanOneArch ? + StringRef(I->getArchTypeName()) : StringRef()); + continue; } else if (ErrorOr<std::unique_ptr<Archive>> AOrErr = I->getAsArchive()) { std::unique_ptr<Archive> &A = *AOrErr; for (Archive::child_iterator AI = A->child_begin(), AE = A->child_end(); @@ -1267,11 +1306,13 @@ static void dumpSymbolNamesFromFile(std::string &Filename) { if (error(AI->getError())) return; auto &C = AI->get(); - Expected<std::unique_ptr<Binary>> ChildOrErr = C.getAsBinary(&Context); + Expected<std::unique_ptr<Binary>> ChildOrErr = + C.getAsBinary(&Context); if (!ChildOrErr) { if (auto E = isNotObjectErrorInvalidFileType( ChildOrErr.takeError())) - error(std::move(E), Filename, C); + error(std::move(E), Filename, C, moreThanOneArch ? + StringRef(ArchitectureName) : StringRef()); continue; } if (SymbolicFile *O = dyn_cast<SymbolicFile>(&*ChildOrErr.get())) { |