]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
aarch64: Extract aarch64_indirect_branch_asm for sibcall codegen
authorKees Cook <kees@kernel.org>
Fri, 21 Nov 2025 18:24:34 +0000 (10:24 -0800)
committerAndrew Pinski <andrew.pinski@oss.qualcomm.com>
Sat, 22 Nov 2025 03:27:24 +0000 (19:27 -0800)
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 <kees@kernel.org>
gcc/config/aarch64/aarch64-protos.h
gcc/config/aarch64/aarch64.cc
gcc/config/aarch64/aarch64.md

index a9e407ba340ee1dd85c0a9aef351a70f29a25543..68f28bdcae89f777af9c4e854ef1b61ec9d83a1d 100644 (file)
@@ -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);
 
index 6dfdaa4fb9b0ba3eb49545591a1b05428b1e25b3..89097e237728cf0ab5d23988ca5a6d5162eb7932 100644 (file)
@@ -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.  */
 
index 855df791bae7b2a11922153bb0d683c2213fddad..de6b1d0ed06bd68b058b6963c0015ff54328b766 100644 (file)
   "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")
   "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")