Skip to content

Commit

Permalink
fix: Fix sub-field access bug
Browse files Browse the repository at this point in the history
  • Loading branch information
keyvank committed Nov 25, 2024
1 parent d09fb3d commit f7b9979
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 91 deletions.
15 changes: 11 additions & 4 deletions parser/expr/access.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ apply_result *access_apply(parser_node *node, context *ctx)
if (field_type)
{
symbol *sym_addr = new_temp_symbol(ctx, new_pointer_type(field_type));
add_text(ctx, ";;;");

if (acc->is_ptr)
add_text(ctx, "mov rax, %s", obj->code);
else
Expand All @@ -61,9 +61,16 @@ apply_result *access_apply(parser_node *node, context *ctx)

symbol *sym_val = new_temp_symbol(ctx, field_type);
char *rega = reg_a(field_type, ctx);
add_text(ctx, "mov %s, [rax]", rega);
add_text(ctx, "mov %s, %s", sym_val->repl, rega);
add_text(ctx, ";;;");

// We don't need to store the value of a field which its type is
// non-primitive into a register! Its address is the only thing
// the user needs, for accessing its sub-fields!
if (rega)
{
add_text(ctx, "mov %s, [rax]", rega);
add_text(ctx, "mov %s, %s", sym_val->repl, rega);
}

apply_result *res = new_result(sym_val->repl, field_type);
res->addr_code = sym_addr->repl;
return res;
Expand Down
44 changes: 0 additions & 44 deletions tests/output/inp4.c_asm_output.asm
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,11 @@ sub rsp, __main_size
mov rax, rsp
add rax, 0
mov [rsp+40], rax
;;;
mov rax, [rsp+40]
add rax, 0
mov [rsp+48], rax
mov rax, [rax]
mov [rsp+56], rax
;;;
mov rax, [rsp+56]
mov rbx, 5
mov rax, [rsp+48]
Expand All @@ -29,13 +27,11 @@ mov [rsp+64], rax
mov rax, rsp
add rax, 0
mov [rsp+72], rax
;;;
mov rax, [rsp+72]
add rax, 8
mov [rsp+80], rax
mov rax, [rax]
mov [rsp+88], rax
;;;
mov rax, [rsp+88]
mov rbx, 10
mov rax, [rsp+80]
Expand All @@ -45,20 +41,14 @@ mov [rsp+96], rax
mov rax, rsp
add rax, 0
mov [rsp+104], rax
;;;
mov rax, [rsp+104]
add rax, 16
mov [rsp+112], rax
mov (null), [rax]
mov [rsp+120], (null)
;;;
;;;
mov rax, [rsp+112]
add rax, 0
mov [rsp+136], rax
mov rax, [rax]
mov [rsp+144], rax
;;;
mov rax, [rsp+144]
mov rbx, 19
mov rax, [rsp+136]
Expand All @@ -68,20 +58,14 @@ mov [rsp+152], rax
mov rax, rsp
add rax, 0
mov [rsp+160], rax
;;;
mov rax, [rsp+160]
add rax, 16
mov [rsp+168], rax
mov (null), [rax]
mov [rsp+176], (null)
;;;
;;;
mov rax, [rsp+168]
add rax, 8
mov [rsp+192], rax
mov rax, [rax]
mov [rsp+200], rax
;;;
mov rax, [rsp+200]
mov rbx, 123
mov rax, [rsp+192]
Expand All @@ -91,44 +75,34 @@ mov [rsp+208], rax
mov rax, rsp
add rax, 0
mov [rsp+216], rax
;;;
mov rax, [rsp+216]
add rax, 32
mov [rsp+224], rax
mov rax, [rax]
mov [rsp+232], rax
;;;
mov rax, rsp
add rax, 0
mov [rsp+240], rax
;;;
mov rax, [rsp+240]
add rax, 16
mov [rsp+248], rax
mov (null), [rax]
mov [rsp+256], (null)
;;;
;;;
mov rax, [rsp+248]
add rax, 8
mov [rsp+272], rax
mov rax, [rax]
mov [rsp+280], rax
;;;
mov rax, [rsp+280]
mov rbx, 2
mul rbx
mov [rsp+288], rax
mov rax, rsp
add rax, 0
mov [rsp+296], rax
;;;
mov rax, [rsp+296]
add rax, 0
mov [rsp+304], rax
mov rax, [rax]
mov [rsp+312], rax
;;;
mov rax, [rsp+288]
mov rbx, [rsp+312]
add rax, rbx
Expand All @@ -144,75 +118,57 @@ mov [rsp+336], rax
mov rax, rsp
add rax, 0
mov [rsp+344], rax
;;;
mov rax, [rsp+344]
add rax, 0
mov [rsp+352], rax
mov rax, [rax]
mov [rsp+360], rax
;;;
mov rax, [rsp+360]
mov [rsp+368], rax
mov rax, rsp
add rax, 0
mov [rsp+376], rax
;;;
mov rax, [rsp+376]
add rax, 8
mov [rsp+384], rax
mov rax, [rax]
mov [rsp+392], rax
;;;
mov rax, [rsp+392]
mov [rsp+400], rax
mov rax, rsp
add rax, 0
mov [rsp+408], rax
;;;
mov rax, [rsp+408]
add rax, 16
mov [rsp+416], rax
mov (null), [rax]
mov [rsp+424], (null)
;;;
;;;
mov rax, [rsp+416]
add rax, 0
mov [rsp+440], rax
mov rax, [rax]
mov [rsp+448], rax
;;;
mov rax, [rsp+448]
mov [rsp+456], rax
mov rax, rsp
add rax, 0
mov [rsp+464], rax
;;;
mov rax, [rsp+464]
add rax, 16
mov [rsp+472], rax
mov (null), [rax]
mov [rsp+480], (null)
;;;
;;;
mov rax, [rsp+472]
add rax, 8
mov [rsp+496], rax
mov rax, [rax]
mov [rsp+504], rax
;;;
mov rax, [rsp+504]
mov [rsp+512], rax
mov rax, rsp
add rax, 0
mov [rsp+520], rax
;;;
mov rax, [rsp+520]
add rax, 32
mov [rsp+528], rax
mov rax, [rax]
mov [rsp+536], rax
;;;
mov rax, [rsp+536]
mov [rsp+544], rax
mov rdi, [rsp+336]
Expand Down
16 changes: 0 additions & 16 deletions tests/output/inp6.c_asm_output.asm
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,11 @@ mov [rsp+0], rax
mov rax, rsp
add rax, 0
mov [rsp+32], rax
;;;
mov rax, [rsp+0]
add rax, 0
mov [rsp+40], rax
mov rax, [rax]
mov [rsp+48], rax
;;;
mov rax, [rsp+48]
mov rbx, 10
mov rax, [rsp+40]
Expand All @@ -41,13 +39,11 @@ mov [rsp+56], rax
mov rax, rsp
add rax, 0
mov [rsp+64], rax
;;;
mov rax, [rsp+0]
add rax, 8
mov [rsp+72], rax
mov rax, [rax]
mov [rsp+80], rax
;;;
mov rax, [rsp+80]
mov rbx, 20
mov rax, [rsp+72]
Expand All @@ -57,13 +53,11 @@ mov [rsp+88], rax
mov rax, rsp
add rax, 0
mov [rsp+96], rax
;;;
mov rax, [rsp+0]
add rax, 16
mov [rsp+104], rax
mov al, [rax]
mov [rsp+112], al
;;;
mov al, [rsp+112]
mov bl, 75
mov rax, [rsp+104]
Expand All @@ -73,13 +67,11 @@ mov [rsp+113], al
mov rax, rsp
add rax, 0
mov [rsp+114], rax
;;;
mov rax, [rsp+0]
add rax, 17
mov [rsp+122], rax
mov rax, [rax]
mov [rsp+130], rax
;;;
mov rax, [rsp+130]
mov rbx, __temp_str_0
mov rax, [rsp+122]
Expand All @@ -91,49 +83,41 @@ mov [rsp+146], rax
mov rax, rsp
add rax, 0
mov [rsp+154], rax
;;;
mov rax, [rsp+0]
add rax, 0
mov [rsp+162], rax
mov rax, [rax]
mov [rsp+170], rax
;;;
mov rax, [rsp+170]
mov [rsp+178], rax
mov rax, rsp
add rax, 0
mov [rsp+186], rax
;;;
mov rax, [rsp+0]
add rax, 8
mov [rsp+194], rax
mov rax, [rax]
mov [rsp+202], rax
;;;
mov rax, [rsp+202]
mov [rsp+210], rax
mov rax, rsp
add rax, 0
mov [rsp+218], rax
;;;
mov rax, [rsp+0]
add rax, 16
mov [rsp+226], rax
mov al, [rax]
mov [rsp+234], al
;;;
mov al, [rsp+234]
mov [rsp+235], al
mov rax, rsp
add rax, 0
mov [rsp+236], rax
;;;
mov rax, [rsp+0]
add rax, 17
mov [rsp+244], rax
mov rax, [rax]
mov [rsp+252], rax
;;;
mov rax, [rsp+252]
mov [rsp+260], rax
mov rdi, [rsp+146]
Expand Down
Loading

0 comments on commit f7b9979

Please sign in to comment.