Skip to content

Commit 80f7817

Browse files
authored
[DebugInfo] Add NonSemantic.Shader.200 debug operations (#1976)
Spec: KhronosGroup/SPIRV-Registry#186 The patch also adds Constantness requirement for operands Signed-off-by: Sidorov, Dmitry <[email protected]>
1 parent 8565381 commit 80f7817

File tree

5 files changed

+110
-51
lines changed

5 files changed

+110
-51
lines changed

lib/SPIRV/LLVMToSPIRVDbgTran.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,7 +1389,9 @@ SPIRVEntry *LLVMToSPIRVDbgTran::transDbgExpression(const DIExpression *Expr) {
13891389
SPIRV::DbgExpressionOpCodeMap::map(DWARFOpCode);
13901390
if (OpCountMap.find(OC) == OpCountMap.end())
13911391
report_fatal_error(llvm::Twine("unknown opcode found in DIExpression"));
1392-
if (OC > SPIRVDebug::Fragment && !BM->allowExtraDIExpressions())
1392+
if (OC > SPIRVDebug::Fragment &&
1393+
!(BM->allowExtraDIExpressions() ||
1394+
BM->getDebugInfoEIS() == SPIRVEIS_NonSemantic_Shader_DebugInfo_200))
13931395
report_fatal_error(
13941396
llvm::Twine("unsupported opcode found in DIExpression"));
13951397

@@ -1398,8 +1400,11 @@ SPIRVEntry *LLVMToSPIRVDbgTran::transDbgExpression(const DIExpression *Expr) {
13981400
Op[OpCodeIdx] = OC;
13991401
if (isNonSemanticDebugInfo())
14001402
transformToConstant(Op, {OpCodeIdx});
1401-
for (unsigned J = 1; J < OpCount; ++J)
1403+
for (unsigned J = 1; J < OpCount; ++J) {
14021404
Op[J] = Expr->getElement(++I);
1405+
if (isNonSemanticDebugInfo())
1406+
transformToConstant(Op, {J});
1407+
}
14031408
auto *Operation = BM->addDebugInfo(SPIRVDebug::Operation, getVoidTy(), Op);
14041409
Operations.push_back(Operation->getId());
14051410
}

lib/SPIRV/SPIRVToLLVMDbgTran.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1198,7 +1198,8 @@ MDNode *SPIRVToLLVMDbgTran::transExpression(const SPIRVExtInst *DebugInst) {
11981198
Operands, OpCodeIdx, DebugInst->getExtSetKind()));
11991199
Ops.push_back(SPIRV::DbgExpressionOpCodeMap::rmap(OpCode));
12001200
for (unsigned I = 1, E = Operands.size(); I < E; ++I) {
1201-
Ops.push_back(Operands[I]);
1201+
Ops.push_back(
1202+
getConstantValueOrLiteral(Operands, I, DebugInst->getExtSetKind()));
12021203
}
12031204
}
12041205
ArrayRef<uint64_t> Addr(Ops.data(), Ops.size());

lib/SPIRV/libSPIRV/SPIRV.debug.h

Lines changed: 80 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -260,23 +260,25 @@ enum ExpressionOpCode {
260260
DerefSize = 146,
261261
XderefSize = 147,
262262
Nop = 148,
263-
PushObjectAddress = 149,
264-
Call2 = 150,
265-
Call4 = 151,
266-
CallRef = 152,
267-
FormTlsAddress = 153,
268-
CallFrameCfa = 154,
269-
ImplicitValue = 155,
270-
ImplicitPointer = 156,
271-
Addrx = 157,
272-
Constx = 158,
273-
EntryValue = 159,
274-
ConstTypeOp = 160,
275-
RegvalType = 161,
276-
DerefType = 162,
277-
XderefType = 163,
278-
Reinterpret = 164,
279-
LLVMArg = 165,
263+
PushObjectAddress = 149,
264+
Call2 = 150,
265+
Call4 = 151,
266+
CallRef = 152,
267+
FormTlsAddress = 153,
268+
CallFrameCfa = 154,
269+
ImplicitValue = 155,
270+
ImplicitPointer = 156,
271+
Addrx = 157,
272+
Constx = 158,
273+
EntryValue = 159,
274+
ConstTypeOp = 160,
275+
RegvalType = 161,
276+
DerefType = 162,
277+
XderefType = 163,
278+
Reinterpret = 164,
279+
LLVMArg = 165,
280+
ImplicitPointerTag = 166,
281+
TagOffset = 167,
280282
};
281283

