https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116597
Bug ID: 116597 Summary: [arm] indirect tailcalls with incomplete prototypes generate wrong code when using PACM Product: gcc Version: 14.0 Status: UNCONFIRMED Keywords: wrong-code Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: rearnsha at gcc dot gnu.org Target Milestone: --- void (*f)(); // Or void (*f)(int, ...}; void g () { return f (1, 2, 3, 4); } when compiled with -mcpu=cortex-m85 -O2 -mbranch-protection=pac+leaf Generates: ... aut ip, lr, sp bx ip that is, it tries to jump to the result of the authentication, rather than the indirect function call. The issue is that without a full prototype we fail to detect that all the parameter passing registers have been used and assume that one of them can be used for the tailcall address. In reality, that doesn't happen and the compiler then tries to allocate IP for the address, even though that will eventually be clobbered by the AUT instruction. The problem also exists on gcc-13, but that requires an additional change (the fix for PR113780