| 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 | 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 | 9213 | return self.builder.buildTrunc(shifted_value, elem_llvm_ty, ""); |
| 9208 | 9214 | } |
| 9209 | 9215 | |
| ... | ... | @@ -9235,7 +9241,10 @@ pub const FuncGen = struct { |
| 9235 | 9241 | // Convert to equally-sized integer type in order to perform the bit |
| 9236 | 9242 | // operations on the value to store |
| 9237 | 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 | 9249 | var mask_val = value_bits_type.constAllOnes(); |
| 9241 | 9250 | mask_val = mask_val.constZExt(containing_int_ty); |
test/behavior.zig+1| ... | ... | @@ -86,6 +86,7 @@ test { |
| 86 | 86 | _ = @import("behavior/bugs/12430.zig"); |
| 87 | 87 | _ = @import("behavior/bugs/12486.zig"); |
| 88 | 88 | _ = @import("behavior/bugs/12680.zig"); |
| 89 | _ = @import("behavior/bugs/12776.zig"); | |
| 89 | 90 | _ = @import("behavior/byteswap.zig"); |
| 90 | 91 | _ = @import("behavior/byval_arg_var.zig"); |
| 91 | 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 | } |