Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / compiler-rt / lib / xray / xray_trampoline_AArch64.S
blob6f10dda3602b5bc39bf8bea21b7b38ea5679b352
1 #include "../builtins/assembly.h"
2 #include "../sanitizer_common/sanitizer_asm.h"
4 .macro SAVE_REGISTERS
5   stp x1, x2, [sp, #-16]!
6   stp x3, x4, [sp, #-16]!
7   stp x5, x6, [sp, #-16]!
8   stp x7, x30, [sp, #-16]!
9   stp q0, q1, [sp, #-32]!
10   stp q2, q3, [sp, #-32]!
11   stp q4, q5, [sp, #-32]!
12   stp q6, q7, [sp, #-32]!
13   // x8 is the indirect result register and needs to be preserved for the body of the function to use.
14   stp x8, x0, [sp, #-16]!
15 .endm
17 .macro RESTORE_REGISTERS
18   ldp x8, x0, [sp], #16
19   ldp q6, q7, [sp], #32
20   ldp q4, q5, [sp], #32
21   ldp q2, q3, [sp], #32
22   ldp q0, q1, [sp], #32
23   ldp x7, x30, [sp], #16
24   ldp x5, x6, [sp], #16
25   ldp x3, x4, [sp], #16
26   ldp x1, x2, [sp], #16
27 .endm
29 .text
30 .p2align 2
31 .global ASM_SYMBOL(__xray_FunctionEntry)
32 ASM_HIDDEN(__xray_FunctionEntry)
33 ASM_TYPE_FUNCTION(__xray_FunctionEntry)
34 ASM_SYMBOL(__xray_FunctionEntry):
35     /* Move the return address beyond the end of sled data. The 12 bytes of
36          data are inserted in the code of the runtime patch, between the call
37          instruction and the instruction returned into. The data contains 32
38          bits of instrumented function ID and 64 bits of the address of
39          the current trampoline. */
40   add x30, x30, #12
41   // Push the registers which may be modified by the handler function.
42   SAVE_REGISTERS
44   // Load the handler function pointer.
45   adrp x2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)
46   ldr x2, [x2, #:lo12:ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)]
47   cbz x2, 1f
48   // Set w0 to the function ID (w17). Set x1 to XRayEntryType::ENTRY = 0.
49   mov w0, w17
50   mov x1, #0
51   // Call the handler with 2 parameters.
52   blr x2
54   RESTORE_REGISTERS
55   ret
56 ASM_SIZE(__xray_FunctionEntry)
58 .p2align 2
59 .global ASM_SYMBOL(__xray_FunctionExit)
60 ASM_HIDDEN(__xray_FunctionExit)
61 ASM_TYPE_FUNCTION(__xray_FunctionExit)
62 ASM_SYMBOL(__xray_FunctionExit):
63     /* Move the return address beyond the end of sled data. The 12 bytes of
64          data are inserted in the code of the runtime patch, between the call
65          instruction and the instruction returned into. The data contains 32
66          bits of instrumented function ID and 64 bits of the address of
67          the current trampoline. */
68   add x30, x30, #12
69   SAVE_REGISTERS
71   // Load the handler function pointer into x2.
72   adrp x2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)
73   ldr x2, [x2, #:lo12:ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)]
74   cbz x2, 1f
75   // Set w0 to the function ID (w17). Set x1 to XRayEntryType::EXIT = 1.
76   mov w0, w17
77   mov x1, #1
78   // Call the handler with 2 parameters.
79   blr x2
81   RESTORE_REGISTERS
82   ret
83 ASM_SIZE(__xray_FunctionExit)
85 .p2align 2
86 .global ASM_SYMBOL(__xray_FunctionTailExit)
87 ASM_HIDDEN(__xray_FunctionTailExit)
88 ASM_TYPE_FUNCTION(__xray_FunctionTailExit)
89 ASM_SYMBOL(__xray_FunctionTailExit):
90     /* Move the return address beyond the end of sled data. The 12 bytes of
91          data are inserted in the code of the runtime patch, between the call
92          instruction and the instruction returned into. The data contains 32
93          bits of instrumented function ID and 64 bits of the address of
94          the current trampoline. */
95   add x30, x30, #12
96   // Save the registers which may be modified by the handler function.
97   SAVE_REGISTERS
98   // Load the handler function pointer into x2.
99   adrp x2, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)
100   ldr x2, [x2, #:lo12:ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)]
101   cbz x2, 1f
102   // Set w0 to the function ID (w17). Set x1 to XRayEntryType::TAIL = 2.
103   mov w0, w17
104   mov x1, #2
105   // Call the handler with 2 parameters.
106   blr x2
108   RESTORE_REGISTERS
109   ret
110 ASM_SIZE(__xray_FunctionTailExit)
112 .p2align 2
113 .global ASM_SYMBOL(__xray_ArgLoggerEntry)
114 ASM_HIDDEN(__xray_ArgLoggerEntry)
115 ASM_TYPE_FUNCTION(__xray_ArgLoggerEntry)
116 ASM_SYMBOL(__xray_ArgLoggerEntry):
117   add x30, x30, #12
118   // Push the registers which may be modified by the handler function.
119   SAVE_REGISTERS
121   adrp x8, ASM_SYMBOL(_ZN6__xray13XRayArgLoggerE)
122   ldr x8, [x8, #:lo12:ASM_SYMBOL(_ZN6__xray13XRayArgLoggerE)]
123   cbnz x8, 2f
125   // Load the handler function pointer.
126   adrp x8, ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)
127   ldr x8, [x8, #:lo12:ASM_SYMBOL(_ZN6__xray19XRayPatchedFunctionE)]
128   cbz x8, 1f
131   mov x2, x0
132   mov x1, #3  // XRayEntryType::LOG_ARGS_ENTRY
133   mov w0, w17
134   blr x8
137   RESTORE_REGISTERS
138   ret
139 ASM_SIZE(__xray_ArgLoggerEntry)
141 .global ASM_SYMBOL(__xray_CustomEvent)
142 ASM_HIDDEN(__xray_CustomEvent)
143 ASM_TYPE_FUNCTION(__xray_CustomEvent)
144 ASM_SYMBOL(__xray_CustomEvent):
145   SAVE_REGISTERS
146   adrp x8, ASM_SYMBOL(_ZN6__xray22XRayPatchedCustomEventE)
147   ldr x8, [x8, #:lo12:ASM_SYMBOL(_ZN6__xray22XRayPatchedCustomEventE)]
148   cbz x8, 1f
149   blr x8
151   RESTORE_REGISTERS
152   ret
153 ASM_SIZE(__xray_CustomEvent)
155 .global ASM_SYMBOL(__xray_TypedEvent)
156 ASM_HIDDEN(__xray_TypedEvent)
157 ASM_TYPE_FUNCTION(__xray_TypedEvent)
158 ASM_SYMBOL(__xray_TypedEvent):
159   SAVE_REGISTERS
160   adrp x8, ASM_SYMBOL(_ZN6__xray21XRayPatchedTypedEventE)
161   ldr x8, [x8, #:lo12:ASM_SYMBOL(_ZN6__xray21XRayPatchedTypedEventE)]
162   cbz x8, 1f
163   blr x8
165   RESTORE_REGISTERS
166   ret
167 ASM_SIZE(__xray_TypedEvent)
169 NO_EXEC_STACK_DIRECTIVE