https://gcc.gnu.org/g:59a5fecfb260456dd60be687491717f3dbdb354f
commit r16-5502-g59a5fecfb260456dd60be687491717f3dbdb354f Author: Kees Cook <[email protected]> Date: Fri Nov 21 10:24:34 2025 -0800 aarch64: Extract aarch64_indirect_branch_asm for sibcall codegen Extract indirect branch assembly generation into a new function aarch64_indirect_branch_asm, paralleling the existing aarch64_indirect_call_asm function. Replace the open-coded versions in the sibcall patterns (*sibcall_insn and *sibcall_value_insn) so there is a common helper for indirect branches where things like SLS mitigation need to be handled. gcc/ChangeLog: * config/aarch64/aarch64-protos.h (aarch64_indirect_branch_asm): Declare. * config/aarch64/aarch64.cc (aarch64_indirect_branch_asm): New function to generate indirect branch with SLS barrier. * config/aarch64/aarch64.md (*sibcall_insn): Use aarch64_indirect_branch_asm. (*sibcall_value_insn): Likewise. Signed-off-by: Kees Cook <[email protected]> Diff: --- gcc/config/aarch64/aarch64-protos.h | 1 + gcc/config/aarch64/aarch64.cc | 12 ++++++++++++ gcc/config/aarch64/aarch64.md | 10 ++-------- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h index a9e407ba340e..68f28bdcae89 100644 --- a/gcc/config/aarch64/aarch64-protos.h +++ b/gcc/config/aarch64/aarch64-protos.h @@ -1272,6 +1272,7 @@ tree aarch64_resolve_overloaded_builtin_general (location_t, tree, void *); const char *aarch64_sls_barrier (int); const char *aarch64_indirect_call_asm (rtx); +extern const char *aarch64_indirect_branch_asm (rtx); extern bool aarch64_harden_sls_retbr_p (void); extern bool aarch64_harden_sls_blr_p (void); diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc index 6dfdaa4fb9b0..89097e237728 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -30822,6 +30822,18 @@ aarch64_indirect_call_asm (rtx addr) return ""; } +/* Generate assembly for AArch64 indirect branch instruction. ADDR is the + target address register. Returns any additional barrier instructions + needed for SLS (Straight Line Speculation) mitigation. */ + +const char * +aarch64_indirect_branch_asm (rtx addr) +{ + gcc_assert (REG_P (addr)); + output_asm_insn ("br\t%0", &addr); + return aarch64_sls_barrier (aarch64_harden_sls_retbr_p ()); +} + /* Emit the assembly instruction to load the thread pointer into DEST. Select between different tpidr_elN registers depending on -mtp= setting. */ diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index 855df791bae7..de6b1d0ed06b 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -1581,10 +1581,7 @@ "SIBLING_CALL_P (insn)" { if (which_alternative == 0) - { - output_asm_insn ("br\\t%0", operands); - return aarch64_sls_barrier (aarch64_harden_sls_retbr_p ()); - } + return aarch64_indirect_branch_asm (operands[0]); return "b\\t%c0"; } [(set_attr "type" "branch, branch") @@ -1601,10 +1598,7 @@ "SIBLING_CALL_P (insn)" { if (which_alternative == 0) - { - output_asm_insn ("br\\t%1", operands); - return aarch64_sls_barrier (aarch64_harden_sls_retbr_p ()); - } + return aarch64_indirect_branch_asm (operands[1]); return "b\\t%c1"; } [(set_attr "type" "branch, branch")
