Browse Source

Improve global array index to be on a per module basis

gingerBill 5 months ago
parent
commit
400348c925
4 changed files with 20 additions and 22 deletions
  1. 2 2
      src/llvm_backend.hpp
  2. 5 5
      src/llvm_backend_const.cpp
  3. 11 14
      src/llvm_backend_general.cpp
  4. 2 1
      src/llvm_backend_proc.cpp

+ 2 - 2
src/llvm_backend.hpp

@@ -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;

+ 5 - 5
src/llvm_backend_const.cpp

@@ -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;
-				char *str = gb_alloc_array(permanent_allocator(), char, max_len);
-				u32 id = m->gen->global_array_index.fetch_add(1);
-				isize len = gb_snprintf(str, max_len, "csba$%x", id);
+				u32 id = m->global_array_index.fetch_add(1);
+				gbString str = gb_string_make(temporary_allocator(), "csba$");
+				str = gb_string_appendc(str, m->module_name);
+				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);

+ 11 - 14
src/llvm_backend_general.cpp

@@ -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;
-		char *name = gb_alloc_array(permanent_allocator(), char, max_len);
-
-		u32 id = m->gen->global_array_index.fetch_add(1);
-		isize len = gb_snprintf(name, max_len, "csbs$%x", id);
-		len -= 1;
+		u32 id = m->global_array_index.fetch_add(1);
+		gbString name = gb_string_make(temporary_allocator(), "csbs$");
+		name = gb_string_appendc(name, m->module_name);
+		name = gb_string_append_fmt(name, "$%x", id);
 
 
 		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;
-	{
-		isize max_len = 7+8+1;
-		name = gb_alloc_array(permanent_allocator(), char, max_len);
-		u32 id = m->gen->global_array_index.fetch_add(1);
-		isize len = gb_snprintf(name, max_len, "csbs$%x", id);
-		len -= 1;
-	}
+	u32 id = m->global_array_index.fetch_add(1);
+	gbString name = gb_string_make(temporary_allocator(), "csba$");
+	name = gb_string_appendc(name, m->module_name);
+	name = gb_string_append_fmt(name, "$%x", id);
+
 	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);
 
 

+ 2 - 1
src/llvm_backend_proc.cpp

@@ -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);