From fc7a0c4878dac2d721ec18cafe1b6bcff7faa771 Mon Sep 17 00:00:00 2001 From: Alex Rønne Petersen Date: Sat, 15 Feb 2025 02:44:58 +0100 Subject: Sema: Fix fnptr alignment safety checks to account for potential ISA tag. As seen on e.g. Arm/Thumb and MIPS (MIPS16/microMIPS). Fixes #22888. --- src/target.zig | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src/target.zig') diff --git a/src/target.zig b/src/target.zig index 8ccec7f7a8..d032b0d16e 100644 --- a/src/target.zig +++ b/src/target.zig @@ -626,6 +626,17 @@ pub fn supportsFunctionAlignment(target: std.Target) bool { }; } +pub fn functionPointerMask(target: std.Target) ?u64 { + // 32-bit Arm uses the LSB to mean that the target function contains Thumb code. + // MIPS uses the LSB to mean that the target function contains MIPS16/microMIPS code. + return if (target.cpu.arch.isArm() or target.cpu.arch.isMIPS32()) + ~@as(u32, 1) + else if (target.cpu.arch.isMIPS64()) + ~@as(u64, 1) + else + null; +} + pub fn supportsTailCall(target: std.Target, backend: std.builtin.CompilerBackend) bool { switch (backend) { .stage1, .stage2_llvm => return @import("codegen/llvm.zig").supportsTailCall(target), -- cgit v1.2.3