diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-02-07 10:12:57 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-02-07 10:12:57 +0900 |
| commit | 0034f84a38e8cb41a753d2def1daccd14bbfd552 (patch) | |
| tree | 6e734a8450c7f7fece5eda4c33ff72bc6ab277fb /src/codegen.c | |
| parent | 107c517b22e88d760c375a4b9da6dffd6da26d85 (diff) | |
| download | ducc-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.c | 31 |
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]); + } + } } } |
