mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 07:46:41 +00:00

This patch implements support for `-fxray-shared` on AArch64 and fixes a remaining issue in the previous PR #114431. A bug in the XRay `CMakeLists.txt` caused the XRay assembly sources to be built for every architecture in `XRAY_DSO_SUPPORTED_ARCH` on Apple. This led to the compiler trying to compile AArch64 assembly for X86 targets and vice versa. This is addressed here by ensuring that assembly sources are only built for the matching architecture (see fixup commit). **Original PR description:** This patch adds support for `-fxray-shared` on AArch64. This feature, introduced in #113548 for x86_64, enables the instrumentation of shared libraries with XRay. Changes: - Adds AArch64 to the list of targets supporting `-fxray-shared` - Introduces PIC versions of the AArch64 XRay trampolines - Adjusts relevant XRay tests
174 lines
4.9 KiB
ArmAsm
174 lines
4.9 KiB
ArmAsm
#include "../builtins/assembly.h"
|
|
#include "../sanitizer_common/sanitizer_asm.h"
|
|
|
|
.macro SAVE_REGISTERS
|
|
stp x1, x2, [sp, #-16]!
|
|
stp x3, x4, [sp, #-16]!
|
|
stp x5, x6, [sp, #-16]!
|
|
stp x7, x30, [sp, #-16]!
|
|
stp q0, q1, [sp, #-32]!
|
|
stp q2, q3, [sp, #-32]!
|
|
stp q4, q5, [sp, #-32]!
|
|
stp q6, q7, [sp, #-32]!
|
|
// x8 is the indirect result register and needs to be preserved for the body of the function to use.
|
|
stp x8, x0, [sp, #-16]!
|
|
.endm
|
|
|
|
.macro RESTORE_REGISTERS
|
|
ldp x8, x0, [sp], #16
|
|
ldp q6, q7, [sp], #32
|
|
ldp q4, q5, [sp], #32
|
|
ldp q2, q3, [sp], #32
|
|
ldp q0, q1, [sp], #32
|
|
ldp x7, x30, [sp], #16
|
|
ldp x5, x6, [sp], #16
|
|
ldp x3, x4, [sp], #16
|
|
ldp x1, x2, [sp], #16
|
|
.endm
|
|
|
|
.macro LOAD_HANDLER_ADDR reg handler
|
|
#if !defined(XRAY_PIC)
|
|
adrp \reg, ASM_SYMBOL(\handler)
|
|
ldr \reg, [\reg, :lo12:ASM_SYMBOL(\handler)]
|
|
#else
|
|
adrp \reg, :got:ASM_SYMBOL(\handler)
|
|
ldr \reg, [\reg, :got_lo12:ASM_SYMBOL(\handler)]
|
|
ldr \reg, [\reg]
|
|
#endif
|
|
.endm
|
|
|
|
.text
|
|
.p2align 2
|
|
.global ASM_SYMBOL(__xray_FunctionEntry)
|
|
ASM_HIDDEN(__xray_FunctionEntry)
|
|
ASM_TYPE_FUNCTION(__xray_FunctionEntry)
|
|
ASM_SYMBOL(__xray_FunctionEntry):
|
|
/* Move the return address beyond the end of sled data. The 12 bytes of
|
|
data are inserted in the code of the runtime patch, between the call
|
|
instruction and the instruction returned into. The data contains 32
|
|
bits of instrumented function ID and 64 bits of the address of
|
|
the current trampoline. */
|
|
add x30, x30, #12
|
|
// Push the registers which may be modified by the handler function.
|
|
SAVE_REGISTERS
|
|
|
|
// Load the handler function pointer.
|
|
LOAD_HANDLER_ADDR x2, _ZN6__xray19XRayPatchedFunctionE
|
|
cbz x2, 1f
|
|
// Set w0 to the function ID (w17). Set x1 to XRayEntryType::ENTRY = 0.
|
|
mov w0, w17
|
|
mov x1, #0
|
|
// Call the handler with 2 parameters.
|
|
blr x2
|
|
1:
|
|
RESTORE_REGISTERS
|
|
ret
|
|
ASM_SIZE(__xray_FunctionEntry)
|
|
|
|
.p2align 2
|
|
.global ASM_SYMBOL(__xray_FunctionExit)
|
|
ASM_HIDDEN(__xray_FunctionExit)
|
|
ASM_TYPE_FUNCTION(__xray_FunctionExit)
|
|
ASM_SYMBOL(__xray_FunctionExit):
|
|
/* Move the return address beyond the end of sled data. The 12 bytes of
|
|
data are inserted in the code of the runtime patch, between the call
|
|
instruction and the instruction returned into. The data contains 32
|
|
bits of instrumented function ID and 64 bits of the address of
|
|
the current trampoline. */
|
|
add x30, x30, #12
|
|
SAVE_REGISTERS
|
|
|
|
// Load the handler function pointer into x2.
|
|
LOAD_HANDLER_ADDR x2, _ZN6__xray19XRayPatchedFunctionE
|
|
cbz x2, 1f
|
|
// Set w0 to the function ID (w17). Set x1 to XRayEntryType::EXIT = 1.
|
|
mov w0, w17
|
|
mov x1, #1
|
|
// Call the handler with 2 parameters.
|
|
blr x2
|
|
1:
|
|
RESTORE_REGISTERS
|
|
ret
|
|
ASM_SIZE(__xray_FunctionExit)
|
|
|
|
.p2align 2
|
|
.global ASM_SYMBOL(__xray_FunctionTailExit)
|
|
ASM_HIDDEN(__xray_FunctionTailExit)
|
|
ASM_TYPE_FUNCTION(__xray_FunctionTailExit)
|
|
ASM_SYMBOL(__xray_FunctionTailExit):
|
|
/* Move the return address beyond the end of sled data. The 12 bytes of
|
|
data are inserted in the code of the runtime patch, between the call
|
|
instruction and the instruction returned into. The data contains 32
|
|
bits of instrumented function ID and 64 bits of the address of
|
|
the current trampoline. */
|
|
add x30, x30, #12
|
|
// Save the registers which may be modified by the handler function.
|
|
SAVE_REGISTERS
|
|
// Load the handler function pointer into x2.
|
|
LOAD_HANDLER_ADDR x2, _ZN6__xray19XRayPatchedFunctionE
|
|
cbz x2, 1f
|
|
// Set w0 to the function ID (w17). Set x1 to XRayEntryType::TAIL = 2.
|
|
mov w0, w17
|
|
mov x1, #2
|
|
// Call the handler with 2 parameters.
|
|
blr x2
|
|
1:
|
|
RESTORE_REGISTERS
|
|
ret
|
|
ASM_SIZE(__xray_FunctionTailExit)
|
|
|
|
.p2align 2
|
|
.global ASM_SYMBOL(__xray_ArgLoggerEntry)
|
|
ASM_HIDDEN(__xray_ArgLoggerEntry)
|
|
ASM_TYPE_FUNCTION(__xray_ArgLoggerEntry)
|
|
ASM_SYMBOL(__xray_ArgLoggerEntry):
|
|
add x30, x30, #12
|
|
// Push the registers which may be modified by the handler function.
|
|
SAVE_REGISTERS
|
|
|
|
LOAD_HANDLER_ADDR x8, _ZN6__xray13XRayArgLoggerE
|
|
cbnz x8, 2f
|
|
|
|
// Load the handler function pointer.
|
|
LOAD_HANDLER_ADDR x8, _ZN6__xray19XRayPatchedFunctionE
|
|
cbz x8, 1f
|
|
|
|
2:
|
|
mov x2, x0
|
|
mov x1, #3 // XRayEntryType::LOG_ARGS_ENTRY
|
|
mov w0, w17
|
|
blr x8
|
|
|
|
1:
|
|
RESTORE_REGISTERS
|
|
ret
|
|
ASM_SIZE(__xray_ArgLoggerEntry)
|
|
|
|
// __xray_*Event have default visibility so that they can be referenced by user
|
|
// DSOs that do not link against the runtime.
|
|
.global ASM_SYMBOL(__xray_CustomEvent)
|
|
ASM_TYPE_FUNCTION(__xray_CustomEvent)
|
|
ASM_SYMBOL(__xray_CustomEvent):
|
|
SAVE_REGISTERS
|
|
LOAD_HANDLER_ADDR x8, _ZN6__xray22XRayPatchedCustomEventE
|
|
cbz x8, 1f
|
|
blr x8
|
|
1:
|
|
RESTORE_REGISTERS
|
|
ret
|
|
ASM_SIZE(__xray_CustomEvent)
|
|
|
|
.global ASM_SYMBOL(__xray_TypedEvent)
|
|
ASM_TYPE_FUNCTION(__xray_TypedEvent)
|
|
ASM_SYMBOL(__xray_TypedEvent):
|
|
SAVE_REGISTERS
|
|
LOAD_HANDLER_ADDR x8, _ZN6__xray21XRayPatchedTypedEventE
|
|
cbz x8, 1f
|
|
blr x8
|
|
1:
|
|
RESTORE_REGISTERS
|
|
ret
|
|
ASM_SIZE(__xray_TypedEvent)
|
|
|
|
NO_EXEC_STACK_DIRECTIVE
|