282284
enum ImportedEntityTag {
@@ -675,15 +677,15 @@ static std::map<ExpressionOpCode, unsigned> OpCountMap {
675677
{ Constu, 2 },
676678
{ Fragment, 3 },
677679
{ Convert, 3 },
678-
// { Addr, 2 }, /* not implemented */
679-
// { Const1u, 2 },
680-
// { Const1s, 2 },
681-
// { Const2u, 2 },
682-
// { Const2s, 2 },
683-
// { Const4u, 2 },
684-
// { Const4s, 2 },
685-
// { Const8u, 2 },
686-
// { Const8s, 2 },
680+
{ Addr, 2 },
681+
{ Const1u, 2 },
682+
{ Const1s, 2 },
683+
{ Const2u, 2 },
684+
{ Const2s, 2 },
685+
{ Const4u, 2 },
686+
{ Const4s, 2 },
687+
{ Const8u, 2 },
688+
{ Const8s, 2 },
687689
{ Consts, 2 },
688690
{ Dup, 1 },
689691
{ Drop, 1 },
@@ -702,14 +704,14 @@ static std::map<ExpressionOpCode, unsigned> OpCountMap {
702704
{ Shr, 1 },
703705
{ Shra, 1 },
704706
{ Xor, 1 },
705-
// { Bra, 2 }, /* not implemented */
707+
{ Bra, 2 },
706708
{ Eq, 1 },
707709
{ Ge, 1 },
708710
{ Gt, 1 },
709711
{ Le, 1 },
710712
{ Lt, 1 },
711713
{ Ne, 1 },
712-
// { Skip, 2 }, /* not implemented */
714+
{ Skip, 2 },
713715
{ Lit0, 1 },
714716
{ Lit1, 1 },
715717
{ Lit2, 1 },
@@ -807,29 +809,31 @@ static std::map<ExpressionOpCode, unsigned> OpCountMap {
807809
{ Breg30, 2 },
808810
{ Breg31, 2 },
809811
{ Regx, 2 },
810-
// { Fbreg, 1 }, /* not implemented */
812+
{ Fbreg, 1 },
811813
{ Bregx, 3 },
812-
// { Piece, 2 }, /* not implemented */
814+
{ Piece, 2 },
813815
{ DerefSize, 2 },
814816
{ XderefSize, 2 },
815817
{ Nop, 1 },
816818
{ PushObjectAddress, 1 },
817-
// { Call2, 2 }, /* not implemented */
818-
// { Call4, 2 },
819-
// { CallRef, 2 },
820-
// { FormTlsAddress, 1 },
821-
// { CallFrameCfa, 1 },
822-
// { ImplicitValue, 3 },
823-
// { ImplicitPointer, 3 },
824-
// { Addrx, 2 },
825-
// { Constx, 2 },
826-
// { EntryValue, 3 },
827-
// { ConstTypeOp, 4 },
828-
// { RegvalType, 3 },
829-
// { DerefType, 3 },
830-
// { XderefType, 3 },
831-
// { Reinterpret, 2 },
819+
{ Call2, 2 },
820+
{ Call4, 2 },
821+
{ CallRef, 2 },
822+
{ FormTlsAddress, 1 },
823+
{ CallFrameCfa, 1 },
824+
{ ImplicitValue, 3 },
825+
{ ImplicitPointer, 3 },
826+
{ Addrx, 2 },
827+
{ Constx, 2 },
828+
{ EntryValue, 3 },
829+
{ ConstTypeOp, 4 },
830+
{ RegvalType, 3 },
831+
{ DerefType, 3 },
832+
{ XderefType, 3 },
833+
{ Reinterpret, 2 },
832834
{ LLVMArg, 2 },
835+
{ ImplicitPointerTag, 2 },
836+
{ TagOffset, 2 },
833837
};
834838
}
835839

@@ -1121,6 +1125,15 @@ inline void DbgExpressionOpCodeMap::init() {
11211125
add(dwarf::DW_OP_constu, SPIRVDebug::Constu);
11221126
add(dwarf::DW_OP_LLVM_fragment, SPIRVDebug::Fragment);
11231127
add(dwarf::DW_OP_LLVM_convert, SPIRVDebug::Convert);
1128+
add(dwarf::DW_OP_addr, SPIRVDebug::Addr);
1129+
add(dwarf::DW_OP_const1u, SPIRVDebug::Const1u);
1130+
add(dwarf::DW_OP_const1s, SPIRVDebug::Const1s);
1131+
add(dwarf::DW_OP_const2u, SPIRVDebug::Const2u);
1132+
add(dwarf::DW_OP_const2s, SPIRVDebug::Const2s);
1133+
add(dwarf::DW_OP_const4u, SPIRVDebug::Const4u);
1134+
add(dwarf::DW_OP_const4s, SPIRVDebug::Const4s);
1135+
add(dwarf::DW_OP_const8u, SPIRVDebug::Const8u);
1136+
add(dwarf::DW_OP_const8s, SPIRVDebug::Const8s);
11241137
add(dwarf::DW_OP_consts, SPIRVDebug::Consts);
11251138
add(dwarf::DW_OP_dup, SPIRVDebug::Dup);
11261139
add(dwarf::DW_OP_drop, SPIRVDebug::Drop);
@@ -1146,6 +1159,7 @@ inline void DbgExpressionOpCodeMap::init() {
11461159
add(dwarf::DW_OP_le, SPIRVDebug::Le);
11471160
add(dwarf::DW_OP_lt, SPIRVDebug::Lt);
11481161
add(dwarf::DW_OP_ne, SPIRVDebug::Ne);
1162+
add(dwarf::DW_OP_skip, SPIRVDebug::Skip);
11491163
add(dwarf::DW_OP_lit0, SPIRVDebug::Lit0);
11501164
add(dwarf::DW_OP_lit1, SPIRVDebug::Lit1);
11511165
add(dwarf::DW_OP_lit2, SPIRVDebug::Lit2);
@@ -1244,11 +1258,31 @@ inline void DbgExpressionOpCodeMap::init() {
12441258
add(dwarf::DW_OP_breg31, SPIRVDebug::Breg31);
12451259
add(dwarf::DW_OP_regx, SPIRVDebug::Regx);
12461260
add(dwarf::DW_OP_bregx, SPIRVDebug::Bregx);
1261+
add(dwarf::DW_OP_piece, SPIRVDebug::Piece);
12471262
add(dwarf::DW_OP_deref_size, SPIRVDebug::DerefSize );
12481263
add(dwarf::DW_OP_xderef_size, SPIRVDebug::XderefSize );
12491264
add(dwarf::DW_OP_nop, SPIRVDebug::Nop);
12501265
add(dwarf::DW_OP_push_object_address, SPIRVDebug::PushObjectAddress );
1251-
add(dwarf::DW_OP_LLVM_arg, SPIRVDebug::LLVMArg);
1266+
1267+
1268+
add(dwarf::DW_OP_call2, SPIRVDebug::Call2);
1269+
add(dwarf::DW_OP_call4, SPIRVDebug::Call4);
1270+
add(dwarf::DW_OP_call_ref, SPIRVDebug::CallRef);
1271+
add(dwarf::DW_OP_form_tls_address, SPIRVDebug::FormTlsAddress);
1272+
add(dwarf::DW_OP_call_frame_cfa, SPIRVDebug::CallFrameCfa);
1273+
add(dwarf::DW_OP_implicit_value, SPIRVDebug::ImplicitValue);
1274+
add(dwarf::DW_OP_implicit_pointer, SPIRVDebug::ImplicitPointer);
1275+
add(dwarf::DW_OP_addrx, SPIRVDebug::Addrx);
1276+
add(dwarf::DW_OP_constx, SPIRVDebug::Constx);
1277+
add(dwarf::DW_OP_entry_value, SPIRVDebug::EntryValue);
1278+
add(dwarf::DW_OP_const_type, SPIRVDebug::ConstTypeOp);
1279+
add(dwarf::DW_OP_regval_type, SPIRVDebug::RegvalType);
1280+
add(dwarf::DW_OP_deref_type, SPIRVDebug::DerefType);
1281+
add(dwarf::DW_OP_xderef_type, SPIRVDebug::XderefType);
1282+
add(dwarf::DW_OP_reinterpret, SPIRVDebug::Reinterpret);
1283+
add(dwarf::DW_OP_LLVM_arg, SPIRVDebug::LLVMArg);
1284+
add(dwarf::DW_OP_LLVM_implicit_pointer, SPIRVDebug::ImplicitPointerTag);
1285+
add(dwarf::DW_OP_LLVM_tag_offset, SPIRVDebug::TagOffset);
12521286
}
12531287

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

test/DebugInfo/DebugInfoLLVMArg.ll

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,27 @@
11
; This test checks that DW_OP_LLVM_arg operation goes through round trip translation correctly.
2+
; DW_OP_LLVM_arg is mapped on 165 in SPIR-V
23

34
; RUN: llvm-as %s -o %t.bc
45
; RUN: llvm-spirv %t.bc -o %t.spv --spirv-allow-extra-diexpressions
56
; RUN: llvm-spirv %t.spv -to-text -o %t.spt
6-
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV
7+
; RUN: FileCheck < %t.spt %s --check-prefixes=CHECK-SPIRV,CHECK-SPIRV-OCL
78
; RUN: llvm-spirv -r -emit-opaque-pointers %t.spv -o %t.rev.bc
89
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
910

11+
; RUN: llvm-as %s -o %t.bc
12+
; RUN: llvm-spirv %t.bc -o %t.spv --spirv-debug-info-version=nonsemantic-shader-200
13+
; RUN: llvm-spirv %t.spv -to-text -o %t.spt
14+
; RUN: FileCheck < %t.spt %s --check-prefixes=CHECK-SPIRV,CHECK-SPIRV-200
15+
; RUN: llvm-spirv -r -emit-opaque-pointers %t.spv -o %t.rev.bc
16+
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM
17+
18+
; CHECK-SPIRV-200-DAG: TypeInt [[#INT32:]] 32 0
19+
; CHECK-SPIRV-200-DAG: Constant [[#INT32]] [[#CONST0:]] 0
20+
; CHECK-SPIRV-200-DAG: Constant [[#INT32]] [[#CONST165:]] 165
1021
; CHECK-SPIRV: Undef [[#]] [[#UNDEF:]]
1122
; CHECK-SPIRV: [[#DEBUG_LOC_VAR:]] [[#]] DebugLocalVariable
12-
; CHECK-SPIRV: [[#EXPR_ARG_0:]] [[#]] DebugOperation 165 0
23+
; CHECK-SPIRV-OCL: [[#EXPR_ARG_0:]] [[#]] DebugOperation 165 0
24+
; CHECK-SPIRV-200: [[#EXPR_ARG_0:]] [[#]] DebugOperation [[#CONST165]] [[#CONST0]]
1325
; CHECK-SPIRV: [[#EXPRESSION:]] [[#]] DebugExpression [[#EXPR_ARG_0]]
1426
; CHECK-SPIRV: [[#EXPR_EMPTY:]] [[#]] DebugExpression{{ *$}}
1527
; CHECK-SPIRV: Variable [[#]] [[#VAL:]]

test/DebugInfo/expr-opcode.ll

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@
66
; RUN: llc -mtriple=%triple -dwarf-version=5 -filetype=obj -O0 < %t.rev.ll
77
; RUN: llc -mtriple=%triple -dwarf-version=4 -filetype=obj -O0 < %t.rev.ll
88

9+
; RUN: llvm-spirv %t.bc -o %t.spv --spirv-debug-info-version=nonsemantic-shader-200
10+
; RUN: llvm-spirv -r -emit-opaque-pointers %t.spv -o - | llvm-dis -o %t.rev.ll
11+
; RUN: FileCheck %s --input-file %t.rev.ll
12+
13+
; RUN: llc -mtriple=%triple -dwarf-version=5 -filetype=obj -O0 < %t.rev.ll
14+
; RUN: llc -mtriple=%triple -dwarf-version=4 -filetype=obj -O0 < %t.rev.ll
15+
916
; CHECK: DW_OP_constu, 42
1017
; CHECK: DW_OP_plus_uconst, 42
1118
; CHECK: DW_OP_plus

0 commit comments

Comments
 (0)