aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/c.zig7
-rw-r--r--src/codegen/llvm.zig34
-rw-r--r--src/codegen/spirv.zig4
3 files changed, 30 insertions, 15 deletions
diff --git a/src/codegen/c.zig b/src/codegen/c.zig
index 7c35a178a0..397cb071b6 100644
--- a/src/codegen/c.zig
+++ b/src/codegen/c.zig
@@ -3293,7 +3293,7 @@ fn genBodyInner(f: *Function, body: []const Air.Inst.Index) error{ AnalysisFail,
.dbg_stmt => try airDbgStmt(f, inst),
.dbg_inline_block => try airDbgInlineBlock(f, inst),
- .dbg_var_ptr, .dbg_var_val => try airDbgVar(f, inst),
+ .dbg_var_ptr, .dbg_var_val, .dbg_arg_inline => try airDbgVar(f, inst),
.call => try airCall(f, inst, .auto),
.call_always_tail => .none,
@@ -4590,14 +4590,15 @@ fn airDbgInlineBlock(f: *Function, inst: Air.Inst.Index) !CValue {
fn airDbgVar(f: *Function, inst: Air.Inst.Index) !CValue {
const pt = f.object.dg.pt;
const zcu = pt.zcu;
+ const tag = f.air.instructions.items(.tag)[@intFromEnum(inst)];
const pl_op = f.air.instructions.items(.data)[@intFromEnum(inst)].pl_op;
- const name = f.air.nullTerminatedString(pl_op.payload);
+ const name: Air.NullTerminatedString = @enumFromInt(pl_op.payload);
const operand_is_undef = if (try f.air.value(pl_op.operand, pt)) |v| v.isUndefDeep(zcu) else false;
if (!operand_is_undef) _ = try f.resolveInst(pl_op.operand);
try reap(f, inst, &.{pl_op.operand});
const writer = f.object.writer();
- try writer.print("/* var:{s} */\n", .{name});
+ try writer.print("/* {s}:{s} */\n", .{ @tagName(tag), name.toSlice(f.air) });
return .none;
}
diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig
index 8fb4fa7ef9..233cf7e3eb 100644
--- a/src/codegen/llvm.zig
+++ b/src/codegen/llvm.zig
@@ -1665,6 +1665,7 @@ pub const Object = struct {
.ret_ptr = ret_ptr,
.args = args.items,
.arg_index = 0,
+ .arg_inline_index = 0,
.func_inst_table = .{},
.blocks = .{},
.sync_scope = if (owner_mod.single_threaded) .singlethread else .system,
@@ -4769,7 +4770,8 @@ pub const FuncGen = struct {
/// it omits 0-bit types. If the function uses sret as the first parameter,
/// this slice does not include it.
args: []const Builder.Value,
- arg_index: usize,
+ arg_index: u32,
+ arg_inline_index: u32,
err_ret_trace: Builder.Value = .none,
@@ -5082,7 +5084,8 @@ pub const FuncGen = struct {
.dbg_stmt => try self.airDbgStmt(inst),
.dbg_inline_block => try self.airDbgInlineBlock(inst),
.dbg_var_ptr => try self.airDbgVarPtr(inst),
- .dbg_var_val => try self.airDbgVarVal(inst),
+ .dbg_var_val => try self.airDbgVarVal(inst, false),
+ .dbg_arg_inline => try self.airDbgVarVal(inst, true),
.c_va_arg => try self.airCVaArg(inst),
.c_va_copy => try self.airCVaCopy(inst),
@@ -6677,6 +6680,7 @@ pub const FuncGen = struct {
fn airDbgInlineBlock(self: *FuncGen, inst: Air.Inst.Index) !Builder.Value {
const ty_pl = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_pl;
const extra = self.air.extraData(Air.DbgInlineBlock, ty_pl.payload);
+ self.arg_inline_index = 0;
return self.lowerBlock(inst, extra.data.func, @ptrCast(self.air.extra[extra.end..][0..extra.data.body_len]));
}
@@ -6685,11 +6689,11 @@ pub const FuncGen = struct {
const mod = o.pt.zcu;
const pl_op = self.air.instructions.items(.data)[@intFromEnum(inst)].pl_op;
const operand = try self.resolveInst(pl_op.operand);
- const name = self.air.nullTerminatedString(pl_op.payload);
+ const name: Air.NullTerminatedString = @enumFromInt(pl_op.payload);
const ptr_ty = self.typeOf(pl_op.operand);
const debug_local_var = try o.builder.debugLocalVar(
- try o.builder.metadataString(name),
+ try o.builder.metadataString(name.toSlice(self.air)),
self.file,
self.scope,
self.prev_dbg_line,
@@ -6712,15 +6716,25 @@ pub const FuncGen = struct {
return .none;
}
- fn airDbgVarVal(self: *FuncGen, inst: Air.Inst.Index) !Builder.Value {
+ fn airDbgVarVal(self: *FuncGen, inst: Air.Inst.Index, is_arg: bool) !Builder.Value {
const o = self.ng.object;
const pl_op = self.air.instructions.items(.data)[@intFromEnum(inst)].pl_op;
const operand = try self.resolveInst(pl_op.operand);
const operand_ty = self.typeOf(pl_op.operand);
- const name = self.air.nullTerminatedString(pl_op.payload);
+ const name: Air.NullTerminatedString = @enumFromInt(pl_op.payload);
- const debug_local_var = try o.builder.debugLocalVar(
- try o.builder.metadataString(name),
+ const debug_local_var = if (is_arg) try o.builder.debugParameter(
+ try o.builder.metadataString(name.toSlice(self.air)),
+ self.file,
+ self.scope,
+ self.prev_dbg_line,
+ try o.lowerDebugType(operand_ty),
+ arg_no: {
+ self.arg_inline_index += 1;
+ break :arg_no self.arg_inline_index;
+ },
+ ) else try o.builder.debugLocalVar(
+ try o.builder.metadataString(name.toSlice(self.air)),
self.file,
self.scope,
self.prev_dbg_line,
@@ -8835,12 +8849,12 @@ pub const FuncGen = struct {
const lbrace_col = func.lbrace_column + 1;
const debug_parameter = try o.builder.debugParameter(
- try o.builder.metadataString(self.air.nullTerminatedString(@intFromEnum(name))),
+ try o.builder.metadataString(name.toSlice(self.air)),
self.file,
self.scope,
lbrace_line,
try o.lowerDebugType(inst_ty),
- @intCast(self.arg_index),
+ self.arg_index,
);
const old_location = self.wip.debug_location;
diff --git a/src/codegen/spirv.zig b/src/codegen/spirv.zig
index b13be401ab..a89dd8f10b 100644
--- a/src/codegen/spirv.zig
+++ b/src/codegen/spirv.zig
@@ -6366,8 +6366,8 @@ const NavGen = struct {
fn airDbgVar(self: *NavGen, inst: Air.Inst.Index) !void {
const pl_op = self.air.instructions.items(.data)[@intFromEnum(inst)].pl_op;
const target_id = try self.resolve(pl_op.operand);
- const name = self.air.nullTerminatedString(pl_op.payload);
- try self.spv.debugName(target_id, name);
+ const name: Air.NullTerminatedString = @enumFromInt(pl_op.payload);
+ try self.spv.debugName(target_id, name.toSlice(self.air));
}
fn airAssembly(self: *NavGen, inst: Air.Inst.Index) !?IdRef {