From 69f4902ba685a49e80a8d39998477ee72ca9d53b Mon Sep 17 00:00:00 2001 From: Lang Hames Date: Thu, 14 Jul 2016 20:44:27 +0000 Subject: [PATCH] [Object] Change Archive::findSym to return an Expected>. As suggested by Rafael in review of D22079 - this was accidentally left out of the final commit (r275316). llvm-svn: 275469 --- llvm/include/llvm/Object/Archive.h | 3 ++- llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp | 12 ++++++------ llvm/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h | 12 ++++++------ llvm/lib/Object/Archive.cpp | 15 ++++++--------- 4 files changed, 20 insertions(+), 22 deletions(-) diff --git a/llvm/include/llvm/Object/Archive.h b/llvm/include/llvm/Object/Archive.h index f209cb3..cfba256 100644 --- a/llvm/include/llvm/Object/Archive.h +++ b/llvm/include/llvm/Object/Archive.h @@ -14,6 +14,7 @@ #ifndef LLVM_OBJECT_ARCHIVE_H #define LLVM_OBJECT_ARCHIVE_H +#include "llvm/ADT/Optional.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/iterator_range.h" #include "llvm/Object/Binary.h" @@ -215,7 +216,7 @@ public: } // check if a symbol is in the archive - child_iterator findSym(Error &Err, StringRef name) const; + Expected> findSym(StringRef name) const; bool hasSymbolTable() const; StringRef getSymbolTable() const { return SymbolTable; } diff --git a/llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp b/llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp index 9da0045..7fb328b 100644 --- a/llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp +++ b/llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp @@ -327,14 +327,14 @@ RuntimeDyld::SymbolInfo MCJIT::findSymbol(const std::string &Name, for (object::OwningBinary &OB : Archives) { object::Archive *A = OB.getBinary(); // Look for our symbols in each Archive - Error Err; - object::Archive::child_iterator ChildIt = A->findSym(Err, Name); - if (Err) - report_fatal_error(std::move(Err)); - if (ChildIt != A->child_end()) { + auto OptionalChildOrErr = A->findSym(Name); + if (!OptionalChildOrErr) + report_fatal_error(OptionalChildOrErr.takeError()); + auto &OptionalChild = *OptionalChildOrErr; + if (OptionalChild) { // FIXME: Support nested archives? Expected> ChildBinOrErr = - ChildIt->getAsBinary(); + OptionalChild->getAsBinary(); if (!ChildBinOrErr) { // TODO: Actually report errors helpfully. consumeError(ChildBinOrErr.takeError()); diff --git a/llvm/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h b/llvm/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h index 2fde564..d108307 100644 --- a/llvm/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h +++ b/llvm/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h @@ -258,14 +258,14 @@ private: for (object::OwningBinary &OB : Archives) { object::Archive *A = OB.getBinary(); // Look for our symbols in each Archive - Error Err; - object::Archive::child_iterator ChildIt = A->findSym(Err, Name); - if (Err) - report_fatal_error(std::move(Err)); - if (ChildIt != A->child_end()) { + auto OptionalChildOrErr = A->findSym(Name); + if (!OptionalChildOrErr) + report_fatal_error(OptionalChildOrErr.takeError()); + auto &OptionalChild = *OptionalChildOrErr; + if (OptionalChild) { // FIXME: Support nested archives? Expected> ChildBinOrErr = - ChildIt->getAsBinary(); + OptionalChild->getAsBinary(); if (!ChildBinOrErr) { // TODO: Actually report errors helpfully. consumeError(ChildBinOrErr.takeError()); diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp index 4827e58..daf301e 100644 --- a/llvm/lib/Object/Archive.cpp +++ b/llvm/lib/Object/Archive.cpp @@ -667,23 +667,20 @@ uint32_t Archive::getNumberOfSymbols() const { return read32le(buf); } -Archive::child_iterator Archive::findSym(Error &Err, StringRef name) const { +Expected> Archive::findSym(StringRef name) const { Archive::symbol_iterator bs = symbol_begin(); Archive::symbol_iterator es = symbol_end(); for (; bs != es; ++bs) { StringRef SymName = bs->getName(); if (SymName == name) { - if (auto MemberOrErr = bs->getMember()) { - return child_iterator(*MemberOrErr, &Err); - } else { - ErrorAsOutParameter ErrAsOutParam(Err); - Err = errorCodeToError(MemberOrErr.getError()); - return child_end(); - } + if (auto MemberOrErr = bs->getMember()) + return Child(*MemberOrErr); + else + return errorCodeToError(MemberOrErr.getError()); } } - return child_end(); + return Optional(); } bool Archive::hasSymbolTable() const { return !SymbolTable.empty(); } -- 2.7.4