Skip to content

Commit a9a5c91

Browse files
authored
Support DW_OP_LLVM_arg DWARF operation (#1279)
1 parent 1cad18c commit a9a5c91

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

lib/SPIRV/libSPIRV/SPIRV.debug.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,8 @@ enum ExpressionOpCode {
264264
RegvalType = 161,
265265
DerefType = 162,
266266
XderefType = 163,
267-
Reinterpret = 164
267+
Reinterpret = 164,
268+
LLVMArg = 165,
268269
};
269270

270271
enum ImportedEntityTag {
@@ -756,6 +757,7 @@ static std::map<ExpressionOpCode, unsigned> OpCountMap {
756757
// { DerefType, 3 },
757758
// { XderefType, 3 },
758759
// { Reinterpret, 2 },
760+
{ LLVMArg, 2 },
759761
};
760762
}
761763

@@ -1002,6 +1004,7 @@ inline void DbgExpressionOpCodeMap::init() {
10021004
add(dwarf::DW_OP_xderef_size, SPIRVDebug::XderefSize );
10031005
add(dwarf::DW_OP_nop, SPIRVDebug::Nop);
10041006
add(dwarf::DW_OP_push_object_address, SPIRVDebug::PushObjectAddress );
1007+
add(dwarf::DW_OP_LLVM_arg, SPIRVDebug::LLVMArg);
10051008
}
10061009

10071010
typedef SPIRVMap<dwarf::Tag, SPIRVDebug::ImportedEntityTag>

test/DebugInfo/DebugInfoLLVMArg.ll

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
; This test checks that DW_OP_LLVM_arg operation goes through round trip translation correctly.
2+
3+
; RUN: llvm-as %s -o %t.bc
4+
; RUN: llvm-spirv %t.bc -o %t.spv --spirv-allow-extra-diexpressions
5+
; RUN: llvm-spirv %t.spv -to-text -o %t.spt
6+
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
7+
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
8+
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
9+
10+
; CHECK-SPIRV: [[#DEBUG_LOC_VAR:]] [[#]] DebugLocalVariable
11+
; 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]]
16+
17+
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
18+
target triple = "spir64-unknown-unknown"
19+
20+
declare void @llvm.dbg.value(metadata, metadata, metadata) nounwind readnone speculatable
21+
22+
define void @DbgIntrinsics() sanitize_memtag {
23+
entry:
24+
%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))
26+
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
27+
store i32 42, i32* %x, align 4
28+
ret void
29+
}
30+
31+
32+
!llvm.dbg.cu = !{!0}
33+
!llvm.module.flags = !{!8, !9}
34+
35+
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 9.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, nameTableKind: None)
36+
!1 = !DIFile(filename: "stack-tagging.cc", directory: "/tmp")
37+
!2 = !{}
38+
!3 = distinct !DISubprogram(name: "DbgIntrinsics", linkageName: "DbgIntrinsics", scope: !1, file: !1, line: 3, type: !4, scopeLine: 3, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
39+
!4 = !DISubroutineType(types: !5)
40+
!5 = !{null}
41+
!6 = !DILocalVariable(name: "x", scope: !3, file: !1, line: 4, type: !7)
42+
!7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
43+
!8 = !{i32 2, !"Dwarf Version", i32 4}
44+
!9 = !{i32 2, !"Debug Info Version", i32 3}
45+
!10 = !DILocation(line: 1, column: 2, scope: !3)

0 commit comments

Comments
 (0)