| .text |
| .globl _Py_trampoline_func_start |
| # The following assembly is equivalent to: |
| # PyObject * |
| # trampoline(PyThreadState *ts, _PyInterpreterFrame *f, |
| # int throwflag, py_evaluator evaluator) |
| # { |
| # return evaluator(ts, f, throwflag); |
| # } |
| _Py_trampoline_func_start: |
| #ifdef __x86_64__ |
| #if defined(__CET__) && (__CET__ & 1) |
| endbr64 |
| #endif |
| sub $8, %rsp |
| call *%rcx |
| add $8, %rsp |
| ret |
| #endif // __x86_64__ |
| #if defined(__aarch64__) && defined(__AARCH64EL__) && !defined(__ILP32__) |
| // ARM64 little endian, 64bit ABI |
| // generate with aarch64-linux-gnu-gcc 12.1 |
| stp x29, x30, [sp, -16]! |
| mov x29, sp |
| blr x3 |
| ldp x29, x30, [sp], 16 |
| ret |
| #endif |
| .globl _Py_trampoline_func_end |
| _Py_trampoline_func_end: |
| .section .note.GNU-stack,"",@progbits |
| # Note for indicating the assembly code supports CET |
| #if defined(__x86_64__) && defined(__CET__) && (__CET__ & 1) |
| .section .note.gnu.property,"a" |
| .align 8 |
| .long 1f - 0f |
| .long 4f - 1f |
| .long 5 |
| 0: |
| .string "GNU" |
| 1: |
| .align 8 |
| .long 0xc0000002 |
| .long 3f - 2f |
| 2: |
| .long 0x3 |
| 3: |
| .align 8 |
| 4: |
| #endif // __x86_64__ |