diff options
| author | Mustafa Quraish <[email protected]> | 2022-02-05 00:57:20 -0500 |
|---|---|---|
| committer | Mustafa Quraish <[email protected]> | 2022-02-05 08:56:15 -0500 |
| commit | 24dd666121e2786efb82854b05aa71d759e04ee6 (patch) | |
| tree | 4420eda5e1cde0bfe7dfe8f4b160212d59ceeca3 /src/generator.c | |
| parent | Add `void` type and allow void* to be assigned to other ptr types (diff) | |
| download | cup-24dd666121e2786efb82854b05aa71d759e04ee6.tar.xz cup-24dd666121e2786efb82854b05aa71d759e04ee6.zip | |
Add ability to initialize global variables
The code to initialize them is put right before calling `main()`
Diffstat (limited to 'src/generator.c')
| -rw-r--r-- | src/generator.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/generator.c b/src/generator.c index 5da0748..f5ae850 100644 --- a/src/generator.c +++ b/src/generator.c @@ -467,6 +467,19 @@ void generate_asm(Node *root, FILE *out) fprintf(out, " mov rax, rdi\n"); fprintf(out, " push rax\n"); + // Initialize global variables + for (int i = 0; i < root->block.num_children; i++) { + Node *child = root->block.children[i]; + if (child->type == AST_VARDECL && child->var_decl.value) { + Node *expr = child->var_decl.value; + generate_expr_into_rax(expr, out); + i64 offset = child->var_decl.var.offset; + fprintf(out, " mov rbx, global_vars\n"); + fprintf(out, " add rbx, %lld\n", offset); + fprintf(out, " mov [rbx], %s\n", subregister_for_type(expr->expr_type)); + } + } + fprintf(out, " call func_main\n"); fprintf(out, " mov rdi, rax\n"); |