[MLIR] UnknownLoc on Inlinable Calls in LLVMIR Translation
authorIan Bearman <ianb@microsoft.com>
Tue, 15 Mar 2022 20:31:25 +0000 (13:31 -0700)
committerStella Stamenova <stilis@microsoft.com>
Tue, 15 Mar 2022 21:48:50 +0000 (14:48 -0700)
During MLIR translation to LLVMIR if an inlineable call has an UnkownLoc we get this error message:

```
inlinable function call in a function with debug info must have a !dbg location
  call void @callee()
```

There is code that checks for this case and strips debug information to avoid this situation. I'm expanding this code to handle the case where an debug location points at a UnknownLoc. For example, a NamedLoc whose child location is an UnknownLoc.

Reviewed By: ftynse

Differential Revision: https://reviews.llvm.org/D121633

mlir/lib/Target/LLVMIR/DebugTranslation.cpp
mlir/test/Target/LLVMIR/llvmir-debug.mlir

index da31fdd..925a7db 100644 (file)
@@ -86,9 +86,11 @@ void DebugTranslation::translate(LLVMFuncOp func, llvm::Function &llvmFunc) {
   // inlinable calls in it are with debug info, otherwise the LLVM verifier will
   // complain. For now, be more restricted and treat all calls as inlinable.
   const bool hasCallWithoutDebugInfo =
-      func.walk([](LLVM::CallOp call) {
-            return call.getLoc().isa<UnknownLoc>() ? WalkResult::interrupt()
-                                                   : WalkResult::advance();
+      func.walk([&](LLVM::CallOp call) {
+            return call.getLoc()->walk([](Location l) {
+              return l.isa<UnknownLoc>() ? WalkResult::interrupt()
+                                         : WalkResult::advance();
+            });
           })
           .wasInterrupted();
   if (hasCallWithoutDebugInfo)
index 590fb8b..b839a82 100644 (file)
@@ -1,5 +1,16 @@
 // RUN: mlir-translate -mlir-to-llvmir %s | FileCheck %s
 
+// CHECK-LABEL: define void @func_with_empty_named_info()
+// Check that translation doens't crash in the presence of an inlineble call
+// with a named loc that has no backing source info.
+llvm.func @callee() {
+  llvm.return
+} loc("calleesource.cc":1:1)
+llvm.func @func_with_empty_named_info() {
+  llvm.call @callee() : () -> () loc("named with no line info")
+  llvm.return
+}
+
 // CHECK-LABEL: define void @func_no_debug()
 // CHECK-NOT: !dbg
 llvm.func @func_no_debug() {