From 2614860ddf13d9b6745f7ff64cc1a16d60419f13 Mon Sep 17 00:00:00 2001 From: Fraser Cormack Date: Thu, 30 Nov 2023 12:13:29 +0000 Subject: [PATCH] [DebugInfo] Fix instruction enumeration These two opcodes were mistakenly swapped when they were originally added, at least according to the `DebugInfo`, `OpenCL.DebugInfo.100`, and `NonSemantic.Shader.DebugInfo.100` extended instruction sets. This might break existing third-party SPIR-V translators if they are accommodating this bug, mistakenly or otherwise. --- lib/SPIRV/libSPIRV/SPIRV.debug.h | 4 +- ...ctInstructionEnumerationSPIRVtoLLVM.spvasm | 49 +++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 test/DebugInfo/IncorrectInstructionEnumerationSPIRVtoLLVM.spvasm diff --git a/lib/SPIRV/libSPIRV/SPIRV.debug.h b/lib/SPIRV/libSPIRV/SPIRV.debug.h index dbca2dbe75..3fefca48cf 100644 --- a/lib/SPIRV/libSPIRV/SPIRV.debug.h +++ b/lib/SPIRV/libSPIRV/SPIRV.debug.h @@ -34,8 +34,8 @@ enum Instruction { TypePtrToMember = 13, TypeTemplate = 14, TypeTemplateParameter = 15, - TypeTemplateParameterPack = 16, - TypeTemplateTemplateParameter = 17, + TypeTemplateTemplateParameter = 16, + TypeTemplateParameterPack = 17, GlobalVariable = 18, FunctionDeclaration = 19, Function = 20, diff --git a/test/DebugInfo/IncorrectInstructionEnumerationSPIRVtoLLVM.spvasm b/test/DebugInfo/IncorrectInstructionEnumerationSPIRVtoLLVM.spvasm new file mode 100644 index 0000000000..7b7aa1d791 --- /dev/null +++ b/test/DebugInfo/IncorrectInstructionEnumerationSPIRVtoLLVM.spvasm @@ -0,0 +1,49 @@ +; This test checks that the decoding of DebugTypeTemplateParameterPack and +; DebugTypeTemplateTemplateParameter is correct. + +; REQUIRES: spirv-as + +; RUN: spirv-as --target-env spv1.3 %s -o %t.spv +; RUN: llvm-spirv -r %t.spv -o - | llvm-dis | FileCheck %s + +; SPIR-V +; Version: 1.1 +; Generator: Khronos LLVM/SPIR-V Translator; 14 +; Bound: 16 +; Schema: 0 + OpCapability Addresses + OpCapability Kernel + %1 = OpExtInstImport "OpenCL.std" + %2 = OpExtInstImport "OpenCL.DebugInfo.100" + OpMemoryModel Physical64 OpenCL + OpEntryPoint Kernel %5 "func" + %8 = OpString "/tmp/test.cpp" + %9 = OpString "//__CSK_MD5:18aa9ce738eaafc7b7b7181c19092815" + %12 = OpString "func" + %14 = OpString "" + %15 = OpString "T" + %16 = OpString "U" + %17 = OpString "Foo" + OpSource OpenCL_CPP 100000 + OpName %entry "entry" + %void = OpTypeVoid + %4 = OpTypeFunction %void + %10 = OpExtInst %void %2 DebugSource %8 %9 + %11 = OpExtInst %void %2 DebugCompilationUnit 65536 5 %10 OpenCL_CPP + %13 = OpExtInst %void %2 DebugInfoNone + %20 = OpExtInst %void %2 DebugFunction %12 %13 %10 1 0 %11 %14 FlagIsDefinition|FlagPrototyped|FlagIsOptimized 2 %5 %13 + %18 = OpExtInst %void %2 DebugTypeTemplateParameterPack %15 %10 0 0 %13 %13 + %19 = OpExtInst %void %2 DebugTypeTemplateTemplateParameter %16 %17 %10 0 0 + %21 = OpExtInst %void %2 DebugTypeTemplate %20 %18 %19 + %5 = OpFunction %void None %4 + %entry = OpLabel + OpReturn + OpFunctionEnd + +; CHECK: = distinct !DISubprogram(name: "func", +; CHECK-SAME: templateParams: [[TPARAMS:![0-9]+]]{{[,)]}} + +; CHECK-DAG: [[TPARAMS]] = !{[[PACKPARAM:![0-9]+]], [[TTPARAM:![0-9]+]]} +; CHECK-DAG: [[PACKPARAM]] = !DITemplateValueParameter(tag: DW_TAG_GNU_template_parameter_pack, name: "T", value: [[PACK:![0-9]+]]) +; CHECK-DAG: [[PACK]] = !{null, null} +; CHECK-DAG: [[TTPARAM]] = !DITemplateValueParameter(tag: DW_TAG_GNU_template_template_param, name: "U", value: !"Foo")