Browse Source

Try to make globally generated variables deterministic in name

gingerBill 5 months ago
parent
commit
f9d85a7311

+ 4 - 1
src/llvm_backend.hpp

@@ -361,6 +361,8 @@ struct lbProcedure {
 	bool             in_multi_assignment;
 	bool             in_multi_assignment;
 	Array<LLVMValueRef> raw_input_parameters;
 	Array<LLVMValueRef> raw_input_parameters;
 
 
+	u32 global_generated_index;
+
 	bool             uses_branch_location;
 	bool             uses_branch_location;
 	TokenPos         branch_location_pos;
 	TokenPos         branch_location_pos;
 	TokenPos         curr_token_pos;
 	TokenPos         curr_token_pos;
@@ -470,7 +472,8 @@ gb_internal lbContextData *lb_push_context_onto_stack(lbProcedure *p, lbAddr ctx
 gb_internal lbContextData *lb_push_context_onto_stack_from_implicit_parameter(lbProcedure *p);
 gb_internal lbContextData *lb_push_context_onto_stack_from_implicit_parameter(lbProcedure *p);
 
 
 
 
-gb_internal lbAddr lb_add_global_generated(lbModule *m, Type *type, lbValue value={}, Entity **entity_=nullptr);
+gb_internal lbAddr lb_add_global_generated_from_procedure(lbProcedure *p, Type *type, lbValue value={});
+gb_internal lbAddr lb_add_global_generated_with_name(lbModule *m, Type *type, lbValue value, String name, Entity **entity_=nullptr);
 gb_internal lbAddr lb_add_local(lbProcedure *p, Type *type, Entity *e=nullptr, bool zero_init=true, bool force_no_init=false);
 gb_internal lbAddr lb_add_local(lbProcedure *p, Type *type, Entity *e=nullptr, bool zero_init=true, bool force_no_init=false);
 
 
 gb_internal void lb_add_foreign_library_path(lbModule *m, Entity *e);
 gb_internal void lb_add_foreign_library_path(lbModule *m, Entity *e);

+ 4 - 4
src/llvm_backend_expr.cpp

@@ -2312,9 +2312,9 @@ gb_internal lbValue lb_emit_conv(lbProcedure *p, lbValue value, Type *t) {
 				lbValue array_const_value = {};
 				lbValue array_const_value = {};
 				array_const_value.type = t;
 				array_const_value.type = t;
 				array_const_value.value = LLVMConstArray(lb_type(m, elem), values, cast(unsigned)index_count);
 				array_const_value.value = LLVMConstArray(lb_type(m, elem), values, cast(unsigned)index_count);
-				v = lb_add_global_generated(m, t, array_const_value);
+				v = lb_add_global_generated_from_procedure(p, t, array_const_value);
 			} else {
 			} else {
-				v = lb_add_global_generated(m, t);
+				v = lb_add_global_generated_from_procedure(p, t);
 			}
 			}
 
 
 			lb_make_global_private_const(v);
 			lb_make_global_private_const(v);
@@ -3264,7 +3264,7 @@ gb_internal lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) {
 		Type *type = v.type;
 		Type *type = v.type;
 		lbAddr addr = {};
 		lbAddr addr = {};
 		if (p->is_startup) {
 		if (p->is_startup) {
-			addr = lb_add_global_generated(p->module, type, v);
+			addr = lb_add_global_generated_from_procedure(p, type, v);
 		} else {
 		} else {
 			addr = lb_add_local_generated(p, type, false);
 			addr = lb_add_local_generated(p, type, false);
 		}
 		}
@@ -3851,7 +3851,7 @@ gb_internal lbAddr lb_build_addr_from_entity(lbProcedure *p, Entity *e, Ast *exp
 		Type *t = default_type(type_of_expr(expr));
 		Type *t = default_type(type_of_expr(expr));
 		lbValue v = lb_const_value(p->module, t, e->Constant.value);
 		lbValue v = lb_const_value(p->module, t, e->Constant.value);
 		if (LLVMIsConstant(v.value)) {
 		if (LLVMIsConstant(v.value)) {
-			lbAddr g = lb_add_global_generated(p->module, t, v);
+			lbAddr g = lb_add_global_generated_from_procedure(p, t, v);
 			return g;
 			return g;
 		}
 		}
 		GB_ASSERT(LLVMIsALoadInst(v.value));
 		GB_ASSERT(LLVMIsALoadInst(v.value));

+ 11 - 24
src/llvm_backend_general.cpp

@@ -1007,7 +1007,7 @@ gb_internal void lb_emit_store(lbProcedure *p, lbValue ptr, lbValue value) {
 			                 LLVMConstInt(LLVMInt64TypeInContext(p->module->ctx), lb_sizeof(LLVMTypeOf(value.value)), false));
 			                 LLVMConstInt(LLVMInt64TypeInContext(p->module->ctx), lb_sizeof(LLVMTypeOf(value.value)), false));
 			return;
 			return;
 		} else if (LLVMIsConstant(value.value)) {
 		} else if (LLVMIsConstant(value.value)) {
-			lbAddr addr = lb_add_global_generated(p->module, value.type, value, nullptr);
+			lbAddr addr = lb_add_global_generated_from_procedure(p, value.type, value);
 			lb_make_global_private_const(addr);
 			lb_make_global_private_const(addr);
 
 
 			LLVMValueRef dst_ptr = ptr.value;
 			LLVMValueRef dst_ptr = ptr.value;
@@ -2779,18 +2779,13 @@ gb_internal lbValue lb_generate_anonymous_proc_lit(lbModule *m, String const &pr
 }
 }
 
 
 
 
