aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2023-04-07 00:45:14 -0400
committerJacob Young <jacobly0@users.noreply.github.com>2023-04-13 04:17:47 -0400
commitcaa3d6a4f4413c1cace517b073476780168f24cf (patch)
treebe23d04a3bc5e236b6b962d0c7f000ed08bfb655 /src/codegen.zig
parent3b22ce82643f2e547c85bf4b17477bc27133eb42 (diff)
downloadzig-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.zig14
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) });
}
}