authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-13 02:24:41-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-15 03:07:51-04:00
log57c38f6433c8024d1946bcf1b5b7d0892fc751a7
treef5e338f3f13c91420b112c9ff39f8128335c2806
parent2cbd442a9df16ab2d13d03041631f516269c9f64

x86_64: implement global payload pointers


3 files changed, 35 insertions(+), 8 deletions(-)

src/arch/x86_64/CodeGen.zig+5-2
...@@ -3467,14 +3467,17 @@ fn airOptionalPayloadPtrSet(self: *Self, inst: Air.Inst.Index) !void {...@@ -3467,14 +3467,17 @@ fn airOptionalPayloadPtrSet(self: *Self, inst: Air.Inst.Index) !void {
3467 try self.copyToRegisterWithInstTracking(inst, dst_ty, src_mcv);3467 try self.copyToRegisterWithInstTracking(inst, dst_ty, src_mcv);
3468 }3468 }
34693469
3470 const dst_mcv = if (src_mcv.isRegister() and self.reuseOperand(inst, ty_op.operand, 0, src_mcv))3470 const dst_mcv: MCValue = if (src_mcv.isRegister() and
3471 self.reuseOperand(inst, ty_op.operand, 0, src_mcv))
3471 src_mcv3472 src_mcv
3473 else if (self.liveness.isUnused(inst))
3474 .{ .register = try self.copyToTmpRegister(dst_ty, src_mcv) }
3472 else3475 else
3473 try self.copyToRegisterWithInstTracking(inst, dst_ty, src_mcv);3476 try self.copyToRegisterWithInstTracking(inst, dst_ty, src_mcv);
34743477
3475 const pl_ty = dst_ty.childType();3478 const pl_ty = dst_ty.childType();
3476 const pl_abi_size = @intCast(i32, pl_ty.abiSize(self.target.*));3479 const pl_abi_size = @intCast(i32, pl_ty.abiSize(self.target.*));
3477 try self.genSetMem(.{ .reg = dst_mcv.register }, pl_abi_size, Type.bool, .{ .immediate = 1 });3480 try self.genSetMem(.{ .reg = dst_mcv.getReg().? }, pl_abi_size, Type.bool, .{ .immediate = 1 });
3478 break :result if (self.liveness.isUnused(inst)) .unreach else dst_mcv;3481 break :result if (self.liveness.isUnused(inst)) .unreach else dst_mcv;
3479 };3482 };
3480 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });3483 return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });
src/codegen.zig+30-4
...@@ -380,7 +380,7 @@ pub fn generateSymbol(...@@ -380,7 +380,7 @@ pub fn generateSymbol(
380380
381 return Result.ok;381 return Result.ok;
382 },382 },
383 .field_ptr, .elem_ptr => return lowerParentPtr(383 .field_ptr, .elem_ptr, .opt_payload_ptr => return lowerParentPtr(
384 bin_file,384 bin_file,
385 src_loc,385 src_loc,
386 typed_value,386 typed_value,
...@@ -812,7 +812,6 @@ fn lowerParentPtr(...@@ -812,7 +812,6 @@ fn lowerParentPtr(
812 reloc_info: RelocInfo,812 reloc_info: RelocInfo,
813) CodeGenError!Result {813) CodeGenError!Result {
814 const target = bin_file.options.target;814 const target = bin_file.options.target;
815
816 switch (parent_ptr.tag()) {815 switch (parent_ptr.tag()) {
817 .field_ptr => {816 .field_ptr => {
818 const field_ptr = parent_ptr.castTag(.field_ptr).?.data;817 const field_ptr = parent_ptr.castTag(.field_ptr).?.data;
...@@ -858,6 +857,31 @@ fn lowerParentPtr(...@@ -858,6 +857,31 @@ fn lowerParentPtr(
858 reloc_info.offset(@intCast(u32, elem_ptr.index * elem_ptr.elem_ty.abiSize(target))),857 reloc_info.offset(@intCast(u32, elem_ptr.index * elem_ptr.elem_ty.abiSize(target))),
859 );858 );
860 },859 },
860 .opt_payload_ptr => {
861 const opt_payload_ptr = parent_ptr.castTag(.opt_payload_ptr).?.data;
862 return lowerParentPtr(
863 bin_file,
864 src_loc,
865 typed_value,
866 opt_payload_ptr.container_ptr,
867 code,
868 debug_output,
869 reloc_info,
870 );
871 },
872 .eu_payload_ptr => {
873 const eu_payload_ptr = parent_ptr.castTag(.eu_payload_ptr).?.data;
874 const pl_ty = eu_payload_ptr.container_ty.errorUnionPayload();
875 return lowerParentPtr(
876 bin_file,
877 src_loc,
878 typed_value,
879 eu_payload_ptr.container_ptr,
880 code,
881 debug_output,
882 reloc_info.offset(@intCast(u32, errUnionPayloadOffset(pl_ty, target))),
883 );
884 },
861 .variable, .decl_ref, .decl_ref_mut => |tag| return lowerDeclRef(885 .variable, .decl_ref, .decl_ref_mut => |tag| return lowerDeclRef(
862 bin_file,886 bin_file,
863 src_loc,887 src_loc,
...@@ -1262,9 +1286,10 @@ pub fn genTypedValue(...@@ -1262,9 +1286,10 @@ pub fn genTypedValue(
1262}1286}
12631287
1264pub fn errUnionPayloadOffset(payload_ty: Type, target: std.Target) u64 {1288pub fn errUnionPayloadOffset(payload_ty: Type, target: std.Target) u64 {
1289 if (!payload_ty.hasRuntimeBitsIgnoreComptime()) return 0;
1265 const payload_align = payload_ty.abiAlignment(target);1290 const payload_align = payload_ty.abiAlignment(target);
1266 const error_align = Type.anyerror.abiAlignment(target);1291 const error_align = Type.anyerror.abiAlignment(target);
1267 if (payload_align >= error_align) {1292 if (payload_align >= error_align or !payload_ty.hasRuntimeBitsIgnoreComptime()) {
1268 return 0;1293 return 0;
1269 } else {1294 } else {
1270 return mem.alignForwardGeneric(u64, Type.anyerror.abiSize(target), payload_align);1295 return mem.alignForwardGeneric(u64, Type.anyerror.abiSize(target), payload_align);
...@@ -1272,9 +1297,10 @@ pub fn errUnionPayloadOffset(payload_ty: Type, target: std.Target) u64 {...@@ -1272,9 +1297,10 @@ pub fn errUnionPayloadOffset(payload_ty: Type, target: std.Target) u64 {
1272}1297}
12731298
1274pub fn errUnionErrorOffset(payload_ty: Type, target: std.Target) u64 {1299pub fn errUnionErrorOffset(payload_ty: Type, target: std.Target) u64 {
1300 if (!payload_ty.hasRuntimeBitsIgnoreComptime()) return 0;
1275 const payload_align = payload_ty.abiAlignment(target);1301 const payload_align = payload_ty.abiAlignment(target);
1276 const error_align = Type.anyerror.abiAlignment(target);1302 const error_align = Type.anyerror.abiAlignment(target);
1277 if (payload_align >= error_align) {1303 if (payload_align >= error_align and payload_ty.hasRuntimeBitsIgnoreComptime()) {
1278 return mem.alignForwardGeneric(u64, payload_ty.abiSize(target), error_align);1304 return mem.alignForwardGeneric(u64, payload_ty.abiSize(target), error_align);
1279 } else {1305 } else {
1280 return 0;1306 return 0;
test/behavior/optional.zig-2
...@@ -74,7 +74,6 @@ test "optional with void type" {...@@ -74,7 +74,6 @@ test "optional with void type" {
74test "address of unwrap optional" {74test "address of unwrap optional" {
75 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;75 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
76 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO76 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
77 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
78 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO77 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
79 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;78 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
8079
...@@ -365,7 +364,6 @@ test "optional pointer to zero bit optional payload" {...@@ -365,7 +364,6 @@ test "optional pointer to zero bit optional payload" {
365}364}
366365
367test "optional pointer to zero bit error union payload" {366test "optional pointer to zero bit error union payload" {
368 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
369 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO367 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
370 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO368 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
371 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO369 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO