diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp | 12 | ||||
-rw-r--r-- | llvm/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h | 12 | ||||
-rw-r--r-- | llvm/lib/Object/Archive.cpp | 15 |
3 files changed, 18 insertions, 21 deletions
diff --git a/llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp b/llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp index 9da0045d201..7fb328babfe 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<object::Archive> &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<std::unique_ptr<object::Binary>> 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 2fde56447fc..d1083072c98 100644 --- a/llvm/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h +++ b/llvm/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h @@ -258,14 +258,14 @@ private: for (object::OwningBinary<object::Archive> &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<std::unique_ptr<object::Binary>> 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 4827e58f5d3..daf301e2e7e 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<Optional<Archive::Child>> 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<Child>(); } bool Archive::hasSymbolTable() const { return !SymbolTable.empty(); } |