Skip to content

Commit cc164ae

Browse files
authored
Catch MLIR ukernel parsing errors (#22353)
MLIR ukernels are lazily parsed when used. When they fail to parse, this was manifesting itself as a compiler crash (null dereference) here: https://github.com/iree-org/iree/blob/59ce62fd8a3686c45d00bfce197cd15f38697f0d/compiler/plugins/target/ROCM/Dialect/ROCM/Transforms/ApplyBuiltinPDLPatterns.cpp#L354 as in that case, `builtinModule.get()` is null. This PR reports an op error when parsing failed, so the code doesn't reach this place anymroe and the crash is avoided. To make the parser's internal diagnostics themselves more helpful, this PR also passes a `sourceName` argument to `parseSourceString` so that they now directly refer to a meaningful location in the MLIR ukernel files. --------- Signed-off-by: Benoit Jacob <[email protected]>
1 parent 54cd445 commit cc164ae

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

compiler/plugins/target/ROCM/Dialect/ROCM/Transforms/ApplyBuiltinPDLPatterns.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -341,15 +341,21 @@ class ApplyBuiltinPDLPatternsDriverPass final
341341
if (ukernelSymbols.contains(ukernelDesc.getUkernelName())) {
342342
return WalkResult::advance();
343343
}
344+
std::string builtinNameStr = builtinName.str();
344345
std::optional<StringRef> maybeBuiltin =
345-
rocmDialect->getBuiltin(builtinName.str());
346+
rocmDialect->getBuiltin(builtinNameStr);
346347
if (!maybeBuiltin) {
347348
moduleOp.emitOpError()
348-
<< "could not find builtin with name " << builtinName.str();
349+
<< "could not find builtin module with name " << builtinNameStr;
350+
return WalkResult::interrupt();
351+
}
352+
OwningOpRef<ModuleOp> builtinModule = parseSourceString<ModuleOp>(
353+
*maybeBuiltin, ctx, /*sourceName=*/builtinNameStr);
354+
if (!builtinModule) {
355+
moduleOp.emitOpError()
356+
<< "failed to parse builtin module with name " << builtinNameStr;
349357
return WalkResult::interrupt();
350358
}
351-
OwningOpRef<ModuleOp> builtinModule =
352-
parseSourceString<ModuleOp>(*maybeBuiltin, ctx);
353359
Operation *symbolTableOp =
354360
SymbolTable::getNearestSymbolTable(builtinModule.get());
355361
SymbolTable symbolTable(symbolTableOp);

0 commit comments

Comments
 (0)