| ... | @@ -2106,7 +2106,7 @@ pub const DeclGen = struct { | ... | @@ -2106,7 +2106,7 @@ pub const DeclGen = struct { |
| 2106 | fn llvmFieldIndex( | 2106 | fn llvmFieldIndex( |
| 2107 | dg: *DeclGen, | 2107 | dg: *DeclGen, |
| 2108 | ty: Type, | 2108 | ty: Type, |
| 2109 | field_index: u32, | 2109 | field_index: usize, |
| 2110 | ptr_pl_buf: *Type.Payload.Pointer, | 2110 | ptr_pl_buf: *Type.Payload.Pointer, |
| 2111 | ) ?c_uint { | 2111 | ) ?c_uint { |
| 2112 | const target = dg.module.getTarget(); | 2112 | const target = dg.module.getTarget(); |
| ... | @@ -4921,38 +4921,37 @@ pub const FuncGen = struct { | ... | @@ -4921,38 +4921,37 @@ pub const FuncGen = struct { |
| 4921 | return vector; | 4921 | return vector; |
| 4922 | }, | 4922 | }, |
| 4923 | .Struct => { | 4923 | .Struct => { |
| 4924 | const tuple = result_ty.castTag(.tuple).?.data; | 4924 | var ptr_ty_buf: Type.Payload.Pointer = undefined; |
| 4925 | | 4925 | |
| 4926 | if (isByRef(result_ty)) { | 4926 | if (isByRef(result_ty)) { |
| 4927 | const llvm_u32 = self.context.intType(32); | 4927 | const llvm_u32 = self.context.intType(32); |
| 4928 | const alloca_inst = self.buildAlloca(llvm_result_ty); | 4928 | const alloca_inst = self.buildAlloca(llvm_result_ty); |
| | 4929 | // TODO in debug builds init to undef so that the padding will be 0xaa |
| | 4930 | // even if we fully populate the fields. |
| 4929 | const target = self.dg.module.getTarget(); | 4931 | const target = self.dg.module.getTarget(); |
| 4930 | alloca_inst.setAlignment(result_ty.abiAlignment(target)); | 4932 | alloca_inst.setAlignment(result_ty.abiAlignment(target)); |
| 4931 | | 4933 | |
| 4932 | var indices: [2]*const llvm.Value = .{ llvm_u32.constNull(), undefined }; | 4934 | var indices: [2]*const llvm.Value = .{ llvm_u32.constNull(), undefined }; |
| 4933 | var llvm_i: u32 = 0; | | |
| 4934 | | | |
| 4935 | for (elements) |elem, i| { | 4935 | for (elements) |elem, i| { |
| 4936 | if (tuple.values[i].tag() != .unreachable_value) continue; | 4936 | if (result_ty.structFieldValueComptime(i) != null) continue; |
| 4937 | const field_ty = tuple.types[i]; | 4937 | |
| 4938 | const llvm_elem = try self.resolveInst(elem); | 4938 | const llvm_elem = try self.resolveInst(elem); |
| | 4939 | const llvm_i = self.dg.llvmFieldIndex(result_ty, i, &ptr_ty_buf).?; |
| 4939 | indices[1] = llvm_u32.constInt(llvm_i, .False); | 4940 | indices[1] = llvm_u32.constInt(llvm_i, .False); |
| 4940 | llvm_i += 1; | | |
| 4941 | const field_ptr = self.builder.buildInBoundsGEP(alloca_inst, &indices, indices.len, ""); | 4941 | const field_ptr = self.builder.buildInBoundsGEP(alloca_inst, &indices, indices.len, ""); |
| 4942 | const store_inst = self.builder.buildStore(llvm_elem, field_ptr); | 4942 | const store_inst = self.builder.buildStore(llvm_elem, field_ptr); |
| 4943 | store_inst.setAlignment(field_ty.abiAlignment(target)); | 4943 | store_inst.setAlignment(result_ty.structFieldAlign(i, target)); |
| 4944 | } | 4944 | } |
| 4945 | | 4945 | |
| 4946 | return alloca_inst; | 4946 | return alloca_inst; |
| 4947 | } else { | 4947 | } else { |
| 4948 | var result = llvm_result_ty.getUndef(); | 4948 | var result = llvm_result_ty.getUndef(); |
| 4949 | var llvm_i: u32 = 0; | | |
| 4950 | for (elements) |elem, i| { | 4949 | for (elements) |elem, i| { |
| 4951 | if (tuple.values[i].tag() != .unreachable_value) continue; | 4950 | if (result_ty.structFieldValueComptime(i) != null) continue; |
| 4952 | | 4951 | |
| 4953 | const llvm_elem = try self.resolveInst(elem); | 4952 | const llvm_elem = try self.resolveInst(elem); |
| | 4953 | const llvm_i = self.dg.llvmFieldIndex(result_ty, i, &ptr_ty_buf).?; |
| 4954 | result = self.builder.buildInsertValue(result, llvm_elem, llvm_i, ""); | 4954 | result = self.builder.buildInsertValue(result, llvm_elem, llvm_i, ""); |
| 4955 | llvm_i += 1; | | |
| 4956 | } | 4955 | } |
| 4957 | return result; | 4956 | return result; |
| 4958 | } | 4957 | } |