aboutsummaryrefslogtreecommitdiffhomepage
path: root/codegen.c
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-08-15 19:55:28 +0900
committernsfisis <nsfisis@gmail.com>2025-08-15 19:55:28 +0900
commite2064554b6d653439fbbb2bcde00e6f1a1079cb4 (patch)
tree56e44f19a516169b094087902e8b5d4c1188a6f8 /codegen.c
parent70f3db84bb3e2f4d85da7392a112f6f82ce97152 (diff)
downloadducc-e2064554b6d653439fbbb2bcde00e6f1a1079cb4.tar.gz
ducc-e2064554b6d653439fbbb2bcde00e6f1a1079cb4.tar.zst
ducc-e2064554b6d653439fbbb2bcde00e6f1a1079cb4.zip
feat: support global variables with initializer
Diffstat (limited to 'codegen.c')
-rw-r--r--codegen.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/codegen.c b/codegen.c
index d6f320a..f71d74a 100644
--- a/codegen.c
+++ b/codegen.c
@@ -564,10 +564,21 @@ void codegen(Program* prog) {
printf(" .string \"%s\"\n\n", prog->str_literals[i]);
}
- printf(".bss\n\n");
+ printf(".data\n\n");
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));
+ if (var->node_expr) {
+ if (var->ty->kind == TypeKind_char)
+ printf(" %.*s: .byte %d\n", var->name.len, var->name.data, var->node_expr->node_int_value);
+ else if (var->ty->kind == TypeKind_short)
+ printf(" %.*s: .word %d\n", var->name.len, var->name.data, var->node_expr->node_int_value);
+ else if (var->ty->kind == TypeKind_int)
+ printf(" %.*s: .int %d\n", var->name.len, var->name.data, var->node_expr->node_int_value);
+ else
+ unimplemented();
+ } else {
+ printf(" %.*s: .zero %d\n", var->name.len, var->name.data, type_sizeof(var->ty));
+ }
}
printf(".globl main\n\n");