[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