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 {...@@ -1224,9 +1224,7 @@ fn formatWipMir(data: FormatWipMirData, w: *Writer) Writer.Error!void {
1224 .pseudo_dbg_enter_block_none,1224 .pseudo_dbg_enter_block_none,
1225 .pseudo_dbg_leave_block_none,1225 .pseudo_dbg_leave_block_none,
1226 .pseudo_dbg_end_none,1226 .pseudo_dbg_end_none,
1227 .pseudo_dbg_arg_none,
1228 .pseudo_dbg_var_args_none,1227 .pseudo_dbg_var_args_none,
1229 .pseudo_dbg_var_none,
1230 .pseudo_dead_none,1228 .pseudo_dead_none,
1231 => {},1229 => {},
1232 .pseudo_dbg_line_stmt_line_column,1230 .pseudo_dbg_line_stmt_line_column,
...@@ -2318,39 +2316,32 @@ fn genMainBody(...@@ -2318,39 +2316,32 @@ fn genMainBody(
2318 };2316 };
2319 defer zir_param_index += 1;2317 defer zir_param_index += 1;
23202318
2321 if (comptime_args.len > 0) switch (comptime_args.get(ip)[zir_param_index]) {2319 const arg_ty: Type, const arg_val: ?Value = arg: switch (if (comptime_args.len > 0)
2322 .none => {},2320 comptime_args.get(ip)[zir_param_index]
2323 else => |comptime_arg| {2321 else
2324 try cg.mir_locals.append(cg.gpa, .{ .name = name, .type = ip.typeOf(comptime_arg) });2322 .none) {
2325 _ = try cg.addInst(.{2323 else => |arg_val| .{ .fromInterned(ip.typeOf(arg_val)), .fromInterned(arg_val) },
2326 .tag = .pseudo,2324 .none => {
2327 .ops = .pseudo_dbg_arg_val,2325 const arg_ty: Type = .fromInterned(fn_info.param_types.get(ip)[fn_param_index]);
2328 .data = .{ .ip_index = comptime_arg },2326 fn_param_index += 1;
2329 });2327 break :arg .{ arg_ty, try arg_ty.onePossibleValue(pt) };
2330 continue;
2331 },2328 },
2332 };2329 };
23332330 try cg.mir_locals.append(cg.gpa, .{ .name = name, .type = arg_ty.toIntern() });
2334 const arg_ty = fn_info.param_types.get(ip)[fn_param_index];2331 if (arg_val) |val| {
2335 try cg.mir_locals.append(cg.gpa, .{ .name = name, .type = arg_ty });2332 _ = try cg.addInst(.{
2336 fn_param_index += 1;2333 .tag = .pseudo,
23372334 .ops = .pseudo_dbg_arg_val,
2338 if (air_arg_index == air_args_body.len) {2335 .data = .{ .ip_index = val.toIntern() },
2339 try cg.asmPseudo(.pseudo_dbg_arg_none);2336 });
2340 continue;2337 continue;
2341 }2338 }
2339
2342 const air_arg_inst = air_args_body[air_arg_index];2340 const air_arg_inst = air_args_body[air_arg_index];
2343 const air_arg_data = cg.air.instructions.items(.data)[air_arg_index].arg;2341 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 }
2348 air_arg_index += 1;2342 air_arg_index += 1;
2349 try cg.genLocalDebugInfo(2343 assert(air_arg_data.zir_param_index == zir_param_index);
2350 .arg,2344 try cg.genLocalDebugInfo(.arg, arg_ty, cg.getResolvedInstValue(air_arg_inst).short);
2351 .fromInterned(arg_ty),
2352 cg.getResolvedInstValue(air_arg_inst).short,
2353 );
2354 }2345 }
2355 if (fn_info.is_var_args) try cg.asmPseudo(.pseudo_dbg_var_args_none);2346 if (fn_info.is_var_args) try cg.asmPseudo(.pseudo_dbg_var_args_none);
2356 }2347 }
src/codegen/x86_64/Emit.zig-7
...@@ -536,14 +536,12 @@ pub fn emitMir(emit: *Emit) Error!void {...@@ -536,14 +536,12 @@ pub fn emitMir(emit: *Emit) Error!void {
536 .column = emit.prev_di_loc.column,536 .column = emit.prev_di_loc.column,
537 .end = true,537 .end = true,
538 }),538 }),
539 .pseudo_dbg_arg_none,
540 .pseudo_dbg_arg_i_s,539 .pseudo_dbg_arg_i_s,
541 .pseudo_dbg_arg_i_u,540 .pseudo_dbg_arg_i_u,
542 .pseudo_dbg_arg_i_64,541 .pseudo_dbg_arg_i_64,
543 .pseudo_dbg_arg_ro,542 .pseudo_dbg_arg_ro,
544 .pseudo_dbg_arg_fa,543 .pseudo_dbg_arg_fa,
545 .pseudo_dbg_arg_m,544 .pseudo_dbg_arg_m,
546 .pseudo_dbg_var_none,
547 .pseudo_dbg_var_i_s,545 .pseudo_dbg_var_i_s,
548 .pseudo_dbg_var_i_u,546 .pseudo_dbg_var_i_u,
549 .pseudo_dbg_var_i_64,547 .pseudo_dbg_var_i_64,
...@@ -560,7 +558,6 @@ pub fn emitMir(emit: *Emit) Error!void {...@@ -560,7 +558,6 @@ pub fn emitMir(emit: *Emit) Error!void {
560 var loc_buf: [2]DwarfLoc = undefined;558 var loc_buf: [2]DwarfLoc = undefined;
561 const loc: DwarfLoc = loc: switch (mir_inst.ops) {559 const loc: DwarfLoc = loc: switch (mir_inst.ops) {
562 else => unreachable,560 else => unreachable,
563 .pseudo_dbg_arg_none, .pseudo_dbg_var_none => .empty,
564 .pseudo_dbg_arg_i_s,561 .pseudo_dbg_arg_i_s,
565 .pseudo_dbg_arg_i_u,562 .pseudo_dbg_arg_i_u,
566 .pseudo_dbg_var_i_s,563 .pseudo_dbg_var_i_s,
...@@ -632,23 +629,19 @@ pub fn emitMir(emit: *Emit) Error!void {...@@ -632,23 +629,19 @@ pub fn emitMir(emit: *Emit) Error!void {
632 try dwarf.genLocalVarDebugInfo(629 try dwarf.genLocalVarDebugInfo(
633 switch (mir_inst.ops) {630 switch (mir_inst.ops) {
634 else => unreachable,631 else => unreachable,
635 .pseudo_dbg_arg_none,
636 .pseudo_dbg_arg_i_s,632 .pseudo_dbg_arg_i_s,
637 .pseudo_dbg_arg_i_u,633 .pseudo_dbg_arg_i_u,
638 .pseudo_dbg_arg_i_64,634 .pseudo_dbg_arg_i_64,
639 .pseudo_dbg_arg_ro,635 .pseudo_dbg_arg_ro,
640 .pseudo_dbg_arg_fa,636 .pseudo_dbg_arg_fa,
641 .pseudo_dbg_arg_m,637 .pseudo_dbg_arg_m,
642 .pseudo_dbg_arg_val,
643 => .arg,638 => .arg,
644 .pseudo_dbg_var_none,
645 .pseudo_dbg_var_i_s,639 .pseudo_dbg_var_i_s,
646 .pseudo_dbg_var_i_u,640 .pseudo_dbg_var_i_u,
647 .pseudo_dbg_var_i_64,641 .pseudo_dbg_var_i_64,
648 .pseudo_dbg_var_ro,642 .pseudo_dbg_var_ro,
649 .pseudo_dbg_var_fa,643 .pseudo_dbg_var_fa,
650 .pseudo_dbg_var_m,644 .pseudo_dbg_var_m,
651 .pseudo_dbg_var_val,
652 => .local_var,645 => .local_var,
653 },646 },
654 local.name.toSlice(&emit.lower.mir),647 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 {...@@ -320,7 +320,6 @@ pub fn lowerMir(lower: *Lower, index: Mir.Inst.Index) Error!struct {
320 .pseudo_dbg_enter_inline_func,320 .pseudo_dbg_enter_inline_func,
321 .pseudo_dbg_leave_inline_func,321 .pseudo_dbg_leave_inline_func,
322 .pseudo_dbg_end_none,322 .pseudo_dbg_end_none,
323 .pseudo_dbg_arg_none,
324 .pseudo_dbg_arg_i_s,323 .pseudo_dbg_arg_i_s,
325 .pseudo_dbg_arg_i_u,324 .pseudo_dbg_arg_i_u,
326 .pseudo_dbg_arg_i_64,325 .pseudo_dbg_arg_i_64,
...@@ -329,7 +328,6 @@ pub fn lowerMir(lower: *Lower, index: Mir.Inst.Index) Error!struct {...@@ -329,7 +328,6 @@ pub fn lowerMir(lower: *Lower, index: Mir.Inst.Index) Error!struct {
329 .pseudo_dbg_arg_m,328 .pseudo_dbg_arg_m,
330 .pseudo_dbg_arg_val,329 .pseudo_dbg_arg_val,
331 .pseudo_dbg_var_args_none,330 .pseudo_dbg_var_args_none,
332 .pseudo_dbg_var_none,
333 .pseudo_dbg_var_i_s,331 .pseudo_dbg_var_i_s,
334 .pseudo_dbg_var_i_u,332 .pseudo_dbg_var_i_u,
335 .pseudo_dbg_var_i_64,333 .pseudo_dbg_var_i_64,
src/codegen/x86_64/Mir.zig-6
...@@ -1547,9 +1547,6 @@ pub const Inst = struct {...@@ -1547,9 +1547,6 @@ pub const Inst = struct {
1547 /// Uses `none` payload.1547 /// Uses `none` payload.
1548 pseudo_dbg_end_none,1548 pseudo_dbg_end_none,
1549 /// Local argument.1549 /// Local argument.
1550 /// Uses `none` payload.
1551 pseudo_dbg_arg_none,
1552 /// Local argument.
1553 /// Uses `i` payload.1550 /// Uses `i` payload.
1554 pseudo_dbg_arg_i_s,1551 pseudo_dbg_arg_i_s,
1555 /// Local argument.1552 /// Local argument.
...@@ -1573,9 +1570,6 @@ pub const Inst = struct {...@@ -1573,9 +1570,6 @@ pub const Inst = struct {
1573 /// Remaining arguments are varargs.1570 /// Remaining arguments are varargs.
1574 pseudo_dbg_var_args_none,1571 pseudo_dbg_var_args_none,
1575 /// Local variable.1572 /// Local variable.
1576 /// Uses `none` payload.
1577 pseudo_dbg_var_none,
1578 /// Local variable.
1579 /// Uses `i` payload.1573 /// Uses `i` payload.
1580 pseudo_dbg_var_i_s,1574 pseudo_dbg_var_i_s,
1581 /// Local variable.1575 /// Local variable.