Browse Source

Fix more #soa changes

gingerBill 1 year ago
parent
commit
575b268e88
3 changed files with 15 additions and 0 deletions
  1. 3 0
      src/llvm_backend_expr.cpp
  2. 1 0
      src/llvm_backend_general.cpp
  3. 11 0
      src/types.cpp

+ 3 - 0
src/llvm_backend_expr.cpp

@@ -4993,6 +4993,9 @@ gb_internal lbAddr lb_build_addr_internal(lbProcedure *p, Ast *expr) {
 					if (sub_sel.index.count > 0) {
 						item = lb_emit_deep_field_gep(p, item, sub_sel);
 					}
+					// make sure it's ^T and not [^]T
+					item.type = alloc_type_multi_pointer_to_pointer(item.type);
+
 					return lb_addr(item);
 				} else if (addr.kind == lbAddr_Swizzle) {
 					GB_ASSERT(sel.index.count > 0);

+ 1 - 0
src/llvm_backend_general.cpp

@@ -1292,6 +1292,7 @@ gb_internal lbValue lb_addr_load(lbProcedure *p, lbAddr const &addr) {
 		if (t->Struct.soa_kind == StructSoa_Fixed) {
 			len = lb_const_int(p->module, t_int, t->Struct.soa_count);
 		} else {
+			elem = alloc_type_multi_pointer_to_pointer(elem);
 			lbValue v = lb_emit_load(p, addr.addr);
 			len = lb_soa_struct_len(p, v);
 		}

+ 11 - 0
src/types.cpp

@@ -999,6 +999,17 @@ gb_internal Type *alloc_type_pointer_to_multi_pointer(Type *ptr) {
 	return original_type;
 }
 
+gb_internal Type *alloc_type_multi_pointer_to_pointer(Type *ptr) {
+	Type *original_type = ptr;
+	ptr = base_type(ptr);
+	if (ptr->kind == Type_MultiPointer) {
+		return alloc_type_pointer(ptr->MultiPointer.elem);
+	} else if (ptr->kind != Type_Pointer) {
+		GB_PANIC("Invalid type: %s", type_to_string(original_type));
+	}
+	return original_type;
+}
+
 gb_internal Type *alloc_type_array(Type *elem, i64 count, Type *generic_count = nullptr) {
 	if (generic_count != nullptr) {
 		Type *t = alloc_type(Type_Array);