authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2023-09-21 20:26:52+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-09-23 12:36:56-07:00
log63512192deeb2ba42e51a4dc7e1ba24eefcee7db
tree73a84a3592d0fce2c2b33f7606038bd2f150d51a
parent075584a4d74276119372994d895bca747b1f861f

spirv: fix source line numbers


1 files changed, 43 insertions(+), 21 deletions(-)

src/codegen/spirv.zig+43-21
......@@ -107,6 +107,10 @@ pub const DeclGen = struct {
107107 /// The code (prologue and body) for the function we are currently generating code for.
108108 func: SpvModule.Fn = .{},
109109
110 /// Stack of the base offsets of the current decl, which is what `dbg_stmt` is relative to.
111 /// This is a stack to keep track of inline functions.
112 base_line_stack: std.ArrayListUnmanaged(u32) = .{},
113
110114 /// If `gen` returned `Error.CodegenFail`, this contains an explanatory message.
111115 /// Memory is owned by `module.gpa`.
112116 error_msg: ?*Module.ErrorMsg,
......@@ -205,6 +209,7 @@ pub const DeclGen = struct {
205209 self.blocks.clearRetainingCapacity();
206210 self.current_block_label_id = undefined;
207211 self.func.reset();
212 self.base_line_stack.items.len = 0;
208213 self.error_msg = null;
209214
210215 self.genDecl() catch |err| switch (err) {
......@@ -229,6 +234,7 @@ pub const DeclGen = struct {
229234 self.type_map.deinit(self.gpa);
230235 self.blocks.deinit(self.gpa);
231236 self.func.deinit(self.gpa);
237 self.base_line_stack.deinit(self.gpa);
232238 }
233239
234240 /// Return the target which we are currently compiling for.
......@@ -1422,6 +1428,8 @@ pub const DeclGen = struct {
14221428
14231429 const decl_id = self.spv.declPtr(spv_decl_index).result_id;
14241430
1431 try self.base_line_stack.append(self.gpa, decl.src_line);
1432
14251433 if (decl.val.getFunction(mod)) |_| {
14261434 assert(decl.ty.zigTypeTag(mod) == .Fn);
14271435 const prototype_id = try self.resolveTypeId(decl.ty);
......@@ -1739,7 +1747,6 @@ pub const DeclGen = struct {
17391747 .br => return self.airBr(inst),
17401748 .breakpoint => return,
17411749 .cond_br => return self.airCondBr(inst),
1742 .dbg_stmt => return self.airDbgStmt(inst),
17431750 .loop => return self.airLoop(inst),
17441751 .ret => return self.airRet(inst),
17451752 .ret_load => return self.airRetLoad(inst),
......@@ -1747,6 +1754,14 @@ pub const DeclGen = struct {
17471754 .switch_br => return self.airSwitchBr(inst),
17481755 .unreach, .trap => return self.airUnreach(),
17491756
1757 .dbg_stmt => return self.airDbgStmt(inst),
1758 .dbg_inline_begin => return self.airDbgInlineBegin(inst),
1759 .dbg_inline_end => return self.airDbgInlineEnd(inst),
1760 .dbg_var_ptr => return,
1761 .dbg_var_val => return,
1762 .dbg_block_begin => return,
1763 .dbg_block_end => return,
1764
17501765 .unwrap_errunion_err => try self.airErrUnionErr(inst),
17511766 .unwrap_errunion_payload => try self.airErrUnionPayload(inst),
17521767 .wrap_errunion_err => try self.airWrapErrUnionErr(inst),
......@@ -1766,13 +1781,6 @@ pub const DeclGen = struct {
17661781 .call_always_tail => try self.airCall(inst, .always_tail),
17671782 .call_never_tail => try self.airCall(inst, .never_tail),
17681783 .call_never_inline => try self.airCall(inst, .never_inline),
1769
1770 .dbg_inline_begin => return,
1771 .dbg_inline_end => return,
1772 .dbg_var_ptr => return,
1773 .dbg_var_val => return,
1774 .dbg_block_begin => return,
1775 .dbg_block_end => return,
17761784 // zig fmt: on
17771785
17781786 else => |tag| return self.todo("implement AIR tag {s}", .{@tagName(tag)}),
......@@ -3053,19 +3061,6 @@ pub const DeclGen = struct {
30533061 try self.genBody(else_body);
30543062 }
30553063
3056 fn airDbgStmt(self: *DeclGen, inst: Air.Inst.Index) !void {
3057 const dbg_stmt = self.air.instructions.items(.data)[inst].dbg_stmt;
3058 const src_fname_id = try self.spv.resolveSourceFileName(
3059 self.module,
3060 self.module.declPtr(self.decl_index),
3061 );
3062 try self.func.body.emit(self.spv.gpa, .OpLine, .{
3063 .file = src_fname_id,
3064 .line = dbg_stmt.line,
3065 .column = dbg_stmt.column,
3066 });
3067 }
3068
30693064 fn airLoad(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
30703065 const mod = self.module;
30713066 const ty_op = self.air.instructions.items(.data)[inst].ty_op;
......@@ -3535,6 +3530,33 @@ pub const DeclGen = struct {
35353530 try self.func.body.emit(self.spv.gpa, .OpUnreachable, {});
35363531 }
35373532
3533 fn airDbgStmt(self: *DeclGen, inst: Air.Inst.Index) !void {
3534 const dbg_stmt = self.air.instructions.items(.data)[inst].dbg_stmt;
3535 const src_fname_id = try self.spv.resolveSourceFileName(
3536 self.module,
3537 self.module.declPtr(self.decl_index),
3538 );
3539 const base_line = self.base_line_stack.getLast();
3540 try self.func.body.emit(self.spv.gpa, .OpLine, .{
3541 .file = src_fname_id,
3542 .line = base_line + dbg_stmt.line + 1,
3543 .column = dbg_stmt.column + 1,
3544 });
3545 }
3546
3547 fn airDbgInlineBegin(self: *DeclGen, inst: Air.Inst.Index) !void {
3548 const mod = self.module;
3549 const fn_ty = self.air.instructions.items(.data)[inst].ty_fn;
3550 const decl_index = mod.funcInfo(fn_ty.func).owner_decl;
3551 const decl = mod.declPtr(decl_index);
3552 try self.base_line_stack.append(self.gpa, decl.src_line);
3553 }
3554
3555 fn airDbgInlineEnd(self: *DeclGen, inst: Air.Inst.Index) !void {
3556 _ = inst;
3557 _ = self.base_line_stack.pop();
3558 }
3559
35383560 fn airAssembly(self: *DeclGen, inst: Air.Inst.Index) !?IdRef {
35393561 const mod = self.module;
35403562 const ty_pl = self.air.instructions.items(.data)[inst].ty_pl;