@@ -332,7 +332,7 @@ pub fn generate(
332
332
};
333
333
334
334
for (function .dbg_arg_relocs .items ) | reloc | {
335
- try function .genArgDbgInfo (reloc .inst , reloc .index , call_info . stack_byte_count );
335
+ try function .genArgDbgInfo (reloc .inst , reloc .index );
336
336
}
337
337
338
338
var mir = Mir {
@@ -351,7 +351,8 @@ pub fn generate(
351
351
.prev_di_pc = 0 ,
352
352
.prev_di_line = module_fn .lbrace_line ,
353
353
.prev_di_column = module_fn .lbrace_column ,
354
- .prologue_stack_space = call_info .stack_byte_count + function .saved_regs_stack_space ,
354
+ .stack_size = function .max_end_stack ,
355
+ .saved_regs_stack_space = function .saved_regs_stack_space ,
355
356
};
356
357
defer emit .deinit ();
357
358
@@ -464,6 +465,7 @@ fn gen(self: *Self) !void {
464
465
const total_stack_size = self .max_end_stack + self .saved_regs_stack_space ;
465
466
const aligned_total_stack_end = mem .alignForwardGeneric (u32 , total_stack_size , self .stack_align );
466
467
const stack_size = aligned_total_stack_end - self .saved_regs_stack_space ;
468
+ self .max_end_stack = stack_size ;
467
469
if (Instruction .Operand .fromU32 (stack_size )) | op | {
468
470
self .mir_instructions .set (sub_reloc , .{
469
471
.tag = .sub ,
@@ -1812,7 +1814,7 @@ fn errUnionErr(self: *Self, error_union_mcv: MCValue, error_union_ty: Type) !MCV
1812
1814
switch (error_union_mcv ) {
1813
1815
.register = > return self .fail ("TODO errUnionErr for registers" , .{}),
1814
1816
.stack_argument_offset = > | off | {
1815
- return MCValue { .stack_argument_offset = off - err_offset };
1817
+ return MCValue { .stack_argument_offset = off + err_offset };
1816
1818
},
1817
1819
.stack_offset = > | off | {
1818
1820
return MCValue { .stack_offset = off - err_offset };
@@ -1849,7 +1851,7 @@ fn errUnionPayload(self: *Self, error_union_mcv: MCValue, error_union_ty: Type)
1849
1851
switch (error_union_mcv ) {
1850
1852
.register = > return self .fail ("TODO errUnionPayload for registers" , .{}),
1851
1853
.stack_argument_offset = > | off | {
1852
- return MCValue { .stack_argument_offset = off - payload_offset };
1854
+ return MCValue { .stack_argument_offset = off + payload_offset };
1853
1855
},
1854
1856
.stack_offset = > | off | {
1855
1857
return MCValue { .stack_offset = off - payload_offset };
@@ -1983,7 +1985,7 @@ fn airSliceLen(self: *Self, inst: Air.Inst.Index) !void {
1983
1985
.dead , .unreach = > unreachable ,
1984
1986
.register = > unreachable , // a slice doesn't fit in one register
1985
1987
.stack_argument_offset = > | off | {
1986
- break :result MCValue { .stack_argument_offset = off - 4 };
1988
+ break :result MCValue { .stack_argument_offset = off + 4 };
1987
1989
},
1988
1990
.stack_offset = > | off | {
1989
1991
break :result MCValue { .stack_offset = off - 4 };
@@ -2507,7 +2509,7 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {
2507
2509
switch (mcv ) {
2508
2510
.dead , .unreach = > unreachable ,
2509
2511
.stack_argument_offset = > | off | {
2510
- break :result MCValue { .stack_argument_offset = off - struct_field_offset };
2512
+ break :result MCValue { .stack_argument_offset = off + struct_field_offset };
2511
2513
},
2512
2514
.stack_offset = > | off | {
2513
2515
break :result MCValue { .stack_offset = off - struct_field_offset };
@@ -3369,9 +3371,7 @@ fn addDbgInfoTypeReloc(self: *Self, ty: Type) error{OutOfMemory}!void {
3369
3371
}
3370
3372
}
3371
3373
3372
- fn genArgDbgInfo (self : * Self , inst : Air.Inst.Index , arg_index : u32 , stack_byte_count : u32 ) error {OutOfMemory }! void {
3373
- const prologue_stack_space = stack_byte_count + self .saved_regs_stack_space ;
3374
-
3374
+ fn genArgDbgInfo (self : * Self , inst : Air.Inst.Index , arg_index : u32 ) error {OutOfMemory }! void {
3375
3375
const mcv = self .args [arg_index ];
3376
3376
const ty = self .air .instructions .items (.data )[inst ].ty ;
3377
3377
const name = self .mod_fn .getParamName (self .bin_file .options .module .? , arg_index );
@@ -3404,7 +3404,7 @@ fn genArgDbgInfo(self: *Self, inst: Air.Inst.Index, arg_index: u32, stack_byte_c
3404
3404
// const abi_size = @intCast(u32, ty.abiSize(self.target.*));
3405
3405
const adjusted_stack_offset = switch (mcv ) {
3406
3406
.stack_offset = > | offset | - @intCast (i32 , offset ),
3407
- .stack_argument_offset = > | offset | @intCast (i32 , prologue_stack_space - offset ),
3407
+ .stack_argument_offset = > | offset | @intCast (i32 , self . saved_regs_stack_space + offset ),
3408
3408
else = > unreachable ,
3409
3409
};
3410
3410
@@ -3559,7 +3559,7 @@ fn airCall(self: *Self, inst: Air.Inst.Index, modifier: std.builtin.CallOptions.
3559
3559
.stack_offset = > unreachable ,
3560
3560
.stack_argument_offset = > | offset | try self .genSetStackArgument (
3561
3561
arg_ty ,
3562
- info . stack_byte_count - offset ,
3562
+ offset ,
3563
3563
arg_mcv ,
3564
3564
),
3565
3565
else = > unreachable ,
@@ -5653,8 +5653,8 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues {
5653
5653
if (ty .abiAlignment (self .target .* ) == 8 )
5654
5654
nsaa = std .mem .alignForwardGeneric (u32 , nsaa , 8 );
5655
5655
5656
- nsaa += param_size ;
5657
5656
result .args [i ] = .{ .stack_argument_offset = nsaa };
5657
+ nsaa += param_size ;
5658
5658
}
5659
5659
}
5660
5660
@@ -5687,9 +5687,11 @@ fn resolveCallingConventionValues(self: *Self, fn_ty: Type) !CallMCValues {
5687
5687
for (param_types ) | ty , i | {
5688
5688
if (ty .abiSize (self .target .* ) > 0 ) {
5689
5689
const param_size = @intCast (u32 , ty .abiSize (self .target .* ));
5690
+ const param_alignment = ty .abiAlignment (self .target .* );
5690
5691
5691
- stack_offset = std .mem .alignForwardGeneric (u32 , stack_offset , ty . abiAlignment ( self . target .* )) + param_size ;
5692
+ stack_offset = std .mem .alignForwardGeneric (u32 , stack_offset , param_alignment ) ;
5692
5693
result .args [i ] = .{ .stack_argument_offset = stack_offset };
5694
+ stack_offset += param_size ;
5693
5695
} else {
5694
5696
result .args [i ] = .{ .none = {} };
5695
5697
}
0 commit comments