)]}'
{
  "commit": "ad605bdad7bb36bc74b9fa5f8b3786081dac4ec6",
  "tree": "fa4f3d01ec6827d83c3854379bd3c08a846e605d",
  "parents": [
    "d39f5243f8df23392e1c493f7d607cd0074222b9"
  ],
  "author": {
    "name": "Alexey Moksyakov",
    "email": "moksyakov.alexey@huawei.com",
    "time": "Thu Nov 27 23:48:10 2025 +0300"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Thu Nov 27 23:48:10 2025 +0300"
  },
  "message": "[bolt][aarch64] Change indirect call instrumentation snippet\n\nIndirect call instrumentation snippet uses x16 register in exit\nhandler to go to destination target\n\n    __bolt_instr_ind_call_handler_func:\n            msr  nzcv, x1\n            ldp  x0, x1, [sp], llvm#16\n            ldr  x16, [sp], llvm#16\n            ldp  x0, x1, [sp], llvm#16\n            br   x16\t\u003c-----\n\nThis patch adds the instrumentation snippet by calling instrumentation\nruntime library through indirect call instruction and adding the wrapper\nto store/load target value and the register for original indirect instruction.\n\nExample:\n            mov x16, foo\n\n    infirectCall:\n            adrp x8, Label\n            add  x8, x8, #:lo12:Label\n            blr x8\n\nBefore:\n\n    Instrumented indirect call:\n            stp     x0, x1, [sp, #-16]!\n            mov     x0, x8\n            movk    x1, #0x0, lsl llvm#48\n            movk    x1, #0x0, lsl llvm#32\n            movk    x1, #0x0, lsl llvm#16\n            movk    x1, #0x0\n            stp     x0, x1, [sp, #-16]!\n            adrp    x0, __bolt_instr_ind_call_handler_func\n            add     x0, x0, #:lo12:__bolt_instr_ind_call_handler_func\n            blr     x0\n\n    __bolt_instr_ind_call_handler:  (exit snippet)\n            msr     nzcv, x1\n            ldp     x0, x1, [sp], llvm#16\n            ldr     x16, [sp], llvm#16\n            ldp     x0, x1, [sp], llvm#16\n            br      x16    \u003c- overwrites the original value in X16\n\n    __bolt_instr_ind_call_handler_func:  (entry snippet)\n            stp     x0, x1, [sp, #-16]!\n            mrs     x1, nzcv\n            adrp    x0, __bolt_instr_ind_call_handler\n            add     x0, x0, x0, #:lo12:__bolt_instr_ind_call_handler\n            ldr     x0, [x0]\n            cmp     x0, #0x0\n            b.eq    __bolt_instr_ind_call_handler\n            str     x30, [sp, #-16]!\n            blr     x0     \u003c--- runtime lib store/load all regs\n            ldr     x30, [sp], llvm#16\n            b       __bolt_instr_ind_call_handler\n\n_________________________________________________________________________\n\nAfter:\n\n            mov     x16, foo\n    infirectCall:\n            adrp    x8, Label\n            add     x8, x8, #:lo12:Label\n            blr     x8\n\n    Instrumented indirect call:\n            stp     x0, x1, [sp, #-16]!\n            mov     x0, x8\n            movk    x1, #0x0, lsl llvm#48\n            movk    x1, #0x0, lsl llvm#32\n            movk    x1, #0x0, lsl llvm#16\n            movk    x1, #0x0\n            stp     x0, x30, [sp, #-16]!\n            adrp    x8, __bolt_instr_ind_call_handler_func\n            add     x8, x8, #:lo12:__bolt_instr_ind_call_handler_func\n            blr     x8       \u003c--- call trampoline instr lib\n            ldp     x0, x30, [sp], llvm#16\n            mov     x8, x0   \u003c---- restore original target\n            ldp     x0, x1, [sp], llvm#16\n            blr     x8       \u003c--- original indirect call instruction\n\n    // don\u0027t touch regs besides x0, x1\n    __bolt_instr_ind_call_handler:  (exit snippet)\n            ret     \u003c---- return to original function with indirect call\n\n    __bolt_instr_ind_call_handler_func: (entry snippet)\n            adrp    x0, __bolt_instr_ind_call_handler\n            add     x0, x0, #:lo12:__bolt_instr_ind_call_handler\n            ldr     x0, [x0]\n            cmp     x0, #0x0\n            b.eq    __bolt_instr_ind_call_handler\n            str     x30, [sp, #-16]!\n            blr     x0     \u003c--- runtime lib store/load all regs\n            ldr     x30, [sp], llvm#16\n            b       __bolt_instr_ind_call_handler\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "a318ef0b6bd680fba34361831c3c1cff2e589ba6",
      "old_mode": 33188,
      "old_path": "bolt/include/bolt/Core/MCPlusBuilder.h",
      "new_id": "c8f4e2aa8c580764c5fe3e9c236260278c30176e",
      "new_mode": 33188,
      "new_path": "bolt/include/bolt/Core/MCPlusBuilder.h"
    },
    {
      "type": "modify",
      "old_id": "150461b020f065261552bfdd374ff8c39fa392a8",
      "old_mode": 33188,
      "old_path": "bolt/lib/Passes/Instrumentation.cpp",
      "new_id": "10479f35d8f9d41d13ec0e26abc31052cb1f5125",
      "new_mode": 33188,
      "new_path": "bolt/lib/Passes/Instrumentation.cpp"
    },
    {
      "type": "modify",
      "old_id": "af87d5c12b5cebe854a5483c50aa92ac7e91eaae",
      "old_mode": 33188,
      "old_path": "bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp",
      "new_id": "dc7644fbabdcfe7f1675257e1dbb7aa5fd583629",
      "new_mode": 33188,
      "new_path": "bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp"
    },
    {
      "type": "modify",
      "old_id": "f586db2b0f9baf29318dd82ba8c36fe40f98272b",
      "old_mode": 33188,
      "old_path": "bolt/runtime/instr.cpp",
      "new_id": "634ade6bdd4079b04ce164e9c8be5761735f7265",
      "new_mode": 33188,
      "new_path": "bolt/runtime/instr.cpp"
    },
    {
      "type": "modify",
      "old_id": "b1d04f9d558e0862bfe9aad9f7437f45666dec75",
      "old_mode": 33188,
      "old_path": "bolt/runtime/sys_aarch64.h",
      "new_id": "9cb8e022f58df2db5f40241d9b755886615710e8",
      "new_mode": 33188,
      "new_path": "bolt/runtime/sys_aarch64.h"
    },
    {
      "type": "modify",
      "old_id": "f9056da333b4e88723a32669cc03b102ddb45f07",
      "old_mode": 33188,
      "old_path": "bolt/test/runtime/AArch64/instrumentation-ind-call.c",
      "new_id": "eddecba4d8b52e055a70e8268ea3ef0c1e6c5071",
      "new_mode": 33188,
      "new_path": "bolt/test/runtime/AArch64/instrumentation-ind-call.c"
    }
  ]
}
