Browse Source

Make `lb_type_info` use a procedure to load the global value

gingerBill 1 year ago
parent
commit
5107bdc06b

+ 1 - 1
src/llvm_backend.cpp

@@ -1164,7 +1164,7 @@ gb_internal lbProcedure *lb_create_startup_runtime(lbModule *main_module, lbProc
 				lbValue data = lb_emit_struct_ep(p, var.var, 0);
 				lbValue data = lb_emit_struct_ep(p, var.var, 0);
 				lbValue ti   = lb_emit_struct_ep(p, var.var, 1);
 				lbValue ti   = lb_emit_struct_ep(p, var.var, 1);
 				lb_emit_store(p, data, lb_emit_conv(p, gp, t_rawptr));
 				lb_emit_store(p, data, lb_emit_conv(p, gp, t_rawptr));
-				lb_emit_store(p, ti,   lb_type_info(main_module, var_type));
+				lb_emit_store(p, ti,   lb_type_info(p, var_type));
 			} else {
 			} else {
 				LLVMTypeRef vt = llvm_addr_type(p->module, var.var);
 				LLVMTypeRef vt = llvm_addr_type(p->module, var.var);
 				lbValue src0 = lb_emit_conv(p, var.init, t);
 				lbValue src0 = lb_emit_conv(p, var.init, t);

+ 1 - 1
src/llvm_backend.hpp

@@ -485,7 +485,7 @@ gb_internal lbValue lb_emit_mul_add(lbProcedure *p, lbValue a, lbValue b, lbValu
 
 
 gb_internal void lb_fill_slice(lbProcedure *p, lbAddr const &slice, lbValue base_elem, lbValue len);
 gb_internal void lb_fill_slice(lbProcedure *p, lbAddr const &slice, lbValue base_elem, lbValue len);
 
 
-gb_internal lbValue lb_type_info(lbModule *m, Type *type);
+gb_internal lbValue lb_type_info(lbProcedure *p, Type *type);
 
 
 gb_internal lbValue lb_find_or_add_entity_string(lbModule *m, String const &str);
 gb_internal lbValue lb_find_or_add_entity_string(lbModule *m, String const &str);
 gb_internal lbValue lb_generate_anonymous_proc_lit(lbModule *m, String const &prefix_name, Ast *expr, lbProcedure *parent = nullptr);
 gb_internal lbValue lb_generate_anonymous_proc_lit(lbModule *m, String const &prefix_name, Ast *expr, lbProcedure *parent = nullptr);

+ 1 - 1
src/llvm_backend_proc.cpp

@@ -1755,7 +1755,7 @@ gb_internal lbValue lb_build_builtin_proc(lbProcedure *p, Ast *expr, TypeAndValu
 		TypeAndValue tav = type_and_value_of_expr(arg);
 		TypeAndValue tav = type_and_value_of_expr(arg);
 		if (tav.mode == Addressing_Type) {
 		if (tav.mode == Addressing_Type) {
 			Type *t = default_type(type_of_expr(arg));
 			Type *t = default_type(type_of_expr(arg));
-			return lb_type_info(p->module, t);
+			return lb_type_info(p, t);
 		}
 		}
 		GB_ASSERT(is_type_typeid(tav.type));
 		GB_ASSERT(is_type_typeid(tav.type));
 
 

+ 1 - 1
src/llvm_backend_stmt.cpp

@@ -748,7 +748,7 @@ gb_internal void lb_build_range_enum(lbProcedure *p, Type *enum_type, Type *val_
 	i64 enum_count = t->Enum.fields.count;
 	i64 enum_count = t->Enum.fields.count;
 	lbValue max_count = lb_const_int(m, t_int, enum_count);
 	lbValue max_count = lb_const_int(m, t_int, enum_count);
 
 
-	lbValue ti          = lb_type_info(m, t);
+	lbValue ti          = lb_type_info(p, t);
 	lbValue variant     = lb_emit_struct_ep(p, ti, 4);
 	lbValue variant     = lb_emit_struct_ep(p, ti, 4);
 	lbValue eti_ptr     = lb_emit_conv(p, variant, t_type_info_enum_ptr);
 	lbValue eti_ptr     = lb_emit_conv(p, variant, t_type_info_enum_ptr);
 	lbValue values      = lb_emit_load(p, lb_emit_struct_ep(p, eti_ptr, 2));
 	lbValue values      = lb_emit_load(p, lb_emit_struct_ep(p, eti_ptr, 2));

+ 5 - 8
src/llvm_backend_type.cpp

@@ -111,22 +111,19 @@ gb_internal lbValue lb_typeid(lbModule *m, Type *type) {
 	return res;
 	return res;
 }
 }
 
 
-gb_internal lbValue lb_type_info(lbModule *m, Type *type) {
+gb_internal lbValue lb_type_info(lbProcedure *p, Type *type) {
 	GB_ASSERT(!build_context.no_rtti);
 	GB_ASSERT(!build_context.no_rtti);
 
 
 	type = default_type(type);
 	type = default_type(type);
+	lbModule *m = p->module;
 
 
 	isize index = lb_type_info_index(m->info, type);
 	isize index = lb_type_info_index(m->info, type);
 	GB_ASSERT(index >= 0);
 	GB_ASSERT(index >= 0);
 
 
-	LLVMValueRef global = lb_global_type_info_data_ptr(m).value;
+	lbValue global = lb_global_type_info_data_ptr(m);
 
 
-	LLVMValueRef global_array = LLVMGetInitializer(global);
-	LLVMValueRef index_value = LLVMConstInt(lb_type(m, t_int), index, false);
-	lbValue res = {};
-	res.value = LLVMConstPointerCast(LLVMConstExtractElement(global_array, index_value), lb_type(m, t_type_info_ptr));
-	res.type = t_type_info_ptr;
-	return res;
+	lbValue ptr = lb_emit_array_epi(p, global, index);
+	return lb_emit_load(p, ptr);
 }
 }
 
 
 gb_internal LLVMTypeRef lb_get_procedure_raw_type(lbModule *m, Type *type) {
 gb_internal LLVMTypeRef lb_get_procedure_raw_type(lbModule *m, Type *type) {