diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-08-18 04:11:42 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-08-18 04:11:46 +0900 |
| commit | 1748294579492712d2b928a34329370fa3378a07 (patch) | |
| tree | 0cf6a56d26345ee266eb3ce598a069a7e33c86d7 /codegen.c | |
| parent | 991245b69c53b1e2f708af34b6f829182ebf5cf2 (diff) | |
| download | ducc-1748294579492712d2b928a34329370fa3378a07.tar.gz ducc-1748294579492712d2b928a34329370fa3378a07.tar.zst ducc-1748294579492712d2b928a34329370fa3378a07.zip | |
feat: calculate stack size instead of hard-coding
Diffstat (limited to 'codegen.c')
| -rw-r--r-- | codegen.c | 12 |
1 files changed, 8 insertions, 4 deletions
@@ -7,6 +7,7 @@ typedef enum GenMode GenMode; struct CodeGen { int next_label; int* loop_labels; + AstNode* current_func; }; typedef struct CodeGen CodeGen; @@ -50,7 +51,7 @@ void codegen_func_prologue(CodeGen* g, AstNode* ast) { for (int i = 0; i < ast->node_params->node_len; ++i) { printf(" push %s\n", param_reg(i)); } - printf(" sub rsp, %d\n", 8 * LVAR_MAX); + printf(" sub rsp, %d\n", ast->node_stack_size); } void codegen_func_epilogue(CodeGen* g, AstNode* ast) { @@ -298,22 +299,23 @@ void codegen_func_call(CodeGen* g, AstNode* ast) { const char* func_name = ast->name; if (strcmp(func_name, "__ducc_va_start") == 0) { + int stack_size = g->current_func->node_stack_size; printf(" # __ducc_va_start BEGIN\n"); for (int i = 0; i < 6; ++i) { printf(" mov rax, %s\n", param_reg(i)); - printf(" mov [rbp-%d], rax\n", 8 + (LVAR_MAX - 4 - i) * 8); + printf(" mov [rbp-%d], rax\n", 8 + (stack_size - 4 - i) * 8); } AstNode* va_list_args = ast->node_args->node_items; codegen_expr(g, va_list_args, GenMode_lval); printf(" pop rdi\n"); printf(" mov rax, rbp\n"); - printf(" sub rax, %d\n", 8 + (LVAR_MAX - 1) * 8); + printf(" sub rax, %d\n", 8 + (stack_size - 1) * 8); printf(" mov [rdi], rax\n"); printf(" mov DWORD PTR [rax], 8\n"); printf(" mov DWORD PTR [rax+4], 0\n"); printf(" mov QWORD PTR [rax+8], 0\n"); printf(" mov rdi, rbp\n"); - printf(" sub rdi, %d\n", 8 + (LVAR_MAX - 4) * 8); + printf(" sub rdi, %d\n", 8 + (stack_size - 4) * 8); printf(" mov QWORD PTR [rax+16], rdi\n"); printf(" # __ducc_va_start END\n"); return; @@ -536,6 +538,7 @@ void codegen_stmt(CodeGen* g, AstNode* ast) { } void codegen_func(CodeGen* g, AstNode* ast) { + g->current_func = ast; printf("%s:\n", ast->name); codegen_func_prologue(g, ast); @@ -547,6 +550,7 @@ void codegen_func(CodeGen* g, AstNode* ast) { codegen_func_epilogue(g, ast); printf("\n"); + g->current_func = NULL; } void codegen(Program* prog) { |
