summaryrefslogtreecommitdiffstats
path: root/llvm/tools
diff options
context:
space:
mode:
authorKevin Enderby <enderby@apple.com>2016-07-29 17:44:13 +0000
committerKevin Enderby <enderby@apple.com>2016-07-29 17:44:13 +0000
commitf4586039f6c620864227f50917d3c488ec95e6be (patch)
treed63675cf10720b06d4aaa6b3b8de26031a7df140 /llvm/tools
parenta51575ffa215c0a3558740694b3831b773498d15 (diff)
downloadbcm5719-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.cpp4
-rw-r--r--llvm/tools/llvm-ar/llvm-ar.cpp8
-rw-r--r--llvm/tools/llvm-nm/llvm-nm.cpp13
-rw-r--r--llvm/tools/llvm-objdump/MachODump.cpp15
-rw-r--r--llvm/tools/llvm-objdump/llvm-objdump.cpp7
-rw-r--r--llvm/tools/llvm-size/llvm-size.cpp7
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())
OpenPOWER on IntegriCloud