-gb_internal lbAddr lb_add_global_generated(lbModule *m, Type *type, lbValue value, Entity **entity_) {
+gb_internal lbAddr lb_add_global_generated_with_name(lbModule *m, Type *type, lbValue value, String name, Entity **entity_) {
 	GB_ASSERT(type != nullptr);
 	GB_ASSERT(type != nullptr);
 	type = default_type(type);
 	type = default_type(type);
 
 
 	isize max_len = 7+8+1;
 	isize max_len = 7+8+1;
 	u8 *str = cast(u8 *)gb_alloc_array(permanent_allocator(), u8, max_len);
 	u8 *str = cast(u8 *)gb_alloc_array(permanent_allocator(), u8, max_len);
 
 
-	u32 id = m->gen->global_generated_index.fetch_add(1);
-
-	isize len = gb_snprintf(cast(char *)str, max_len, "ggv$%x", id);
-	String name = make_string(str, len-1);
-
 	Scope *scope = nullptr;
 	Scope *scope = nullptr;
 	Entity *e = alloc_entity_variable(scope, make_token_ident(name), type);
 	Entity *e = alloc_entity_variable(scope, make_token_ident(name), type);
 	lbValue g = {};
 	lbValue g = {};
@@ -2811,32 +2806,24 @@ gb_internal lbAddr lb_add_global_generated(lbModule *m, Type *type, lbValue valu
 	return lb_addr(g);
 	return lb_addr(g);
 }
 }
 
 
-gb_internal lbAddr lb_add_global_generated_with_name(lbModule *m, Type *type, lbValue value, String name) {
+
+gb_internal lbAddr lb_add_global_generated_from_procedure(lbProcedure *p, Type *type, lbValue value) {
 	GB_ASSERT(type != nullptr);
 	GB_ASSERT(type != nullptr);
 	type = default_type(type);
 	type = default_type(type);
 
 
-	isize max_len = 7+8+1;
-	u8 *str = cast(u8 *)gb_alloc_array(permanent_allocator(), u8, max_len);
+	u32 index = ++p->global_generated_index;
 
 
-	Scope *scope = nullptr;
-	Entity *e = alloc_entity_variable(scope, make_token_ident(name), type);
-	lbValue g = {};
-	g.type = alloc_type_pointer(type);
-	g.value = LLVMAddGlobal(m->mod, lb_type(m, type), cast(char const *)str);
-	if (value.value != nullptr) {
-		GB_ASSERT_MSG(LLVMIsConstant(value.value), LLVMPrintValueToString(value.value));
-		LLVMSetInitializer(g.value, value.value);
-	} else {
-		LLVMSetInitializer(g.value, LLVMConstNull(lb_type(m, type)));
-	}
+	gbString s = gb_string_make(temporary_allocator(), "ggv$");
+	s = gb_string_append_length(s, p->name.text, p->name.len);
+	s = gb_string_append_fmt(s, "$%u", index);
 
 
-	lb_add_entity(m, e, g);
-	lb_add_member(m, name, g);
 
 
-	return lb_addr(g);
+	String name = make_string(cast(u8 const *)s, gb_string_length(s));
+	return lb_add_global_generated_with_name(p->module, type, value, name);
 }
 }
 
 
 
 
+
 gb_internal lbValue lb_find_runtime_value(lbModule *m, String const &name) {
 gb_internal lbValue lb_find_runtime_value(lbModule *m, String const &name) {
 	AstPackage *p = m->info->runtime_package;
 	AstPackage *p = m->info->runtime_package;
 	Entity *e = scope_lookup_current(p->scope, name);
 	Entity *e = scope_lookup_current(p->scope, name);

+ 3 - 3
src/llvm_backend_proc.cpp

@@ -1119,7 +1119,7 @@ gb_internal lbValue lb_emit_call(lbProcedure *p, lbValue value, Array<lbValue> c
 					if (LLVMIsConstant(x.value)) {
 					if (LLVMIsConstant(x.value)) {
 						// NOTE(bill): if the value is already constant, then just it as a global variable
 						// NOTE(bill): if the value is already constant, then just it as a global variable
 						// and pass it by pointer
 						// and pass it by pointer
-						lbAddr addr = lb_add_global_generated(p->module, original_type, x);
+						lbAddr addr = lb_add_global_generated_from_procedure(p, original_type, x);
 						lb_make_global_private_const(addr);
 						lb_make_global_private_const(addr);
 						ptr = addr.addr;
 						ptr = addr.addr;
 					} else {
 					} else {
@@ -1874,7 +1874,7 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
 			LLVMValueRef backing_array = llvm_const_array(lb_type(m, t_load_directory_file), elements, count);
 			LLVMValueRef backing_array = llvm_const_array(lb_type(m, t_load_directory_file), elements, count);
 
 
 			Type *array_type = alloc_type_array(t_load_directory_file, count);
 			Type *array_type = alloc_type_array(t_load_directory_file, count);
-			lbAddr backing_array_addr = lb_add_global_generated(m, array_type, {backing_array, array_type}, nullptr);
+			lbAddr backing_array_addr = lb_add_global_generated_from_procedure(p, array_type, {backing_array, array_type});
 			lb_make_global_private_const(backing_array_addr);
 			lb_make_global_private_const(backing_array_addr);
 
 
 			LLVMValueRef backing_array_ptr = backing_array_addr.addr.value;
 			LLVMValueRef backing_array_ptr = backing_array_addr.addr.value;
@@ -1882,7 +1882,7 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
 
 
 			LLVMValueRef const_slice = llvm_const_slice_internal(m, backing_array_ptr, LLVMConstInt(lb_type(m, t_int), count, false));
 			LLVMValueRef const_slice = llvm_const_slice_internal(m, backing_array_ptr, LLVMConstInt(lb_type(m, t_int), count, false));
 
 
-			lbAddr addr = lb_add_global_generated(p->module, tv.type, {const_slice, t_load_directory_file_slice}, nullptr);
+			lbAddr addr = lb_add_global_generated_from_procedure(p, tv.type, {const_slice, t_load_directory_file_slice});
 			lb_make_global_private_const(addr);
 			lb_make_global_private_const(addr);
 
 
 			return lb_addr_load(p, addr);
 			return lb_addr_load(p, addr);

+ 13 - 2
src/llvm_backend_utility.cpp

@@ -2112,7 +2112,13 @@ gb_internal lbAddr lb_handle_objc_find_or_register_selector(lbProcedure *p, Stri
 	}
 	}
 
 
 	if (!entity) {
 	if (!entity) {
-		lbAddr default_addr = lb_add_global_generated(default_module, t_objc_SEL, {}, &entity);
+		gbString global_name = gb_string_make(temporary_allocator(), "__$objc_selector-");
+		global_name = gb_string_append_length(global_name, name.text, name.len);
+
+		lbAddr default_addr = lb_add_global_generated_with_name(
+			default_module, t_objc_SEL, {},
+			make_string(cast(u8 const *)global_name, gb_string_length(global_name)),
+			&entity);
 		string_map_set(&default_module->objc_selectors, name, lbObjcRef{entity, default_addr});
 		string_map_set(&default_module->objc_selectors, name, lbObjcRef{entity, default_addr});
 	}
 	}
 
 
@@ -2169,7 +2175,12 @@ gb_internal lbAddr lb_handle_objc_find_or_register_class(lbProcedure *p, String
 	}
 	}
 
 
 	if (!entity) {
 	if (!entity) {
-		lbAddr default_addr = lb_add_global_generated(default_module, t_objc_Class, {}, &entity);
+		gbString global_name = gb_string_make(temporary_allocator(), "__$objc_class-");
+		global_name = gb_string_append_length(global_name, name.text, name.len);
+
+		lbAddr default_addr = lb_add_global_generated_with_name(default_module, t_objc_Class, {},
+			make_string(cast(u8 const *)global_name, gb_string_length(global_name)),
+			&entity);
 		string_map_set(&default_module->objc_classes, name, lbObjcRef{entity, default_addr});
 		string_map_set(&default_module->objc_classes, name, lbObjcRef{entity, default_addr});
 	}
 	}