[llvm] [BOLT][AArch64] Fixed indirect call instrumentation snippet (PR #141918)

YongKang Zhu via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 6 11:07:57 PST 2025


================
@@ -2418,39 +2424,69 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
                                                      MCSymbol *HandlerFuncAddr,
                                                      int CallSiteID,
                                                      MCContext *Ctx) override {
-    InstructionListType Insts;
     // Code sequence used to enter indirect call instrumentation helper:
-    //   stp x0, x1, [sp, #-16]! createPushRegisters
+    //   stp x0, x1, [sp, #-16]! createPushRegisters  (1)
     //   mov target x0  convertIndirectCallToLoad -> orr x0 target xzr
     //   mov x1 CallSiteID createLoadImmediate ->
     //   movk    x1, #0x0, lsl #48
     //   movk    x1, #0x0, lsl #32
     //   movk    x1, #0x0, lsl #16
     //   movk    x1, #0x0
-    //   stp x0, x1, [sp, #-16]!
-    //   bl *HandlerFuncAddr createIndirectCall ->
+    //   stp x0, x1, [sp, #-16]!    (2)
     //   adr x0 *HandlerFuncAddr -> adrp + add
-    //   blr x0
+    //   str x30, [sp, #-16]!  (3)
+    //   blr x0   (__bolt_instr_ind_call_handler_func)
+    //   ldr x30, sp, #16      (3)
+    //   ldp x0, x1, [sp], #16   (2)
+    //   mov x0, x0  ; move target address to used register
----------------
yozhu wrote:

These two instructions, `ldp x0, x1, [sp], #16` followed by `mov xN, x0`, can be replaced with one instruction `ldr xN, [sp], #16`, since `x0` and `x1` will be loaded again from stack anyway, and here we just need to pop stack getting the original indirect call target into `xN`.

https://github.com/llvm/llvm-project/pull/141918


More information about the llvm-commits mailing list