| ... | @@ -583,12 +583,12 @@ pub const DeclGen = struct { | ... | @@ -583,12 +583,12 @@ pub const DeclGen = struct { |
| 583 | }; | 583 | }; |
| 584 | const byte_offset_val = Value.initPayload(&byte_offset_pl.base); | 584 | const byte_offset_val = Value.initPayload(&byte_offset_pl.base); |
| 585 | | 585 | |
| 586 | var ptr_u8_pl = ptr_info; | 586 | var u8_ptr_pl = ptr_info; |
| 587 | ptr_u8_pl.data.pointee_type = Type.u8; | 587 | u8_ptr_pl.data.pointee_type = Type.u8; |
| 588 | const ptr_u8_ty = Type.initPayload(&ptr_u8_pl.base); | 588 | const u8_ptr_ty = Type.initPayload(&u8_ptr_pl.base); |
| 589 | | 589 | |
| 590 | try writer.writeAll("&(("); | 590 | try writer.writeAll("&(("); |
| 591 | try dg.renderTypecast(writer, ptr_u8_ty); | 591 | try dg.renderTypecast(writer, u8_ptr_ty); |
| 592 | try writer.writeByte(')'); | 592 | try writer.writeByte(')'); |
| 593 | try dg.renderParentPtr(writer, field_ptr.container_ptr, container_ptr_ty); | 593 | try dg.renderParentPtr(writer, field_ptr.container_ptr, container_ptr_ty); |
| 594 | return writer.print(")[{}]", .{try dg.fmtIntLiteral(Type.usize, byte_offset_val)}); | 594 | return writer.print(")[{}]", .{try dg.fmtIntLiteral(Type.usize, byte_offset_val)}); |
| ... | @@ -4050,8 +4050,39 @@ fn airStructFieldPtrIndex(f: *Function, inst: Air.Inst.Index, index: u8) !CValue | ... | @@ -4050,8 +4050,39 @@ fn airStructFieldPtrIndex(f: *Function, inst: Air.Inst.Index, index: u8) !CValue |
| 4050 | } | 4050 | } |
| 4051 | | 4051 | |
| 4052 | fn airFieldParentPtr(f: *Function, inst: Air.Inst.Index) !CValue { | 4052 | fn airFieldParentPtr(f: *Function, inst: Air.Inst.Index) !CValue { |
| 4053 | _ = inst; | 4053 | if (f.liveness.isUnused(inst)) return CValue.none; |
| 4054 | return f.fail("TODO: C backend: implement airFieldParentPtr", .{}); | 4054 | |
| | 4055 | const ty_pl = f.air.instructions.items(.data)[inst].ty_pl; |
| | 4056 | const extra = f.air.extraData(Air.FieldParentPtr, ty_pl.payload).data; |
| | 4057 | |
| | 4058 | const struct_ptr_ty = f.air.typeOfIndex(inst); |
| | 4059 | const field_ptr_ty = f.air.typeOf(extra.field_ptr); |
| | 4060 | const field_ptr_val = try f.resolveInst(extra.field_ptr); |
| | 4061 | |
| | 4062 | const target = f.object.dg.module.getTarget(); |
| | 4063 | const struct_ty = struct_ptr_ty.childType(); |
| | 4064 | const field_offset = struct_ty.structFieldOffset(extra.field_index, target); |
| | 4065 | |
| | 4066 | var field_offset_pl = Value.Payload.I64{ |
| | 4067 | .base = .{ .tag = .int_i64 }, |
| | 4068 | .data = -@intCast(i64, field_offset), |
| | 4069 | }; |
| | 4070 | const field_offset_val = Value.initPayload(&field_offset_pl.base); |
| | 4071 | |
| | 4072 | var u8_ptr_pl = field_ptr_ty.ptrInfo(); |
| | 4073 | u8_ptr_pl.data.pointee_type = Type.u8; |
| | 4074 | const u8_ptr_ty = Type.initPayload(&u8_ptr_pl.base); |
| | 4075 | |
| | 4076 | const writer = f.object.writer(); |
| | 4077 | const local = try f.allocLocal(struct_ptr_ty, .Const); |
| | 4078 | try writer.writeAll(" = ("); |
| | 4079 | try f.renderTypecast(writer, struct_ptr_ty); |
| | 4080 | try writer.writeAll(")&(("); |
| | 4081 | try f.renderTypecast(writer, u8_ptr_ty); |
| | 4082 | try writer.writeByte(')'); |
| | 4083 | try f.writeCValue(writer, field_ptr_val, .Other); |
| | 4084 | try writer.print(")[{}];\n", .{try f.fmtIntLiteral(Type.isize, field_offset_val)}); |
| | 4085 | return local; |
| 4055 | } | 4086 | } |
| 4056 | | 4087 | |
| 4057 | fn structFieldPtr(f: *Function, inst: Air.Inst.Index, struct_ptr_ty: Type, struct_ptr: CValue, index: u32) !CValue { | 4088 | fn structFieldPtr(f: *Function, inst: Air.Inst.Index, struct_ptr_ty: Type, struct_ptr: CValue, index: u32) !CValue { |
| ... | @@ -4089,12 +4120,12 @@ fn structFieldPtr(f: *Function, inst: Air.Inst.Index, struct_ptr_ty: Type, struc | ... | @@ -4089,12 +4120,12 @@ fn structFieldPtr(f: *Function, inst: Air.Inst.Index, struct_ptr_ty: Type, struc |
| 4089 | }; | 4120 | }; |
| 4090 | const byte_offset_val = Value.initPayload(&byte_offset_pl.base); | 4121 | const byte_offset_val = Value.initPayload(&byte_offset_pl.base); |
| 4091 | | 4122 | |
| 4092 | var ptr_u8_pl = field_ptr_info; | 4123 | var u8_ptr_pl = field_ptr_info; |
| 4093 | ptr_u8_pl.data.pointee_type = Type.u8; | 4124 | u8_ptr_pl.data.pointee_type = Type.u8; |
| 4094 | const ptr_u8_ty = Type.initPayload(&ptr_u8_pl.base); | 4125 | const u8_ptr_ty = Type.initPayload(&u8_ptr_pl.base); |
| 4095 | | 4126 | |
| 4096 | try writer.writeAll("&(("); | 4127 | try writer.writeAll("&(("); |
| 4097 | try f.renderTypecast(writer, ptr_u8_ty); | 4128 | try f.renderTypecast(writer, u8_ptr_ty); |
| 4098 | try writer.writeByte(')'); | 4129 | try writer.writeByte(')'); |
| 4099 | try f.writeCValue(writer, struct_ptr, .Other); | 4130 | try f.writeCValue(writer, struct_ptr, .Other); |
| 4100 | try writer.print(")[{}];\n", .{try f.fmtIntLiteral(Type.usize, byte_offset_val)}); | 4131 | try writer.print(")[{}];\n", .{try f.fmtIntLiteral(Type.usize, byte_offset_val)}); |