authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-02-11 15:04:59+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-02-16 14:13:06+01:00
logc7775a9f628a7fa971e85dec65e1400866ad012c
tree705334e82a02795cea34628feeeff10128a63327
parent5283a52af565521094bcd1186efc179b4be7ee8c

x64: impl genBinMathOpMir for ptr_stack_off and PIE memory


2 files changed, 11 insertions(+), 8 deletions(-)

src/arch/x86_64/CodeGen.zig+11-5
......@@ -2244,7 +2244,9 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC
22442244 .none => unreachable,
22452245 .undef => try self.genSetReg(dst_ty, dst_reg, .undef),
22462246 .dead, .unreach => unreachable,
2247 .ptr_stack_offset => unreachable,
2247 .ptr_stack_offset => |off| {
2248 return self.genBinMathOpMir(mir_tag, dst_ty, dst_mcv, .{ .immediate = @bitCast(u32, off) });
2249 },
22482250 .ptr_embedded_in_code => unreachable,
22492251 .register => |src_reg| {
22502252 _ = try self.addInst(.{
......@@ -2265,16 +2267,17 @@ fn genBinMathOpMir(self: *Self, mir_tag: Mir.Inst.Tag, dst_ty: Type, dst_mcv: MC
22652267 .data = .{ .imm = @truncate(u32, imm) },
22662268 });
22672269 },
2268 .embedded_in_code, .memory => {
2270 .embedded_in_code,
2271 .memory,
2272 .got_load,
2273 .direct_load,
2274 => {
22692275 assert(abi_size <= 8);
22702276 self.register_manager.freezeRegs(&.{dst_reg});
22712277 defer self.register_manager.unfreezeRegs(&.{dst_reg});
22722278 const reg = try self.copyToTmpRegister(dst_ty, src_mcv);
22732279 return self.genBinMathOpMir(mir_tag, dst_ty, dst_mcv, .{ .register = reg });
22742280 },
2275 .got_load, .direct_load => {
2276 return self.fail("TODO implement x86 ADD/SUB/CMP source symbol at index in linker", .{});
2277 },
22782281 .stack_offset => |off| {
22792282 if (off > math.maxInt(i32)) {
22802283 return self.fail("stack offset too large", .{});
......@@ -4620,6 +4623,9 @@ fn genTypedValue(self: *Self, typed_value: TypedValue) InnerError!MCValue {
46204623 }
46214624
46224625 switch (typed_value.ty.zigTypeTag()) {
4626 .Array => {
4627 return self.lowerUnnamedConst(typed_value);
4628 },
46234629 .Pointer => switch (typed_value.ty.ptrSize()) {
46244630 .Slice => {
46254631 return self.lowerUnnamedConst(typed_value);
test/behavior/slice.zig-3
......@@ -29,7 +29,6 @@ comptime {
2929test "slicing" {
3030 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
3131 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
32 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
3332 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
3433
3534 var array: [20]i32 = undefined;
......@@ -223,7 +222,6 @@ test "compile time slice of pointer to hard coded address" {
223222test "slice string literal has correct type" {
224223 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
225224 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
226 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
227225
228226 comptime {
229227 try expect(@TypeOf("aoeu"[0..]) == *const [4:0]u8);
......@@ -365,7 +363,6 @@ test "empty array to slice" {
365363test "@ptrCast slice to pointer" {
366364 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
367365 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
368 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
369366
370367 const S = struct {
371368 fn doTheTest() !void {