Preserve debug info for wrap-opkill (#3331)

Preserve debug info for wrap-opkill
This commit is contained in:
Jaebaek Seo 2020-05-06 12:57:57 -04:00 committed by GitHub
parent d2b4862194
commit c8590c18bd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 71 additions and 1 deletions

View File

@ -291,6 +291,8 @@ class Instruction : public utils::IntrusiveNodeBase<Instruction> {
// 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::SetDebugScope(const DebugScope& scope) {
}
}
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,

View File

@ -59,9 +59,12 @@ bool WrapOpKill::ReplaceWithFunctionCall(Instruction* inst) {
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);

View File

@ -589,6 +589,63 @@ TEST_F(WrapOpKillTest, KillInSingleBlockLoop) {
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