Preserve debug info for wrap-opkill (#3331) Preserve debug info for wrap-opkill
diff --git a/source/opt/instruction.h b/source/opt/instruction.h index 87d7722..aa29c5e 100644 --- a/source/opt/instruction.h +++ b/source/opt/instruction.h
@@ -291,6 +291,8 @@ // Sets DebugScope. inline void SetDebugScope(const DebugScope& scope); inline const DebugScope& GetDebugScope() const { return dbg_scope_; } + // Updates OpLine and DebugScope based on the information of |from|. + inline void UpdateDebugInfo(const Instruction* from); // Remove the |index|-th operand void RemoveOperand(uint32_t index) { operands_.erase(operands_.begin() + index); @@ -636,6 +638,14 @@ } } +inline void Instruction::UpdateDebugInfo(const Instruction* from) { + if (from == nullptr) return; + clear_dbg_line_insts(); + if (!from->dbg_line_insts().empty()) + dbg_line_insts().push_back(from->dbg_line_insts()[0]); + SetDebugScope(from->GetDebugScope()); +} + inline void Instruction::SetResultType(uint32_t ty_id) { // TODO(dsinclair): Allow setting a type id if there wasn't one // previously. Need to make room in the operands_ array to place the result,
diff --git a/source/opt/wrap_opkill.cpp b/source/opt/wrap_opkill.cpp index 05e1db0..3c8bae6 100644 --- a/source/opt/wrap_opkill.cpp +++ b/source/opt/wrap_opkill.cpp
@@ -59,9 +59,12 @@ if (func_id == 0) { return false; } - if (ir_builder.AddFunctionCall(GetVoidTypeId(), func_id, {}) == nullptr) { + Instruction* call_inst = + ir_builder.AddFunctionCall(GetVoidTypeId(), func_id, {}); + if (call_inst == nullptr) { return false; } + call_inst->UpdateDebugInfo(inst); Instruction* return_inst = nullptr; uint32_t return_type_id = GetOwningFunctionsReturnType(inst);
diff --git a/test/opt/wrap_opkill_test.cpp b/test/opt/wrap_opkill_test.cpp index 359a9f2..33e52f0 100644 --- a/test/opt/wrap_opkill_test.cpp +++ b/test/opt/wrap_opkill_test.cpp
@@ -589,6 +589,63 @@ SinglePassRunAndMatch<WrapOpKill>(text, true); } +TEST_F(WrapOpKillTest, DebugInfoSimple) { + const std::string text = R"( +; CHECK: OpEntryPoint Fragment [[main:%\w+]] +; CHECK: [[main]] = OpFunction +; CHECK: OpFunctionCall %void [[orig_kill:%\w+]] +; CHECK: [[orig_kill]] = OpFunction +; CHECK-NEXT: OpLabel +; CHECK-NEXT: {{%\d+}} = OpExtInst %void [[ext:%\d+]] DebugScope +; CHECK-NEXT: OpLine [[file:%\d+]] 100 200 +; CHECK-NEXT: OpFunctionCall %void [[new_kill:%\w+]] +; CHECK-NEXT: {{%\d+}} = OpExtInst %void [[ext]] DebugNoScope +; CHECK-NEXT: OpReturn +; CHECK: [[new_kill]] = OpFunction +; CHECK-NEXT: OpLabel +; CHECK-NEXT: OpKill +; CHECK-NEXT: OpFunctionEnd + OpCapability Shader + %1 = OpExtInstImport "OpenCL.DebugInfo.100" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" + OpExecutionMode %main OriginUpperLeft + %2 = OpString "File name" + OpSource GLSL 330 + OpName %main "main" + %void = OpTypeVoid + %5 = OpTypeFunction %void + %bool = OpTypeBool + %true = OpConstantTrue %bool + %3 = OpExtInst %void %1 DebugSource %2 + %4 = OpExtInst %void %1 DebugCompilationUnit 0 0 %3 GLSL + %main = OpFunction %void None %5 + %8 = OpLabel + OpBranch %9 + %9 = OpLabel + OpLoopMerge %10 %11 None + OpBranch %12 + %12 = OpLabel + OpBranchConditional %true %13 %10 + %13 = OpLabel + OpBranch %11 + %11 = OpLabel + %14 = OpFunctionCall %void %kill_ + OpBranch %9 + %10 = OpLabel + OpReturn + OpFunctionEnd + %kill_ = OpFunction %void None %5 + %15 = OpLabel + %16 = OpExtInst %void %1 DebugScope %4 + OpLine %2 100 200 + OpKill + OpFunctionEnd + )"; + + SinglePassRunAndMatch<WrapOpKill>(text, true); +} + } // namespace } // namespace opt } // namespace spvtools