aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/codegen.c
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-07 10:12:57 +0900
committernsfisis <nsfisis@gmail.com>2026-02-07 10:12:57 +0900
commit0034f84a38e8cb41a753d2def1daccd14bbfd552 (patch)
tree6e734a8450c7f7fece5eda4c33ff72bc6ab277fb /src/codegen.c
parent107c517b22e88d760c375a4b9da6dffd6da26d85 (diff)
downloadducc-0034f84a38e8cb41a753d2def1daccd14bbfd552.tar.gz
ducc-0034f84a38e8cb41a753d2def1daccd14bbfd552.tar.zst
ducc-0034f84a38e8cb41a753d2def1daccd14bbfd552.zip
feat: implement global variables referencing string literals
Diffstat (limited to 'src/codegen.c')
-rw-r--r--src/codegen.c31
1 files changed, 10 insertions, 21 deletions
diff --git a/src/codegen.c b/src/codegen.c
index b19dc25..4eb2042 100644
--- a/src/codegen.c
+++ b/src/codegen.c
@@ -819,7 +819,6 @@ static void codegen_func(CodeGen* g, AstNode* ast) {
g->current_func = NULL;
}
-
static void codegen_global_var(CodeGen* g, AstNode* var) {
fprintf(g->out, " %s:\n", var->as.gvar_decl->name);
if (!var->as.gvar_decl->expr) {
@@ -827,33 +826,23 @@ static void codegen_global_var(CodeGen* g, AstNode* var) {
return;
}
- if (var->ty->kind == TypeKind_ptr) {
- if (var->as.gvar_decl->expr->kind == AstNodeKind_ref_expr) {
- if (var->as.gvar_decl->expr->as.ref_expr->operand->kind != AstNodeKind_gvar) {
- unimplemented();
- }
- fprintf(g->out, " .quad %s\n", var->as.gvar_decl->expr->as.ref_expr->operand->as.gvar->name);
- } else if (var->as.gvar_decl->expr->kind == AstNodeKind_gvar) {
- fprintf(g->out, " .quad %s\n", var->as.gvar_decl->expr->as.gvar->name);
- } else {
- unimplemented();
- }
- return;
- }
if (var->ty->kind == TypeKind_array && var->as.gvar_decl->expr->kind == AstNodeKind_str_expr) {
const char* str = g->prog->str_literals[var->as.gvar_decl->expr->as.str_expr->idx - 1];
fprintf(g->out, " .string \"%s\"\n", str);
return;
}
- StrBuilder* data_buf = calloc(1, sizeof(StrBuilder));
- strbuilder_init(data_buf);
- strbuilder_reserve(data_buf, type_sizeof(var->ty));
-
- eval_init_expr(data_buf, var->as.gvar_decl->expr, var->ty);
+ InitData* data = eval_init_expr(var->as.gvar_decl->expr, var->ty);
- for (size_t i = 0; i < data_buf->len; ++i) {
- fprintf(g->out, " .byte %d\n", (int)data_buf->buf[i]);
+ for (size_t i = 0; i < data->len; ++i) {
+ InitDataBlock* block = &data->blocks[i];
+ if (block->kind == InitDataBlockKind_addr) {
+ fprintf(g->out, " .quad %s\n", block->as.addr.label);
+ } else {
+ for (size_t j = 0; j < block->as.bytes.len; ++j) {
+ fprintf(g->out, " .byte %d\n", block->as.bytes.buf[j]);
+ }
+ }
}
}