diff --git a/mlir/lib/Dialect/LLVMIR/Transforms/DIScopeForLLVMFuncOp.cpp b/mlir/lib/Dialect/LLVMIR/Transforms/DIScopeForLLVMFuncOp.cpp index 12dd22581a979..36b31ffc3970e 100644 --- a/mlir/lib/Dialect/LLVMIR/Transforms/DIScopeForLLVMFuncOp.cpp +++ b/mlir/lib/Dialect/LLVMIR/Transforms/DIScopeForLLVMFuncOp.cpp @@ -120,11 +120,13 @@ static void setLexicalBlockFileAttr(Operation *op) { LLVM::DIScopeAttr scopeAttr; // We assemble the full inline stack so the parent of this loc must be a // function - auto funcOp = op->getParentOfType(); - if (auto funcOpLoc = llvm::dyn_cast_if_present(funcOp.getLoc())) { - scopeAttr = cast(funcOpLoc.getMetadata()); - op->setLoc( - CallSiteLoc::get(getNestedLoc(op, scopeAttr, calleeLoc), callerLoc)); + if (auto funcOp = op->getParentOfType()) { + if (auto funcOpLoc = + llvm::dyn_cast_if_present(funcOp.getLoc())) { + scopeAttr = cast(funcOpLoc.getMetadata()); + op->setLoc(CallSiteLoc::get(getNestedLoc(op, scopeAttr, calleeLoc), + callerLoc)); + } } return; diff --git a/mlir/test/Dialect/LLVMIR/add-debuginfo-func-scope.mlir b/mlir/test/Dialect/LLVMIR/add-debuginfo-func-scope.mlir index ffeb871d56c6c..895c3fcb7fb23 100644 --- a/mlir/test/Dialect/LLVMIR/add-debuginfo-func-scope.mlir +++ b/mlir/test/Dialect/LLVMIR/add-debuginfo-func-scope.mlir @@ -160,3 +160,15 @@ module { } loc(#loc) } loc(unknown) + +// ----- + +// Test that operations with CallSiteLoc outside of an llvm.func do not crash. +llvm.func @dummy() +func.func @test_func() { + return +} loc(#loc2) + +#loc = loc("a.py":1150:34) +#loc1 = loc("b.py":321:17) +#loc2 = loc(callsite(#loc at #loc1))