diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp --- a/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp +++ b/mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp @@ -1012,7 +1012,7 @@ /// debug-info-bearing function has a debug location attached to it. This /// mirrors an LLVM IR verifier. static LogicalResult verifyCallOpDebugInfo(CallOp callOp, LLVMFuncOp callee) { - if (callee.isDeclaration()) + if (callee.isExternal()) return success(); auto parentFunc = callOp->getParentOfType(); if (!parentFunc) diff --git a/mlir/test/Dialect/LLVMIR/call-location.mlir b/mlir/test/Dialect/LLVMIR/call-location.mlir new file mode 100644 --- /dev/null +++ b/mlir/test/Dialect/LLVMIR/call-location.mlir @@ -0,0 +1,31 @@ +// RUN: mlir-opt %s -split-input-file | FileCheck %s + +#di_file = #llvm.di_file<"file.cpp" in "/folder/"> +#di_compile_unit = #llvm.di_compile_unit< + sourceLanguage = DW_LANG_C_plus_plus_14, file = #di_file, + isOptimized = true, emissionKind = Full +> +#di_subprogram = #llvm.di_subprogram< + compileUnit = #di_compile_unit, scope = #di_file, + name = "missing_debug_loc", file = #di_file, + subprogramFlags = "Definition|Optimized" +> +#di_subprogram1 = #llvm.di_subprogram< + compileUnit = #di_compile_unit, scope = #di_file, + name = "invalid_call_debug_locs", file = #di_file, + subprogramFlags = "Definition|Optimized" +> +#loc = loc(unknown) +#loc1 = loc("file.cpp":24:0) +#loc2 = loc(fused<#di_subprogram>[#loc1]) +#loc3 = loc("file.cpp":42:0) +#loc4 = loc(fused<#di_subprogram1>[#loc3]) + +llvm.func @external_func() loc(#loc2) + +llvm.func @call_debug_locs() { + llvm.call @external_func() : () -> () loc(#loc) + llvm.return +} loc(#loc4) + +// CHECK: llvm.call @external_func()