Skip to content

Commit

Permalink
[MLIR] UnknownLoc on Inlinable Calls in LLVMIR Translation
Browse files Browse the repository at this point in the history
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
  • Loading branch information
manbearian authored and sstamenova committed Mar 15, 2022
1 parent 6be457c commit 7ecb7ef
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 3 deletions.
8 changes: 5 additions & 3 deletions mlir/lib/Target/LLVMIR/DebugTranslation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
11 changes: 11 additions & 0 deletions mlir/test/Target/LLVMIR/llvmir-debug.mlir
Original file line number Diff line number Diff line change
@@ -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() {
Expand Down

0 comments on commit 7ecb7ef

Please sign in to comment.