aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/codegen.c
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-08-25 00:41:34 +0900
committernsfisis <nsfisis@gmail.com>2025-08-25 00:41:34 +0900
commit37d184d14136c9a9b5bdf3b62df87deea12dc947 (patch)
treee2899375984950f6cf6cf7a1fc6ca1b43a77b9f5 /src/codegen.c
parent7f29d50e4558a700b7611dc72e87e7922ac6a345 (diff)
downloadducc-37d184d14136c9a9b5bdf3b62df87deea12dc947.tar.gz
ducc-37d184d14136c9a9b5bdf3b62df87deea12dc947.tar.zst
ducc-37d184d14136c9a9b5bdf3b62df87deea12dc947.zip
feat: add static to file-local functions
Diffstat (limited to 'src/codegen.c')
-rw-r--r--src/codegen.c72
1 files changed, 36 insertions, 36 deletions
diff --git a/src/codegen.c b/src/codegen.c
index 82c9c96..19d7079 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -16,7 +16,7 @@ struct CodeGen {
};
typedef struct CodeGen CodeGen;
-CodeGen* codegen_new(FILE* out) {
+static CodeGen* codegen_new(FILE* out) {
CodeGen* g = calloc(1, sizeof(CodeGen));
g->out = out;
g->next_label = 1;
@@ -24,16 +24,16 @@ CodeGen* codegen_new(FILE* out) {
return g;
}
-int codegen_new_label(CodeGen* g) {
+static int codegen_new_label(CodeGen* g) {
int new_label = g->next_label;
++g->next_label;
return new_label;
}
-void codegen_expr(CodeGen* g, AstNode* ast, GenMode gen_mode);
-void codegen_stmt(CodeGen* g, AstNode* ast);
+static void codegen_expr(CodeGen* g, AstNode* ast, GenMode gen_mode);
+static void codegen_stmt(CodeGen* g, AstNode* ast);
-const char* param_reg(int n) {
+static const char* param_reg(int n) {
if (n == 0) {
return "rdi";
} else if (n == 1) {
@@ -51,7 +51,7 @@ const char* param_reg(int n) {
}
}
-void codegen_func_prologue(CodeGen* g, AstNode* ast) {
+static void codegen_func_prologue(CodeGen* g, AstNode* ast) {
fprintf(g->out, " push rbp\n");
fprintf(g->out, " mov rbp, rsp\n");
for (int i = 0; i < ast->node_params->node_len; ++i) {
@@ -60,22 +60,22 @@ void codegen_func_prologue(CodeGen* g, AstNode* ast) {
fprintf(g->out, " sub rsp, %d\n", ast->node_stack_size);
}
-void codegen_func_epilogue(CodeGen* g, AstNode* ast) {
+static void codegen_func_epilogue(CodeGen* g, AstNode* ast) {
fprintf(g->out, " mov rsp, rbp\n");
fprintf(g->out, " pop rbp\n");
fprintf(g->out, " ret\n");
}
-void codegen_int_expr(CodeGen* g, AstNode* ast) {
+static void codegen_int_expr(CodeGen* g, AstNode* ast) {
fprintf(g->out, " push %d\n", ast->node_int_value);
}
-void codegen_str_expr(CodeGen* g, AstNode* ast) {
+static void codegen_str_expr(CodeGen* g, AstNode* ast) {
fprintf(g->out, " mov rax, OFFSET FLAG:.Lstr__%d\n", ast->node_idx);
fprintf(g->out, " push rax\n");
}
-void codegen_unary_expr(CodeGen* g, AstNode* ast) {
+static void codegen_unary_expr(CodeGen* g, AstNode* ast) {
codegen_expr(g, ast->node_operand, GenMode_rval);
if (ast->node_op == TokenKind_not) {
fprintf(g->out, " pop rax\n");
@@ -89,12 +89,12 @@ void codegen_unary_expr(CodeGen* g, AstNode* ast) {
}
}
-void codegen_ref_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) {
+static void codegen_ref_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) {
codegen_expr(g, ast->node_operand, GenMode_lval);
}
// "reg" stores the address of the expression to be pushed.
-void codegen_push_expr(CodeGen* g, const char* reg, int size) {
+static void codegen_push_expr(CodeGen* g, const char* reg, int size) {
if (size == 1) {
fprintf(g->out, " movsx %s, BYTE PTR [%s]\n", reg, reg);
fprintf(g->out, " push %s\n", reg);
@@ -119,7 +119,7 @@ void codegen_push_expr(CodeGen* g, const char* reg, int size) {
}
}
-void codegen_lval2rval(CodeGen* g, Type* ty) {
+static void codegen_lval2rval(CodeGen* g, Type* ty) {
if (ty->kind == TypeKind_array) {
return;
}
@@ -128,14 +128,14 @@ void codegen_lval2rval(CodeGen* g, Type* ty) {
codegen_push_expr(g, "rax", type_sizeof(ty));
}
-void codegen_deref_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) {
+static void codegen_deref_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) {
codegen_expr(g, ast->node_operand, GenMode_rval);
if (gen_mode == GenMode_rval) {
codegen_lval2rval(g, ast->node_operand->ty->base);
}
}
-void codegen_logical_expr(CodeGen* g, AstNode* ast) {
+static void codegen_logical_expr(CodeGen* g, AstNode* ast) {
int label = codegen_new_label(g);
if (ast->node_op == TokenKind_andand) {
@@ -161,7 +161,7 @@ void codegen_logical_expr(CodeGen* g, AstNode* ast) {
}
}
-void codegen_binary_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) {
+static void codegen_binary_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) {
codegen_expr(g, ast->node_lhs, gen_mode);
codegen_expr(g, ast->node_rhs, gen_mode);
fprintf(g->out, " pop rdi\n");
@@ -210,7 +210,7 @@ void codegen_binary_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) {
fprintf(g->out, " push rax\n");
}
-void codegen_cond_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) {
+static void codegen_cond_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) {
int label = codegen_new_label(g);
codegen_expr(g, ast->node_cond, GenMode_rval);
@@ -224,7 +224,7 @@ void codegen_cond_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) {
fprintf(g->out, ".Lend%d:\n", label);
}
-void codegen_assign_expr_helper(CodeGen* g, AstNode* ast) {
+static void codegen_assign_expr_helper(CodeGen* g, AstNode* ast) {
if (ast->node_op == TokenKind_assign) {
return;
}
@@ -254,7 +254,7 @@ void codegen_assign_expr_helper(CodeGen* g, AstNode* ast) {
fprintf(g->out, " push rax\n");
}
-void codegen_assign_expr(CodeGen* g, AstNode* ast) {
+static void codegen_assign_expr(CodeGen* g, AstNode* ast) {
int sizeof_lhs = type_sizeof(ast->node_lhs->ty);
int sizeof_rhs = type_sizeof(ast->node_rhs->ty);
@@ -301,7 +301,7 @@ void codegen_assign_expr(CodeGen* g, AstNode* ast) {
}
}
-void codegen_func_call(CodeGen* g, AstNode* ast) {
+static void codegen_func_call(CodeGen* g, AstNode* ast) {
const char* func_name = ast->name;
if (strcmp(func_name, "__ducc_va_start") == 0) {
@@ -359,7 +359,7 @@ void codegen_func_call(CodeGen* g, AstNode* ast) {
fprintf(g->out, ".Lend%d:\n", label);
}
-void codegen_lvar(CodeGen* g, AstNode* ast, GenMode gen_mode) {
+static void codegen_lvar(CodeGen* g, AstNode* ast, GenMode gen_mode) {
fprintf(g->out, " mov rax, rbp\n");
fprintf(g->out, " sub rax, %d\n", ast->node_stack_offset);
fprintf(g->out, " push rax\n");
@@ -368,7 +368,7 @@ void codegen_lvar(CodeGen* g, AstNode* ast, GenMode gen_mode) {
}
}
-void codegen_gvar(CodeGen* g, AstNode* ast, GenMode gen_mode) {
+static void codegen_gvar(CodeGen* g, AstNode* ast, GenMode gen_mode) {
fprintf(g->out, " lea rax, %s[rip]\n", ast->name);
fprintf(g->out, " push rax\n");
if (gen_mode == GenMode_rval) {
@@ -376,7 +376,7 @@ void codegen_gvar(CodeGen* g, AstNode* ast, GenMode gen_mode) {
}
}
-void codegen_composite_expr(CodeGen* g, AstNode* ast) {
+static void codegen_composite_expr(CodeGen* g, AstNode* ast) {
// Standard C does not have composite expression, but ducc internally has.
for (int i = 0; i < ast->node_len; ++i) {
AstNode* expr = ast->node_items + i;
@@ -388,7 +388,7 @@ void codegen_composite_expr(CodeGen* g, AstNode* ast) {
}
}
-void codegen_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) {
+static void codegen_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) {
if (ast->kind == AstNodeKind_int_expr) {
codegen_int_expr(g, ast);
} else if (ast->kind == AstNodeKind_str_expr) {
@@ -420,7 +420,7 @@ void codegen_expr(CodeGen* g, AstNode* ast, GenMode gen_mode) {
}
}
-void codegen_return_stmt(CodeGen* g, AstNode* ast) {
+static void codegen_return_stmt(CodeGen* g, AstNode* ast) {
if (ast->node_expr) {
codegen_expr(g, ast->node_expr, GenMode_rval);
fprintf(g->out, " pop rax\n");
@@ -428,7 +428,7 @@ void codegen_return_stmt(CodeGen* g, AstNode* ast) {
codegen_func_epilogue(g, ast);
}
-void codegen_if_stmt(CodeGen* g, AstNode* ast) {
+static void codegen_if_stmt(CodeGen* g, AstNode* ast) {
int label = codegen_new_label(g);
codegen_expr(g, ast->node_cond, GenMode_rval);
@@ -444,7 +444,7 @@ void codegen_if_stmt(CodeGen* g, AstNode* ast) {
fprintf(g->out, ".Lend%d:\n", label);
}
-void codegen_for_stmt(CodeGen* g, AstNode* ast) {
+static void codegen_for_stmt(CodeGen* g, AstNode* ast) {
int label = codegen_new_label(g);
++g->loop_labels;
*g->loop_labels = label;
@@ -470,7 +470,7 @@ void codegen_for_stmt(CodeGen* g, AstNode* ast) {
--g->loop_labels;
}
-void codegen_do_while_stmt(CodeGen* g, AstNode* ast) {
+static void codegen_do_while_stmt(CodeGen* g, AstNode* ast) {
int label = codegen_new_label(g);
++g->loop_labels;
*g->loop_labels = label;
@@ -488,36 +488,36 @@ void codegen_do_while_stmt(CodeGen* g, AstNode* ast) {
--g->loop_labels;
}
-void codegen_break_stmt(CodeGen* g, AstNode* ast) {
+static void codegen_break_stmt(CodeGen* g, AstNode* ast) {
int label = *g->loop_labels;
fprintf(g->out, " jmp .Lend%d\n", label);
}
-void codegen_continue_stmt(CodeGen* g, AstNode* ast) {
+static void codegen_continue_stmt(CodeGen* g, AstNode* ast) {
int label = *g->loop_labels;
fprintf(g->out, " jmp .Lcontinue%d\n", label);
}
-void codegen_expr_stmt(CodeGen* g, AstNode* ast) {
+static void codegen_expr_stmt(CodeGen* g, AstNode* ast) {
codegen_expr(g, ast->node_expr, GenMode_rval);
// TODO: the expression on the stack can be more than 8 bytes.
fprintf(g->out, " pop rax\n");
}
-void codegen_var_decl(CodeGen* g, AstNode* ast) {
+static void codegen_var_decl(CodeGen* g, AstNode* ast) {
}
-void codegen_nop(CodeGen* g, AstNode* ast) {
+static void codegen_nop(CodeGen* g, AstNode* ast) {
}
-void codegen_block_stmt(CodeGen* g, AstNode* ast) {
+static void codegen_block_stmt(CodeGen* g, AstNode* ast) {
for (int i = 0; i < ast->node_len; ++i) {
AstNode* stmt = ast->node_items + i;
codegen_stmt(g, stmt);
}
}
-void codegen_stmt(CodeGen* g, AstNode* ast) {
+static void codegen_stmt(CodeGen* g, AstNode* ast) {
if (ast->kind == AstNodeKind_list) {
codegen_block_stmt(g, ast);
} else if (ast->kind == AstNodeKind_return_stmt) {
@@ -543,7 +543,7 @@ void codegen_stmt(CodeGen* g, AstNode* ast) {
}
}
-void codegen_func(CodeGen* g, AstNode* ast) {
+static void codegen_func(CodeGen* g, AstNode* ast) {
g->current_func = ast;
if (!ast->node_function_is_static) {