diff --git a/mlir/lib/ExecutionEngine/ExecutionEngine.cpp b/mlir/lib/ExecutionEngine/ExecutionEngine.cpp --- a/mlir/lib/ExecutionEngine/ExecutionEngine.cpp +++ b/mlir/lib/ExecutionEngine/ExecutionEngine.cpp @@ -294,8 +294,21 @@ Expected ExecutionEngine::lookup(StringRef name) const { auto expectedSymbol = jit->lookup(makePackedFunctionName(name)); - if (!expectedSymbol) - return expectedSymbol.takeError(); + + // JIT lookup may return an Error referring to strings stored internally by + // the JIT. If the Error outlives the ExecutionEngine, it would want have a + // dangling reference, which is currently caught by an assertion inside JIT + // thanks to hand-rolled reference counting. Rewrap the error message into a + // string before returning. Alternatively, ORC JIT should consider copying + // the string into the error message. + if (!expectedSymbol) { + std::string errorMessage; + llvm::raw_string_ostream os(errorMessage); + llvm::handleAllErrors(expectedSymbol.takeError(), + [&os](llvm::ErrorInfoBase &ei) { ei.log(os); }); + return make_string_error(os.str()); + } + auto rawFPtr = expectedSymbol->getAddress(); auto fptr = reinterpret_cast(rawFPtr); if (!fptr)