| author | |
| committer | |
| log | c7e45aebafef0372fe231816eeffd18198240f14 |
| tree | 15ec0a8376e8f578df1a0c86b6931327a76f795f |
| parent | 44b9a1d031cb72cd64909b3a7bd0c65b2e16815b |
Closes #127763 files changed, 53 insertions(+), 1 deletions(-)
src/codegen/llvm.zig+10-1| ... | @@ -9204,6 +9204,12 @@ pub const FuncGen = struct { | ... | @@ -9204,6 +9204,12 @@ pub const FuncGen = struct { |
| 9204 | return self.builder.buildBitCast(truncated_int, elem_llvm_ty, ""); | 9204 | return self.builder.buildBitCast(truncated_int, elem_llvm_ty, ""); |
| 9205 | } | 9205 | } |
| 9206 | 9206 | ||
| 9207 | if (info.pointee_type.isPtrAtRuntime()) { | ||
| 9208 | const same_size_int = self.context.intType(elem_bits); | ||
| 9209 | const truncated_int = self.builder.buildTrunc(shifted_value, same_size_int, ""); | ||
| 9210 | return self.builder.buildIntToPtr(truncated_int, elem_llvm_ty, ""); | ||
| 9211 | } | ||
| 9212 | |||
| 9207 | return self.builder.buildTrunc(shifted_value, elem_llvm_ty, ""); | 9213 | return self.builder.buildTrunc(shifted_value, elem_llvm_ty, ""); |
| 9208 | } | 9214 | } |
| 9209 | 9215 | ||
| ... | @@ -9235,7 +9241,10 @@ pub const FuncGen = struct { | ... | @@ -9235,7 +9241,10 @@ pub const FuncGen = struct { |
| 9235 | // Convert to equally-sized integer type in order to perform the bit | 9241 | // Convert to equally-sized integer type in order to perform the bit |
| 9236 | // operations on the value to store | 9242 | // operations on the value to store |
| 9237 | const value_bits_type = self.context.intType(elem_bits); | 9243 | const value_bits_type = self.context.intType(elem_bits); |
| 9238 | const value_bits = self.builder.buildBitCast(elem, value_bits_type, ""); | 9244 | const value_bits = if (elem_ty.isPtrAtRuntime()) |
| 9245 | self.builder.buildPtrToInt(elem, value_bits_type, "") | ||
| 9246 | else | ||
| 9247 | self.builder.buildBitCast(elem, value_bits_type, ""); | ||
| 9239 | 9248 | ||
| 9240 | var mask_val = value_bits_type.constAllOnes(); | 9249 | var mask_val = value_bits_type.constAllOnes(); |
| 9241 | mask_val = mask_val.constZExt(containing_int_ty); | 9250 | mask_val = mask_val.constZExt(containing_int_ty); |
test/behavior.zig+1| ... | @@ -86,6 +86,7 @@ test { | ... | @@ -86,6 +86,7 @@ test { |
| 86 | _ = @import("behavior/bugs/12430.zig"); | 86 | _ = @import("behavior/bugs/12430.zig"); |
| 87 | _ = @import("behavior/bugs/12486.zig"); | 87 | _ = @import("behavior/bugs/12486.zig"); |
| 88 | _ = @import("behavior/bugs/12680.zig"); | 88 | _ = @import("behavior/bugs/12680.zig"); |
| 89 | _ = @import("behavior/bugs/12776.zig"); | ||
| 89 | _ = @import("behavior/byteswap.zig"); | 90 | _ = @import("behavior/byteswap.zig"); |
| 90 | _ = @import("behavior/byval_arg_var.zig"); | 91 | _ = @import("behavior/byval_arg_var.zig"); |
| 91 | _ = @import("behavior/call.zig"); | 92 | _ = @import("behavior/call.zig"); |
test/behavior/bugs/12776.zig created+42| ... | @@ -0,0 +1,42 @@ | ||
| 1 | const std = @import("std"); | ||
| 2 | const builtin = @import("builtin"); | ||
| 3 | |||
| 4 | const RAM = struct { | ||
| 5 | data: [0xFFFF + 1]u8, | ||
| 6 | fn new() !RAM { | ||
| 7 | return RAM{ .data = [_]u8{0} ** 0x10000 }; | ||
| 8 | } | ||
| 9 | fn get(self: *RAM, addr: u16) u8 { | ||
| 10 | return self.data[addr]; | ||
| 11 | } | ||
| 12 | }; | ||
| 13 | |||
| 14 | const CPU = packed struct { | ||
| 15 | interrupts: bool, | ||
| 16 | ram: *RAM, | ||
| 17 | fn new(ram: *RAM) !CPU { | ||
| 18 | return CPU{ | ||
| 19 | .ram = ram, | ||
| 20 | .interrupts = false, | ||
| 21 | }; | ||
| 22 | } | ||
| 23 | fn tick(self: *CPU) !void { | ||
| 24 | var queued_interrupts = self.ram.get(0xFFFF) & self.ram.get(0xFF0F); | ||
| 25 | if (self.interrupts and queued_interrupts != 0) { | ||
| 26 | self.interrupts = false; | ||
| 27 | } | ||
| 28 | } | ||
| 29 | }; | ||
| 30 | |||
| 31 | test { | ||
| 32 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | ||
| 33 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | ||
| 34 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; | ||
| 35 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; | ||
| 36 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; | ||
| 37 | |||
| 38 | var ram = try RAM.new(); | ||
| 39 | var cpu = try CPU.new(&ram); | ||
| 40 | try cpu.tick(); | ||
| 41 | try std.testing.expect(cpu.interrupts == false); | ||
| 42 | } | ||