aboutsummaryrefslogtreecommitdiffhomepage
path: root/codegen.c
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-08-13 01:14:35 +0900
committernsfisis <nsfisis@gmail.com>2025-08-15 10:06:21 +0900
commit15c8a2f45b3916f840665b317afb344cbc08f5a4 (patch)
tree77cfd6866c5100f836adfee8603c122aefaf21b0 /codegen.c
parent9c12de31ab03385cea3b7bc78582ef4fdb9b22cc (diff)
downloadducc-15c8a2f45b3916f840665b317afb344cbc08f5a4.tar.gz
ducc-15c8a2f45b3916f840665b317afb344cbc08f5a4.tar.zst
ducc-15c8a2f45b3916f840665b317afb344cbc08f5a4.zip
feat: implement block-based variable scope
Diffstat (limited to 'codegen.c')
-rw-r--r--codegen.c14
1 files changed, 6 insertions, 8 deletions
diff --git a/codegen.c b/codegen.c
index f3790d2..59cee04 100644
--- a/codegen.c
+++ b/codegen.c
@@ -275,11 +275,10 @@ void codegen_assign_expr(CodeGen* g, AstNode* ast) {
void codegen_func_call(CodeGen* g, AstNode* ast) {
String* func_name = &ast->name;
- int i;
if (string_equals_cstr(func_name, "va_start")) {
printf(" # va_start BEGIN\n");
- for (i = 0; i < 6; ++i) {
+ 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);
}
@@ -300,11 +299,11 @@ void codegen_func_call(CodeGen* g, AstNode* ast) {
}
AstNode* args = ast->node_args;
- for (i = 0; i < args->node_len; ++i) {
+ for (int i = 0; i < args->node_len; ++i) {
AstNode* arg = args->node_items + i;
codegen_expr(g, arg, GenMode_rval);
}
- for (i = args->node_len - 1; i >= 0; --i) {
+ for (int i = args->node_len - 1; i >= 0; --i) {
printf(" pop %s\n", param_reg(i));
}
@@ -529,18 +528,17 @@ void codegen_func(CodeGen* g, AstNode* ast) {
void codegen(Program* prog) {
CodeGen* g = codegen_new();
- int i;
printf(".intel_syntax noprefix\n\n");
printf(".section .rodata\n\n");
- for (i = 0; prog->str_literals[i]; ++i) {
+ for (int i = 0; prog->str_literals[i]; ++i) {
printf(".Lstr__%d:\n", i + 1);
printf(" .string \"%s\"\n\n", prog->str_literals[i]);
}
printf(".bss\n\n");
- for (i = 0; i < prog->vars->node_len; ++i) {
+ for (int i = 0; i < prog->vars->node_len; ++i) {
AstNode* var = prog->vars->node_items + i;
printf(" .lcomm %.*s, %d\n", var->name.len, var->name.data, type_sizeof(var->ty));
}
@@ -548,7 +546,7 @@ void codegen(Program* prog) {
printf(".globl main\n\n");
printf(".text\n\n");
- for (i = 0; i < prog->funcs->node_len; ++i) {
+ for (int i = 0; i < prog->funcs->node_len; ++i) {
AstNode* func = prog->funcs->node_items + i;
codegen_func(g, func);
}