diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-08-15 19:55:28 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-08-15 19:55:28 +0900 |
| commit | e2064554b6d653439fbbb2bcde00e6f1a1079cb4 (patch) | |
| tree | 56e44f19a516169b094087902e8b5d4c1188a6f8 /codegen.c | |
| parent | 70f3db84bb3e2f4d85da7392a112f6f82ce97152 (diff) | |
| download | ducc-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.c | 15 |
1 files changed, 13 insertions, 2 deletions
@@ -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"); |
