mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 15:48:51 +00:00
Improve global array index to be on a per module basis
This commit is contained in:
@@ -169,6 +169,8 @@ struct lbModule {
|
|||||||
|
|
||||||
RwMutex values_mutex;
|
RwMutex values_mutex;
|
||||||
|
|
||||||
|
std::atomic<u32> global_array_index;
|
||||||
|
|
||||||
PtrMap<Entity *, lbValue> values;
|
PtrMap<Entity *, lbValue> values;
|
||||||
PtrMap<Entity *, lbAddr> soa_values;
|
PtrMap<Entity *, lbAddr> soa_values;
|
||||||
StringMap<lbValue> members;
|
StringMap<lbValue> members;
|
||||||
@@ -226,8 +228,6 @@ struct lbGenerator : LinkerData {
|
|||||||
RecursiveMutex anonymous_proc_lits_mutex;
|
RecursiveMutex anonymous_proc_lits_mutex;
|
||||||
PtrMap<Ast *, lbProcedure *> anonymous_proc_lits;
|
PtrMap<Ast *, lbProcedure *> anonymous_proc_lits;
|
||||||
|
|
||||||
std::atomic<u32> global_array_index;
|
|
||||||
|
|
||||||
isize used_module_count;
|
isize used_module_count;
|
||||||
|
|
||||||
lbProcedure *startup_runtime;
|
lbProcedure *startup_runtime;
|
||||||
|
|||||||
@@ -588,12 +588,12 @@ gb_internal lbValue lb_const_value(lbModule *m, Type *type, ExactValue value, bo
|
|||||||
return lb_addr_load(p, slice);
|
return lb_addr_load(p, slice);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
isize max_len = 7+8+1;
|
u32 id = m->global_array_index.fetch_add(1);
|
||||||
char *str = gb_alloc_array(permanent_allocator(), char, max_len);
|
gbString str = gb_string_make(temporary_allocator(), "csba$");
|
||||||
u32 id = m->gen->global_array_index.fetch_add(1);
|
str = gb_string_appendc(str, m->module_name);
|
||||||
isize len = gb_snprintf(str, max_len, "csba$%x", id);
|
str = gb_string_append_fmt(str, "$%x", id);
|
||||||
|
|
||||||
String name = make_string(cast(u8 *)str, len-1);
|
String name = make_string(cast(u8 const *)str, gb_string_length(str));
|
||||||
|
|
||||||
Entity *e = alloc_entity_constant(nullptr, make_token_ident(name), t, value);
|
Entity *e = alloc_entity_constant(nullptr, make_token_ident(name), t, value);
|
||||||
array_data = LLVMAddGlobal(m->mod, lb_type(m, t), str);
|
array_data = LLVMAddGlobal(m->mod, lb_type(m, t), str);
|
||||||
|
|||||||
@@ -2527,12 +2527,10 @@ gb_internal LLVMValueRef lb_find_or_add_entity_string_ptr(lbModule *m, String co
|
|||||||
false);
|
false);
|
||||||
|
|
||||||
|
|
||||||
isize max_len = 7+8+1;
|
u32 id = m->global_array_index.fetch_add(1);
|
||||||
char *name = gb_alloc_array(permanent_allocator(), char, max_len);
|
gbString name = gb_string_make(temporary_allocator(), "csbs$");
|
||||||
|
name = gb_string_appendc(name, m->module_name);
|
||||||
u32 id = m->gen->global_array_index.fetch_add(1);
|
name = gb_string_append_fmt(name, "$%x", id);
|
||||||
isize len = gb_snprintf(name, max_len, "csbs$%x", id);
|
|
||||||
len -= 1;
|
|
||||||
|
|
||||||
LLVMTypeRef type = LLVMTypeOf(data);
|
LLVMTypeRef type = LLVMTypeOf(data);
|
||||||
LLVMValueRef global_data = LLVMAddGlobal(m->mod, type, name);
|
LLVMValueRef global_data = LLVMAddGlobal(m->mod, type, name);
|
||||||
@@ -2570,14 +2568,11 @@ gb_internal lbValue lb_find_or_add_entity_string_byte_slice_with_type(lbModule *
|
|||||||
false);
|
false);
|
||||||
|
|
||||||
|
|
||||||
char *name = nullptr;
|
u32 id = m->global_array_index.fetch_add(1);
|
||||||
{
|
gbString name = gb_string_make(temporary_allocator(), "csba$");
|
||||||
isize max_len = 7+8+1;
|
name = gb_string_appendc(name, m->module_name);
|
||||||
name = gb_alloc_array(permanent_allocator(), char, max_len);
|
name = gb_string_append_fmt(name, "$%x", id);
|
||||||
u32 id = m->gen->global_array_index.fetch_add(1);
|
|
||||||
isize len = gb_snprintf(name, max_len, "csbs$%x", id);
|
|
||||||
len -= 1;
|
|
||||||
}
|
|
||||||
LLVMTypeRef type = LLVMTypeOf(data);
|
LLVMTypeRef type = LLVMTypeOf(data);
|
||||||
LLVMValueRef global_data = LLVMAddGlobal(m->mod, type, name);
|
LLVMValueRef global_data = LLVMAddGlobal(m->mod, type, name);
|
||||||
LLVMSetInitializer(global_data, data);
|
LLVMSetInitializer(global_data, data);
|
||||||
@@ -2822,6 +2817,8 @@ gb_internal lbAddr lb_add_global_generated_from_procedure(lbProcedure *p, Type *
|
|||||||
u32 index = ++p->global_generated_index;
|
u32 index = ++p->global_generated_index;
|
||||||
|
|
||||||
gbString s = gb_string_make(temporary_allocator(), "ggv$");
|
gbString s = gb_string_make(temporary_allocator(), "ggv$");
|
||||||
|
// s = gb_string_appendc(s, p->module->module_name);
|
||||||
|
// s = gb_string_appendc(s, "$");
|
||||||
s = gb_string_append_length(s, p->name.text, p->name.len);
|
s = gb_string_append_length(s, p->name.text, p->name.len);
|
||||||
s = gb_string_append_fmt(s, "$%u", index);
|
s = gb_string_append_fmt(s, "$%u", index);
|
||||||
|
|
||||||
|
|||||||
@@ -3308,13 +3308,14 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
|
|||||||
{
|
{
|
||||||
isize max_len = 7+8+1;
|
isize max_len = 7+8+1;
|
||||||
name = gb_alloc_array(permanent_allocator(), char, max_len);
|
name = gb_alloc_array(permanent_allocator(), char, max_len);
|
||||||
u32 id = m->gen->global_array_index.fetch_add(1);
|
u32 id = m->global_array_index.fetch_add(1);
|
||||||
isize len = gb_snprintf(name, max_len, "csbs$%x", id);
|
isize len = gb_snprintf(name, max_len, "csbs$%x", id);
|
||||||
len -= 1;
|
len -= 1;
|
||||||
}
|
}
|
||||||
LLVMTypeRef type = LLVMTypeOf(array);
|
LLVMTypeRef type = LLVMTypeOf(array);
|
||||||
LLVMValueRef global_data = LLVMAddGlobal(m->mod, type, name);
|
LLVMValueRef global_data = LLVMAddGlobal(m->mod, type, name);
|
||||||
LLVMSetInitializer(global_data, array);
|
LLVMSetInitializer(global_data, array);
|
||||||
|
LLVMSetUnnamedAddress(global_data, LLVMGlobalUnnamedAddr);
|
||||||
LLVMSetLinkage(global_data, LLVMInternalLinkage);
|
LLVMSetLinkage(global_data, LLVMInternalLinkage);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user