authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2026-09-16 21:25:03-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2026-09-17 22:55:43-04:00
loga89d242891270885bf8cb138d40d860315d02bb3
tree7e33d8dfba4bb019d65e4a2551e6155bf28dedb8
parent5ede6a167eef1835f6fb6c768a82d977269dafe5

x86_64: handle OPV args

Closes #35194

4 files changed, 19 insertions(+), 43 deletions(-)

src/codegen/x86_64/CodeGen.zig+19-28
......@@ -1224,9 +1224,7 @@ fn formatWipMir(data: FormatWipMirData, w: *Writer) Writer.Error!void {
12241224 .pseudo_dbg_enter_block_none,
12251225 .pseudo_dbg_leave_block_none,
12261226 .pseudo_dbg_end_none,
1227 .pseudo_dbg_arg_none,
12281227 .pseudo_dbg_var_args_none,
1229 .pseudo_dbg_var_none,
12301228 .pseudo_dead_none,
12311229 => {},
12321230 .pseudo_dbg_line_stmt_line_column,
......@@ -2318,39 +2316,32 @@ fn genMainBody(
23182316 };
23192317 defer zir_param_index += 1;
23202318
2321 if (comptime_args.len > 0) switch (comptime_args.get(ip)[zir_param_index]) {
2322 .none => {},
2323 else => |comptime_arg| {
2324 try cg.mir_locals.append(cg.gpa, .{ .name = name, .type = ip.typeOf(comptime_arg) });
2325 _ = try cg.addInst(.{
2326 .tag = .pseudo,
2327 .ops = .pseudo_dbg_arg_val,
2328 .data = .{ .ip_index = comptime_arg },
2329 });
2330 continue;
2319 const arg_ty: Type, const arg_val: ?Value = arg: switch (if (comptime_args.len > 0)
2320 comptime_args.get(ip)[zir_param_index]
2321 else
2322 .none) {
2323 else => |arg_val| .{ .fromInterned(ip.typeOf(arg_val)), .fromInterned(arg_val) },
2324 .none => {
2325 const arg_ty: Type = .fromInterned(fn_info.param_types.get(ip)[fn_param_index]);
2326 fn_param_index += 1;
2327 break :arg .{ arg_ty, try arg_ty.onePossibleValue(pt) };
23312328 },
23322329 };
2333
2334 const arg_ty = fn_info.param_types.get(ip)[fn_param_index];
2335 try cg.mir_locals.append(cg.gpa, .{ .name = name, .type = arg_ty });
2336 fn_param_index += 1;
2337
2338 if (air_arg_index == air_args_body.len) {
2339 try cg.asmPseudo(.pseudo_dbg_arg_none);
2330 try cg.mir_locals.append(cg.gpa, .{ .name = name, .type = arg_ty.toIntern() });
2331 if (arg_val) |val| {
2332 _ = try cg.addInst(.{
2333 .tag = .pseudo,
2334 .ops = .pseudo_dbg_arg_val,
2335 .data = .{ .ip_index = val.toIntern() },
2336 });
23402337 continue;
23412338 }
2339
23422340 const air_arg_inst = air_args_body[air_arg_index];
23432341 const air_arg_data = cg.air.instructions.items(.data)[air_arg_index].arg;
2344 if (air_arg_data.zir_param_index != zir_param_index) {
2345 try cg.asmPseudo(.pseudo_dbg_arg_none);
2346 continue;
2347 }
23482342 air_arg_index += 1;
2349 try cg.genLocalDebugInfo(
2350 .arg,
2351 .fromInterned(arg_ty),
2352 cg.getResolvedInstValue(air_arg_inst).short,
2353 );
2343 assert(air_arg_data.zir_param_index == zir_param_index);
2344 try cg.genLocalDebugInfo(.arg, arg_ty, cg.getResolvedInstValue(air_arg_inst).short);
23542345 }
23552346 if (fn_info.is_var_args) try cg.asmPseudo(.pseudo_dbg_var_args_none);
23562347 }
src/codegen/x86_64/Emit.zig-7
......@@ -536,14 +536,12 @@ pub fn emitMir(emit: *Emit) Error!void {
536536 .column = emit.prev_di_loc.column,
537537 .end = true,
538538 }),
539 .pseudo_dbg_arg_none,
540539 .pseudo_dbg_arg_i_s,
541540 .pseudo_dbg_arg_i_u,
542541 .pseudo_dbg_arg_i_64,
543542 .pseudo_dbg_arg_ro,
544543 .pseudo_dbg_arg_fa,
545544 .pseudo_dbg_arg_m,
546 .pseudo_dbg_var_none,
547545 .pseudo_dbg_var_i_s,
548546 .pseudo_dbg_var_i_u,
549547 .pseudo_dbg_var_i_64,
......@@ -560,7 +558,6 @@ pub fn emitMir(emit: *Emit) Error!void {
560558 var loc_buf: [2]DwarfLoc = undefined;
561559 const loc: DwarfLoc = loc: switch (mir_inst.ops) {
562560 else => unreachable,
563 .pseudo_dbg_arg_none, .pseudo_dbg_var_none => .empty,
564561 .pseudo_dbg_arg_i_s,
565562 .pseudo_dbg_arg_i_u,
566563 .pseudo_dbg_var_i_s,
......@@ -632,23 +629,19 @@ pub fn emitMir(emit: *Emit) Error!void {
632629 try dwarf.genLocalVarDebugInfo(
633630 switch (mir_inst.ops) {
634631 else => unreachable,
635 .pseudo_dbg_arg_none,
636632 .pseudo_dbg_arg_i_s,
637633 .pseudo_dbg_arg_i_u,
638634 .pseudo_dbg_arg_i_64,
639635 .pseudo_dbg_arg_ro,
640636 .pseudo_dbg_arg_fa,
641637 .pseudo_dbg_arg_m,
642 .pseudo_dbg_arg_val,
643638 => .arg,
644 .pseudo_dbg_var_none,
645639 .pseudo_dbg_var_i_s,
646640 .pseudo_dbg_var_i_u,
647641 .pseudo_dbg_var_i_64,
648642 .pseudo_dbg_var_ro,
649643 .pseudo_dbg_var_fa,
650644 .pseudo_dbg_var_m,
651 .pseudo_dbg_var_val,
652645 => .local_var,
653646 },
654647 local.name.toSlice(&emit.lower.mir),
src/codegen/x86_64/Lower.zig-2
......@@ -320,7 +320,6 @@ pub fn lowerMir(lower: *Lower, index: Mir.Inst.Index) Error!struct {
320320 .pseudo_dbg_enter_inline_func,
321321 .pseudo_dbg_leave_inline_func,
322322 .pseudo_dbg_end_none,
323 .pseudo_dbg_arg_none,
324323 .pseudo_dbg_arg_i_s,
325324 .pseudo_dbg_arg_i_u,
326325 .pseudo_dbg_arg_i_64,
......@@ -329,7 +328,6 @@ pub fn lowerMir(lower: *Lower, index: Mir.Inst.Index) Error!struct {
329328 .pseudo_dbg_arg_m,
330329 .pseudo_dbg_arg_val,
331330 .pseudo_dbg_var_args_none,
332 .pseudo_dbg_var_none,
333331 .pseudo_dbg_var_i_s,
334332 .pseudo_dbg_var_i_u,
335333 .pseudo_dbg_var_i_64,
src/codegen/x86_64/Mir.zig-6
......@@ -1547,9 +1547,6 @@ pub const Inst = struct {
15471547 /// Uses `none` payload.
15481548 pseudo_dbg_end_none,
15491549 /// Local argument.
1550 /// Uses `none` payload.
1551 pseudo_dbg_arg_none,
1552 /// Local argument.
15531550 /// Uses `i` payload.
15541551 pseudo_dbg_arg_i_s,
15551552 /// Local argument.
......@@ -1573,9 +1570,6 @@ pub const Inst = struct {
15731570 /// Remaining arguments are varargs.
15741571 pseudo_dbg_var_args_none,
15751572 /// Local variable.
1576 /// Uses `none` payload.
1577 pseudo_dbg_var_none,
1578 /// Local variable.
15791573 /// Uses `i` payload.
15801574 pseudo_dbg_var_i_s,
15811575 /// Local variable.