aboutsummaryrefslogtreecommitdiff
path: root/src/ir.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2018-12-28 13:31:06 +0000
committergingerBill <bill@gingerbill.org>2018-12-28 13:31:06 +0000
commita240a3d14660f6b33f839a3ebf142e20aac3e80a (patch)
treea32aea3ab5929ca1bda8c54cf839a0a956bc5225 /src/ir.cpp
parent775f1e2c959e0db488615a44d30be3a59d371b08 (diff)
`static` variable declarations (Experimental)
Diffstat (limited to 'src/ir.cpp')
-rw-r--r--src/ir.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/ir.cpp b/src/ir.cpp
index 540347724..c94b2ec59 100644
--- a/src/ir.cpp
+++ b/src/ir.cpp
@@ -405,6 +405,7 @@ struct irValueGlobal {
bool is_constant;
bool is_export;
bool is_private;
+ bool is_internal;
String thread_local_model;
bool is_foreign;
bool is_unnamed_addr;
@@ -7941,6 +7942,44 @@ void ir_build_stmt_internal(irProcedure *proc, Ast *node) {
case_ast_node(vd, ValueDecl, node);
if (vd->is_mutable) {
irModule *m = proc->module;
+
+ if (vd->is_static) {
+ for_array(i, vd->names) {
+ irValue *value = nullptr;
+ if (vd->values.count > 0) {
+ GB_ASSERT(vd->names.count == vd->values.count);
+ Ast *ast_value = vd->values[i];
+ GB_ASSERT(ast_value->tav.mode == Addressing_Constant ||
+ ast_value->tav.mode == Addressing_Invalid);
+
+ value = ir_add_module_constant(m, ast_value->tav.type, ast_value->tav.value);
+ }
+
+ Ast *ident = vd->names[i];
+ GB_ASSERT(!is_blank_ident(ident));
+ Entity *e = entity_of_ident(ident);
+ GB_ASSERT(e->flags & EntityFlag_Static);
+ String name = e->token.string;
+ HashKey key = hash_string(name);
+
+ String mangled_name = {};
+ {
+ gbString str = gb_string_make_length(heap_allocator(), proc->name.text, proc->name.len);
+ str = gb_string_appendc(str, "-");
+ str = gb_string_append_fmt(str, ".%.*s-%llu", LIT(name), cast(long long)e->id);
+ mangled_name.text = cast(u8 *)str;
+ mangled_name.len = gb_string_length(str);
+ }
+
+ irValue *g = ir_value_global(e, value);
+ g->Global.name = mangled_name;
+ g->Global.is_internal = true;
+ ir_module_add_value(proc->module, e, g);
+ map_set(&proc->module->members, key, g);
+ }
+ return;
+ }
+
gbTempArenaMemory tmp = gb_temp_arena_memory_begin(&m->tmp_arena);
defer (gb_temp_arena_memory_end(tmp));
@@ -10143,6 +10182,10 @@ void ir_gen_tree(irGen *s) {
ir_add_foreign_library_path(m, fl);
}
+ if (e->flags & EntityFlag_Static) {
+ var->var->Global.is_internal = true;
+ }
+
if (var->init != nullptr) {
Type *t = type_deref(ir_type(var->var));