diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2023-04-07 00:45:14 -0400 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2023-04-13 04:17:47 -0400 |
| commit | caa3d6a4f4413c1cace517b073476780168f24cf (patch) | |
| tree | be23d04a3bc5e236b6b962d0c7f000ed08bfb655 /src/codegen.zig | |
| parent | 3b22ce82643f2e547c85bf4b17477bc27133eb42 (diff) | |
| download | zig-caa3d6a4f4413c1cace517b073476780168f24cf.tar.gz zig-caa3d6a4f4413c1cace517b073476780168f24cf.zip | |
x86_64: fix constant pointers to zero-bit types
These non-dereferencable pointers still need to have the correct
alignment and non-null-ness.
Diffstat (limited to 'src/codegen.zig')
| -rw-r--r-- | src/codegen.zig | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index 57c33ad524..b322d336cd 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -966,7 +966,7 @@ fn genDeclRef( const module = bin_file.options.module.?; const decl = module.declPtr(decl_index); - if (decl.ty.zigTypeTag() != .Fn and !decl.ty.hasRuntimeBitsIgnoreComptime()) { + if (!decl.ty.isFnOrHasRuntimeBitsIgnoreComptime()) { const imm: u64 = switch (ptr_bytes) { 1 => 0xaa, 2 => 0xaaaa, @@ -978,10 +978,14 @@ fn genDeclRef( } // TODO this feels clunky. Perhaps we should check for it in `genTypedValue`? - if (tv.ty.zigTypeTag() == .Pointer) blk: { - if (tv.ty.castPtrToFn()) |_| break :blk; - if (!tv.ty.elemType2().hasRuntimeBits()) { - return GenResult.mcv(.none); + if (tv.ty.castPtrToFn()) |fn_ty| { + if (fn_ty.fnInfo().is_generic) { + return GenResult.mcv(.{ .immediate = fn_ty.abiAlignment(target) }); + } + } else if (tv.ty.zigTypeTag() == .Pointer) { + const elem_ty = tv.ty.elemType2(); + if (!elem_ty.hasRuntimeBits()) { + return GenResult.mcv(.{ .immediate = elem_ty.abiAlignment(target) }); } } |
