Browse Source

Correct `lbAddr_SoaVariable` logic

gingerBill 1 year ago
parent
commit
f49ebae956
2 changed files with 16 additions and 13 deletions
  1. 1 11
      src/llvm_backend_expr.cpp
  2. 15 2
      src/llvm_backend_general.cpp

+ 1 - 11
src/llvm_backend_expr.cpp

@@ -3140,15 +3140,6 @@ gb_internal lbValue lb_emit_comp_against_nil(lbProcedure *p, TokenKind op_kind,
 	return {};
 	return {};
 }
 }
 
 
-gb_internal lbValue lb_make_soa_pointer(lbProcedure *p, Type *type, lbValue const &addr, lbValue const &index) {
-	lbAddr v = lb_add_local_generated(p, type, false);
-	lbValue ptr = lb_emit_struct_ep(p, v.addr, 0);
-	lbValue idx = lb_emit_struct_ep(p, v.addr, 1);
-	lb_emit_store(p, ptr, addr);
-	lb_emit_store(p, idx, lb_emit_conv(p, index, t_int));
-
-	return lb_addr_load(p, v);
-}
 
 
 gb_internal lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) {
 gb_internal lbValue lb_build_unary_and(lbProcedure *p, Ast *expr) {
 	ast_node(ue, UnaryExpr, expr);
 	ast_node(ue, UnaryExpr, expr);
@@ -3759,8 +3750,7 @@ gb_internal lbValue lb_get_using_variable(lbProcedure *p, Entity *e) {
 		is_soa = true;
 		is_soa = true;
 		// NOTE(bill): using SOA value (probably from for-in statement)
 		// NOTE(bill): using SOA value (probably from for-in statement)
 		lbAddr parent_addr = lb_get_soa_variable_addr(p, parent);
 		lbAddr parent_addr = lb_get_soa_variable_addr(p, parent);
-		Type *soa_ptr_type = alloc_type_soa_pointer(lb_addr_type(parent_addr));
-		v = lb_address_from_load_or_generate_local(p, lb_make_soa_pointer(p, soa_ptr_type, parent_addr.addr, parent_addr.soa.index));
+		v = lb_addr_get_ptr(p, parent_addr);
 	} else if (pv != nullptr) {
 	} else if (pv != nullptr) {
 		v = *pv;
 		v = *pv;
 	} else {
 	} else {

+ 15 - 2
src/llvm_backend_general.cpp

@@ -534,6 +534,15 @@ gb_internal lbValue lb_relative_pointer_to_pointer(lbProcedure *p, lbAddr const
 	return final_ptr;
 	return final_ptr;
 }
 }
 
 
+gb_internal lbValue lb_make_soa_pointer(lbProcedure *p, Type *type, lbValue const &addr, lbValue const &index) {
+	lbAddr v = lb_add_local_generated(p, type, false);
+	lbValue ptr = lb_emit_struct_ep(p, v.addr, 0);
+	lbValue idx = lb_emit_struct_ep(p, v.addr, 1);
+	lb_emit_store(p, ptr, addr);
+	lb_emit_store(p, idx, lb_emit_conv(p, index, t_int));
+
+	return lb_addr_load(p, v);
+}
 
 
 gb_internal lbValue lb_addr_get_ptr(lbProcedure *p, lbAddr const &addr) {
 gb_internal lbValue lb_addr_get_ptr(lbProcedure *p, lbAddr const &addr) {
 	if (addr.addr.value == nullptr) {
 	if (addr.addr.value == nullptr) {
@@ -549,8 +558,12 @@ gb_internal lbValue lb_addr_get_ptr(lbProcedure *p, lbAddr const &addr) {
 		return lb_relative_pointer_to_pointer(p, addr);
 		return lb_relative_pointer_to_pointer(p, addr);
 
 
 	case lbAddr_SoaVariable:
 	case lbAddr_SoaVariable:
-		// TODO(bill): FIX THIS HACK
-		return lb_address_from_load(p, lb_addr_load(p, addr));
+		{
+			Type *soa_ptr_type = alloc_type_soa_pointer(lb_addr_type(addr));
+			return lb_address_from_load_or_generate_local(p, lb_make_soa_pointer(p, soa_ptr_type, addr.addr, addr.soa.index));
+			// TODO(bill): FIX THIS HACK
+			// return lb_address_from_load(p, lb_addr_load(p, addr));
+		}
 
 
 	case lbAddr_Context:
 	case lbAddr_Context:
 		GB_PANIC("lbAddr_Context should be handled elsewhere");
 		GB_PANIC("lbAddr_Context should be handled elsewhere");