From 1bbca4f9350ffd7ebbfc5c54a307f54d448f5929 Mon Sep 17 00:00:00 2001 From: Veikka Tuominen Date: Sun, 27 Feb 2022 12:15:49 +0200 Subject: [PATCH] stage2: fix bitcast to optional ptr in llvm backend; omit safety check for intToPtr on optional ptr --- lib/std/os/linux.zig | 12 +++++++++--- src/codegen/llvm.zig | 2 +- src/type.zig | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 95f6222e97..7232bcfcd2 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -865,13 +865,19 @@ pub fn flock(fd: fd_t, operation: i32) usize { return syscall2(.flock, @bitCast(usize, @as(isize, fd)), @bitCast(usize, @as(isize, operation))); } -var vdso_clock_gettime = @ptrCast(?*const anyopaque, init_vdso_clock_gettime); +var vdso_clock_gettime = if (builtin.zig_backend == .stage1) + @ptrCast(?*const anyopaque, init_vdso_clock_gettime) +else + @ptrCast(?*const anyopaque, &init_vdso_clock_gettime); // We must follow the C calling convention when we call into the VDSO -const vdso_clock_gettime_ty = fn (i32, *timespec) callconv(.C) usize; +const vdso_clock_gettime_ty = if (builtin.zig_backend == .stage1) + fn (i32, *timespec) callconv(.C) usize +else + *const fn (i32, *timespec) callconv(.C) usize; pub fn clock_gettime(clk_id: i32, tp: *timespec) usize { - if (@hasDecl(VDSO, "CGT_SYM") and builtin.zig_backend == .stage1) { + if (@hasDecl(VDSO, "CGT_SYM")) { const ptr = @atomicLoad(?*const anyopaque, &vdso_clock_gettime, .Unordered); if (ptr) |fn_ptr| { const f = @ptrCast(vdso_clock_gettime_ty, fn_ptr); diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index c0642a59de..e349f0186e 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -3892,7 +3892,7 @@ pub const FuncGen = struct { return self.builder.buildBitCast(operand, llvm_dest_ty.pointerType(0), ""); } - if (operand_ty.zigTypeTag() == .Int and inst_ty.zigTypeTag() == .Pointer) { + if (operand_ty.zigTypeTag() == .Int and inst_ty.isPtrAtRuntime()) { return self.builder.buildIntToPtr(operand, llvm_dest_ty, ""); } diff --git a/src/type.zig b/src/type.zig index 68085500bc..a84a0f4520 100644 --- a/src/type.zig +++ b/src/type.zig @@ -2602,7 +2602,7 @@ pub const Type = extern union { const payload = self.castTag(.pointer).?.data; return payload.@"allowzero"; }, - else => false, + else => return self.zigTypeTag() == .Optional, }; }