fix stack var logic error

This commit is contained in:
janis 2025-11-03 17:04:11 +01:00
parent 07eeed7cff
commit 3526f9d59d
Signed by: janis
SSH key fingerprint: SHA256:bB1qbbqmDXZNT0KKD5c2Dfjg53JGhj7B3CFcLIzSqq8
3 changed files with 22 additions and 7 deletions

View file

@ -224,7 +224,7 @@ codegen_arg_to_operand:
jmp .epilogue jmp .epilogue
.stack_arg: .stack_arg:
; TODO: use these offsets in stack-vars instead of copying into new stack slots ; TODO: use these offsets in stack_vars instead of copying into new stack slots
sub rdi, 6 sub rdi, 6
mov rax, 8 mov rax, 8
mul rdi mul rdi
@ -256,7 +256,7 @@ stackvar_cmp:
mov rax, [rsi + 0] ; a.index mov rax, [rsi + 0] ; a.index
mov rcx, [rdx + 0] ; b.index mov rcx, [rdx + 0] ; b.index
cmp rax, 0 cmp rax, rcx
jl .less jl .less
jg .greater jg .greater
xor rax, rax xor rax, rax
@ -493,7 +493,7 @@ codegen_function:
; scratch2 [80..104] ; scratch2 [80..104]
; dirtied-register-bitset [76..80] [a,b,c,d,si,di,bp,sp,8,9,10,11,12,13,14,15] ; dirtied-register-bitset [76..80] [a,b,c,d,si,di,bp,sp,8,9,10,11,12,13,14,15]
; register-bitset [72..76] [a,b,c,d,si,di,bp,sp,8,9,10,11,12,13,14,15] ; register-bitset [72..76] [a,b,c,d,si,di,bp,sp,8,9,10,11,12,13,14,15]
; stack-vars: Vec<(index, offset)> [32..72] ; stack_vars: Vec<(index, offset)> [32..72]
; max_stack_size: [28..32] ; max_stack_size: [28..32]
; current_stack_size: [24..28] ; current_stack_size: [24..28]
; func_idx [16..24] ; func_idx [16..24]
@ -506,7 +506,7 @@ codegen_function:
mov [rsp + 16], rsi ; func_idx mov [rsp + 16], rsi ; func_idx
mov qword [rsp + 24], 0 ; current_stack_size = 0, max_stack_size = 0 mov qword [rsp + 24], 0 ; current_stack_size = 0, max_stack_size = 0
lea rdi, [rsp + 32] ; stack-vars lea rdi, [rsp + 32] ; stack_vars
mov rsi, 16 ; size_of::<(u64, u64)> mov rsi, 16 ; size_of::<(u64, u64)>
mov rdx, 0 ; drop = None mov rdx, 0 ; drop = None
mov rcx, 16 ; initial capacity mov rcx, 16 ; initial capacity
@ -609,7 +609,7 @@ codegen_function:
neg rdx neg rdx
mov [rsp + 112], rdx ; &(_, offset) mov [rsp + 112], rdx ; &(_, offset)
lea rdi, [rsp + 32] ; stack-vars lea rdi, [rsp + 32] ; stack_vars
lea rsi, [rsp + 104] ; &scratch: &(index, offset) lea rsi, [rsp + 104] ; &scratch: &(index, offset)
mov rdx, stackvar_cmp mov rdx, stackvar_cmp
mov rcx, 0 mov rcx, 0
@ -1330,7 +1330,7 @@ codegen_expr:
mov [rsp + 24], rdx ; &(_, offset) mov [rsp + 24], rdx ; &(_, offset)
mov rdi, [rsp + 8] ; &function_ctx mov rdi, [rsp + 8] ; &function_ctx
lea rdi, [rsp + 8] ; stack_vars lea rdi, [rdi + 8] ; stack_vars
lea rsi, [rsp + 16] ; &(index, offset) lea rsi, [rsp + 16] ; &(index, offset)
mov rdx, stackvar_cmp mov rdx, stackvar_cmp
mov rcx, 0 mov rcx, 0

View file

@ -93,7 +93,8 @@ fn main() {
print_ast( print_ast(
b"fn main(a: u32) -> void { b"fn main(a: u32) -> void {
return 5 + &a; let b: *u32 = &a;
return 5 + *b;
}", }",
|ast| unsafe { parse_func(ast) }, |ast| unsafe { parse_func(ast) },
); );

View file

@ -118,4 +118,18 @@ fn main() {
let elements = Box::new([6, 7, 8]); let elements = Box::new([6, 7, 8]);
vec.insert_many(2, elements); vec.insert_many(2, elements);
assert_eq!(vec.as_slice(), &[50, 1, 6, 7, 8, 2, 3, 4, 5]); assert_eq!(vec.as_slice(), &[50, 1, 6, 7, 8, 2, 3, 4, 5]);
let mut vec = Vec::<u32>::new_with(100);
assert_eq!(vec.len(), 0);
vec.insert_sorted(5, cmp);
assert_eq!(vec.len(), 1);
assert_eq!(vec.as_slice(), &[5]);
vec.insert_sorted(2, cmp);
assert_eq!(vec.len(), 2);
assert_eq!(vec.as_slice(), &[2, 5]);
vec.insert_sorted(7, cmp);
assert_eq!(vec.len(), 3);
assert_eq!(vec.as_slice(), &[2, 5, 7]);
} }