Skip to content

Commit fb2dd0e

Browse files
authored
Handle translation of DIArgList with single argument (#1385)
If there are more than one argument in DIArgList, we can't represent it in SPIR-V with the current SPIR-V debug info spec. In this case we drop DIArgList and DIExpression. Signed-off-by: Alexey Sotkin <[email protected]>
1 parent ea5ef3f commit fb2dd0e

File tree

3 files changed

+27
-12
lines changed

3 files changed

+27
-12
lines changed

lib/SPIRV/LLVMToSPIRVDbgTran.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,16 @@ void LLVMToSPIRVDbgTran::finalizeDebugValue(
150150
SPIRVExtInst *DV = static_cast<SPIRVExtInst *>(V);
151151
SPIRVBasicBlock *BB = DV->getBasicBlock();
152152
Value *Val = DbgValue->getVariableLocationOp(0);
153-
153+
DIExpression *Expr = DbgValue->getExpression();
154+
if (DbgValue->getNumVariableLocationOps() > 1) {
155+
Val = UndefValue::get(Val->getType());
156+
Expr = DIExpression::get(M->getContext(), {});
157+
}
154158
using namespace SPIRVDebug::Operand::DebugValue;
155159
SPIRVWordVec Ops(MinOperandCount);
156160
Ops[DebugLocalVarIdx] = transDbgEntry(DbgValue->getVariable())->getId();
157161
Ops[ValueIdx] = SPIRVWriter->transValue(Val, BB)->getId();
158-
Ops[ExpressionIdx] = transDbgEntry(DbgValue->getExpression())->getId();
162+
Ops[ExpressionIdx] = transDbgEntry(Expr)->getId();
159163
DV->setArguments(Ops);
160164
}
161165

lib/SPIRV/SPIRVToLLVMDbgTran.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,10 @@
4444
#include "SPIRVReader.h"
4545
#include "SPIRVType.h"
4646

47+
#include "llvm/ADT/StringExtras.h"
4748
#include "llvm/IR/DIBuilder.h"
49+
#include "llvm/IR/IntrinsicInst.h"
4850
#include "llvm/IR/Module.h"
49-
#include "llvm/ADT/StringExtras.h"
5051

5152
using namespace std;
5253
using namespace SPIRVDebug::Operand;
@@ -998,9 +999,16 @@ SPIRVToLLVMDbgTran::transDebugIntrinsic(const SPIRVExtInst *DebugInst,
998999
case SPIRVDebug::Value: {
9991000
using namespace SPIRVDebug::Operand::DebugValue;
10001001
auto LocalVar = GetLocalVar(Ops[DebugLocalVarIdx]);
1001-
return Builder.insertDbgValueIntrinsic(
1002-
GetValue(Ops[ValueIdx]), LocalVar.first,
1003-
GetExpression(Ops[ExpressionIdx]), LocalVar.second, BB);
1002+
Value *Val = GetValue(Ops[ValueIdx]);
1003+
DIExpression *Expr = GetExpression(Ops[ExpressionIdx]);
1004+
auto *DbgValIntr = Builder.insertDbgValueIntrinsic(
1005+
Val, LocalVar.first, Expr, LocalVar.second, BB);
1006+
if (Expr->getNumLocationOperands() == 1) {
1007+
SmallVector<ValueAsMetadata *, 1> MDs = {ValueAsMetadata::get(Val)};
1008+
DIArgList *AL = DIArgList::get(M->getContext(), MDs);
1009+
cast<DbgVariableIntrinsic>(DbgValIntr)->setRawLocation(AL);
1010+
}
1011+
return DbgValIntr;
10041012
}
10051013
default:
10061014
llvm_unreachable("Unknown debug intrinsic!");

test/DebugInfo/DebugInfoLLVMArg.ll

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
88
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
99

10+
; CHECK-SPIRV: Undef [[#]] [[#UNDEF:]]
1011
; CHECK-SPIRV: [[#DEBUG_LOC_VAR:]] [[#]] DebugLocalVariable
1112
; CHECK-SPIRV: [[#EXPR_ARG_0:]] [[#]] DebugOperation 165 0
12-
; CHECK-SPIRV: [[#EXPR_ARG_1:]] [[#]] DebugOperation 165 1
13-
; CHECK-SPIRV: [[#EXPR_ARG_2:]] [[#]] DebugOperation 1
14-
; CHECK-SPIRV: [[#EXPRESSION:]] [[#]] DebugExpression [[#EXPR_ARG_0]] [[#EXPR_ARG_1]] [[#EXPR_ARG_2]]
15-
; CHECK-SPIRV: DebugValue [[#DEBUG_LOC_VAR]] [[#]] [[#EXPRESSION]]
13+
; CHECK-SPIRV: [[#EXPRESSION:]] [[#]] DebugExpression [[#EXPR_ARG_0]]
14+
; CHECK-SPIRV: [[#EXPR_EMPTY:]] [[#]] DebugExpression{{ *$}}
15+
; CHECK-SPIRV: Variable [[#]] [[#VAL:]]
16+
; CHECK-SPIRV: DebugValue [[#DEBUG_LOC_VAR]] [[#VAL]] [[#EXPRESSION]]
17+
; CHECK-SPIRV: DebugValue [[#DEBUG_LOC_VAR]] [[#UNDEF]] [[#EXPR_EMPTY]]
1618

1719
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
1820
target triple = "spir64-unknown-unknown"
@@ -22,13 +24,14 @@ declare void @llvm.dbg.value(metadata, metadata, metadata) nounwind readnone spe
2224
define void @DbgIntrinsics() sanitize_memtag {
2325
entry:
2426
%x = alloca i32, align 4
25-
; CHECK-LLVM: call void @llvm.dbg.value(metadata i32* %x, metadata ![[#]], metadata !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_plus))
27+
; CHECK-LLVM: call void @llvm.dbg.value(metadata !DIArgList(i32* %x), metadata ![[#]], metadata !DIExpression(DW_OP_LLVM_arg, 0))
28+
call void @llvm.dbg.value(metadata !DIArgList(i32* %x), metadata !6, metadata !DIExpression(DW_OP_LLVM_arg, 0)), !dbg !10
29+
; CHECK-LLVM: call void @llvm.dbg.value(metadata i32* undef, metadata ![[#]], metadata !DIExpression())
2630
call void @llvm.dbg.value(metadata !DIArgList(i32* %x, i32* %x), metadata !6, metadata !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_plus)), !dbg !10
2731
store i32 42, i32* %x, align 4
2832
ret void
2933
}
3034

31-
3235
!llvm.dbg.cu = !{!0}
3336
!llvm.module.flags = !{!8, !9}
3437

0 commit comments

Comments
 (0)