forked from OSchip/llvm-project
[mlir] ExecutionEngine: fix assertion on the error path
MLIR ExecutionEngine and derived tools (e.g., mlir-cpu-runner) would trigger an assertion inside ORC JIT while ExecutionEngine is being destructed after a failed linking due to a missing function definition. The reason for this is the JIT lookup that 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. Differential Revision: https://reviews.llvm.org/D75508
This commit is contained in:
parent
efa2d53377
commit
d7fbfbb171
|
@ -294,8 +294,21 @@ Expected<std::unique_ptr<ExecutionEngine>> ExecutionEngine::create(
|
|||
|
||||
Expected<void (*)(void **)> 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<void (*)(void **)>(rawFPtr);
|
||||
if (!fptr)
|
||||
|
|
Loading…
Reference in New Issue