Begin working on proper expressions

This commit is contained in:
gingerBill
2023-07-15 14:26:47 +01:00
parent ccb736411b
commit ee8372145d
7 changed files with 632 additions and 82 deletions
+131 -47
View File
@@ -33,7 +33,7 @@ gb_internal TB_DataType cg_data_type(Type *t) {
case Basic_typeid:
return TB_TYPE_INTN(cast(u16)(8*sz));
case Basic_f16: return TB_TYPE_I16;
case Basic_f16: return TB_TYPE_F16;
case Basic_f32: return TB_TYPE_F32;
case Basic_f64: return TB_TYPE_F64;
@@ -60,11 +60,11 @@ gb_internal TB_DataType cg_data_type(Type *t) {
case Basic_u128be:
return TB_TYPE_INTN(cast(u16)(8*sz));
case Basic_f16le: return TB_TYPE_I16;
case Basic_f16le: return TB_TYPE_F16;
case Basic_f32le: return TB_TYPE_F32;
case Basic_f64le: return TB_TYPE_F64;
case Basic_f16be: return TB_TYPE_I16;
case Basic_f16be: return TB_TYPE_F16;
case Basic_f32be: return TB_TYPE_F32;
case Basic_f64be: return TB_TYPE_F64;
}
@@ -173,9 +173,128 @@ gb_internal isize cg_type_info_index(CheckerInfo *info, Type *type, bool err_on_
return -1;
}
gb_internal void cg_create_global_variables(cgModule *m) {
struct cgGlobalVariable {
cgValue var;
cgValue init;
DeclInfo *decl;
bool is_initialized;
};
// Returns already_has_entry_point
gb_internal bool cg_global_variables_create(cgModule *m) {
isize global_variable_max_count = 0;
bool already_has_entry_point = false;
for (Entity *e : m->info->entities) {
String name = e->token.string;
if (e->kind == Entity_Variable) {
global_variable_max_count++;
} else if (e->kind == Entity_Procedure) {
if ((e->scope->flags&ScopeFlag_Init) && name == "main") {
GB_ASSERT(e == m->info->entry_point);
}
if (build_context.command_kind == Command_test &&
(e->Procedure.is_export || e->Procedure.link_name.len > 0)) {
String link_name = e->Procedure.link_name;
if (e->pkg->kind == Package_Runtime) {
if (link_name == "main" ||
link_name == "DllMain" ||
link_name == "WinMain" ||
link_name == "wWinMain" ||
link_name == "mainCRTStartup" ||
link_name == "_start") {
already_has_entry_point = true;
}
}
}
}
}
auto global_variables = array_make<cgGlobalVariable>(permanent_allocator(), 0, global_variable_max_count);
auto *min_dep_set = &m->info->minimum_dependency_set;
for (DeclInfo *d : m->info->variable_init_order) {
Entity *e = d->entity;
if ((e->scope->flags & ScopeFlag_File) == 0) {
continue;
}
if (!ptr_set_exists(min_dep_set, e)) {
continue;
}
DeclInfo *decl = decl_info_of_entity(e);
if (decl == nullptr) {
continue;
}
GB_ASSERT(e->kind == Entity_Variable);
bool is_foreign = e->Variable.is_foreign;
bool is_export = e->Variable.is_export;
String name = cg_get_entity_name(m, e);
TB_Linkage linkage = TB_LINKAGE_PRIVATE;
if (is_foreign) {
linkage = TB_LINKAGE_PUBLIC;
// lb_add_foreign_library_path(m, e->Variable.foreign_library);
// lb_set_wasm_import_attributes(g.value, e, name);
} else if (is_export) {
linkage = TB_LINKAGE_PUBLIC;
}
// lb_set_linkage_from_entity_flags(m, g.value, e->flags);
TB_DebugType *debug_type = cg_debug_type(m, e->type);
TB_Global *global = tb_global_create(m->mod, name.len, cast(char const *)name.text, debug_type, linkage);
cgValue g = cg_value(global, alloc_type_pointer(e->type));
TB_ModuleSection *section = tb_module_get_data(m->mod);
if (e->Variable.thread_local_model != "") {
section = tb_module_get_tls(m->mod);
}
if (e->Variable.link_section.len > 0) {
// TODO(bill): custom module sections
// LLVMSetSection(g.value, alloc_cstring(permanent_allocator(), e->Variable.link_section));
}
size_t max_objects = 0;
tb_global_set_storage(m->mod, section, global, type_size_of(e->type), type_align_of(e->type), max_objects);
cgGlobalVariable var = {};
var.var = g;
var.decl = decl;
if (decl->init_expr != nullptr) {
// TypeAndValue tav = type_and_value_of_expr(decl->init_expr);
// if (!is_type_any(e->type) && !is_type_union(e->type)) {
// if (tav.mode != Addressing_Invalid) {
// if (tav.value.kind != ExactValue_Invalid) {
// ExactValue v = tav.value;
// lbValue init = lb_const_value(m, tav.type, v);
// LLVMSetInitializer(g.value, init.value);
// var.is_initialized = true;
// }
// }
// }
// if (!var.is_initialized && is_type_untyped_nil(tav.type)) {
// var.is_initialized = true;
// }
}
array_add(&global_variables, var);
cg_add_entity(m, e, g);
cg_add_member(m, name, g);
}
if (build_context.no_rtti) {
return;
return already_has_entry_point;
}
CheckerInfo *info = m->info;
@@ -256,9 +375,11 @@ gb_internal void cg_create_global_variables(cgModule *m) {
}
}
}
return already_has_entry_point;
}
cgModule *cg_module_create(Checker *c) {
gb_internal cgModule *cg_module_create(Checker *c) {
cgModule *m = gb_alloc_item(permanent_allocator(), cgModule);
m->checker = c;
@@ -286,7 +407,7 @@ cgModule *cg_module_create(Checker *c) {
return m;
}
void cg_module_destroy(cgModule *m) {
gb_internal void cg_module_destroy(cgModule *m) {
map_destroy(&m->values);
array_free(&m->procedures_to_generate);
map_destroy(&m->file_id_map);
@@ -391,7 +512,7 @@ gb_internal String cg_mangle_name(cgModule *m, Entity *e) {
return mangled_name;
}
String cg_get_entity_name(cgModule *m, Entity *e) {
gb_internal String cg_get_entity_name(cgModule *m, Entity *e) {
if (e != nullptr && e->kind == Entity_TypeName && e->TypeName.ir_mangled_name.len != 0) {
return e->TypeName.ir_mangled_name;
}
@@ -438,14 +559,6 @@ String cg_get_entity_name(cgModule *m, Entity *e) {
return name;
}
struct cgGlobalVariable {
cgValue var;
cgValue init;
DeclInfo *decl;
bool is_initialized;
};
#include "tilde_const.cpp"
#include "tilde_expr.cpp"
#include "tilde_proc.cpp"
@@ -463,37 +576,8 @@ gb_internal bool cg_generate_code(Checker *c) {
TIME_SECTION("Tilde Global Variables");
cg_create_global_variables(m);
// isize global_variable_max_count = 0;
// bool already_has_entry_point = false;
// for (Entity *e : info->entities) {
// String name = e->token.string;
// if (e->kind == Entity_Variable) {
// global_variable_max_count++;
// } else if (e->kind == Entity_Procedure) {
// if ((e->scope->flags&ScopeFlag_Init) && name == "main") {
// GB_ASSERT(e == info->entry_point);
// }
// if (build_context.command_kind == Command_test &&
// (e->Procedure.is_export || e->Procedure.link_name.len > 0)) {
// String link_name = e->Procedure.link_name;
// if (e->pkg->kind == Package_Runtime) {
// if (link_name == "main" ||
// link_name == "DllMain" ||
// link_name == "WinMain" ||
// link_name == "wWinMain" ||
// link_name == "mainCRTStartup" ||
// link_name == "_start") {
// already_has_entry_point = true;
// }
// }
// }
// }
// }
// auto global_variables = array_make<cgGlobalVariable>(permanent_allocator(), 0, global_variable_max_count);
bool already_has_entry_point = cg_global_variables_create(m);
gb_unused(already_has_entry_point);
if (true) {
Type *proc_type = alloc_type_proc(nullptr, nullptr, 0, nullptr, 0, false, ProcCC_Odin);