authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2022-01-08 13:00:49+01:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2022-01-08 13:00:49+01:00
logd8d5e2d4b959f9627853a9f1248609929f0f0de4
treedef51f4b1febf910813575e88043732545b6977d
parent3f586781b6c8d698468cc58ab64797097323c253

Implement offsetOf builtin function


2 files changed, 38 insertions(+), 4 deletions(-)

src/Sema.zig+30-2
...@@ -11000,8 +11000,36 @@ fn zirBitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError...@@ -11000,8 +11000,36 @@ fn zirBitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
1100011000
11001fn zirOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {11001fn zirOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
11002 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;11002 const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
11003 const src = inst_data.src();11003 sema.src = .{ .node_offset_bin_op = inst_data.src_node };
11004 return sema.fail(block, src, "TODO: Sema.zirOffsetOf", .{});11004 const lhs_src: LazySrcLoc = .{ .node_offset_bin_lhs = inst_data.src_node };
11005 const rhs_src: LazySrcLoc = .{ .node_offset_bin_rhs = inst_data.src_node };
11006 const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
11007
11008 const ty = try sema.resolveType(block, lhs_src, extra.lhs);
11009 const field_name = try sema.resolveConstString(block, rhs_src, extra.rhs);
11010
11011 try sema.resolveTypeLayout(block, lhs_src, ty);
11012 if (ty.tag() != .@"struct") {
11013 return sema.fail(
11014 block,
11015 lhs_src,
11016 "expected struct type, found '{}'",
11017 .{ty},
11018 );
11019 }
11020
11021 const index = ty.structFields().getIndex(field_name) orelse {
11022 return sema.fail(
11023 block,
11024 rhs_src,
11025 "struct '{}' has no field '{s}'",
11026 .{ ty, field_name },
11027 );
11028 };
11029
11030 const target = sema.mod.getTarget();
11031 const offset = ty.structFieldOffset(index, target);
11032 return sema.addIntUnsigned(Type.comptime_int, offset);
11005}11033}
1100611034
11007/// Returns `true` if the type was a comptime_int.11035/// Returns `true` if the type was a comptime_int.
src/type.zig+8-2
...@@ -3777,7 +3777,10 @@ pub const Type = extern union {...@@ -3777,7 +3777,10 @@ pub const Type = extern union {
3777 var offset: u64 = 0;3777 var offset: u64 = 0;
3778 var big_align: u32 = 0;3778 var big_align: u32 = 0;
3779 for (struct_obj.fields.values()) |field, i| {3779 for (struct_obj.fields.values()) |field, i| {
3780 if (!field.ty.hasCodeGenBits()) continue;3780 if (!field.ty.hasCodeGenBits()) {
3781 if (i == index) return offset;
3782 continue;
3783 }
37813784
3782 const field_align = field.normalAlignment(target);3785 const field_align = field.normalAlignment(target);
3783 big_align = @maximum(big_align, field_align);3786 big_align = @maximum(big_align, field_align);
...@@ -3794,7 +3797,10 @@ pub const Type = extern union {...@@ -3794,7 +3797,10 @@ pub const Type = extern union {
3794 var big_align: u32 = 0;3797 var big_align: u32 = 0;
3795 var running_bits: u16 = 0;3798 var running_bits: u16 = 0;
3796 for (struct_obj.fields.values()) |field, i| {3799 for (struct_obj.fields.values()) |field, i| {
3797 if (!field.ty.hasCodeGenBits()) continue;3800 if (!field.ty.hasCodeGenBits()) {
3801 if (i == index) return offset;
3802 continue;
3803 }
37983804
3799 const field_align = field.packedAlignment();3805 const field_align = field.packedAlignment();
3800 if (field_align == 0) {3806 if (field_align == 0) {