aboutsummaryrefslogtreecommitdiffhomepage
path: root/codegen.c
diff options
context:
space:
mode:
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");