.PRECIOUS: config.status $(BUILDPYTHON) Makefile Makefile.pre
-Python/asm_trampoline.o: $(srcdir)/Python/asm_trampoline.S
+Python/asm_trampoline_x86_64.o: $(srcdir)/Python/asm_trampoline_x86_64.S
$(CC) -c $(PY_CORE_CFLAGS) -o $@ $<
+Python/asm_trampoline_aarch64.o: $(srcdir)/Python/asm_trampoline_aarch64.S
+ $(CC) -c $(PY_CORE_CFLAGS) -o $@ $<
+
+Python/asm_trampoline_riscv64.o: $(srcdir)/Python/asm_trampoline_riscv64.S
+ $(CC) -c $(PY_CORE_CFLAGS) -o $@ $<
+
+Python/asm_trampoline_universal2.o: Python/asm_trampoline_aarch64.o Python/asm_trampoline_x86_64.o
+ lipo -create -output $@ Python/asm_trampoline_aarch64.o Python/asm_trampoline_x86_64.o
+
Python/emscripten_trampoline_inner.wasm: $(srcdir)/Python/emscripten_trampoline_inner.c
# emcc has a path that ends with emsdk/upstream/emscripten/emcc, we're looking for emsdk/upstream/bin/clang.
$$(dirname $$(dirname $(CC)))/bin/clang -o $@ $< -mgc -O2 -Wl,--no-entry -Wl,--import-table -Wl,--import-memory -target wasm32-unknown-unknown -nostdlib
-#ifndef ASM_TRAMPOLINE_AARCH_64_H_
-#define ASM_TRAMPOLINE_AARCH_64_H_
-
/*
* References:
* - https://developer.arm.com/documentation/101028/0012/5--Feature-test-macros
#define GNU_PROPERTY_AARCH64_GCS 0
#endif
+ .text
+#if defined(__aarch64__) && defined(__AARCH64EL__) && !defined(__ILP32__)
+#if defined(__APPLE__)
+ .globl __Py_trampoline_func_start
+__Py_trampoline_func_start:
+#else
+ .globl _Py_trampoline_func_start
+_Py_trampoline_func_start:
+#endif
+ SIGN_LR
+ stp x29, x30, [sp, -16]!
+ mov x29, sp
+ blr x3
+ ldp x29, x30, [sp], 16
+ VERIFY_LR
+ ret
+#if defined(__APPLE__)
+ .globl __Py_trampoline_func_end
+__Py_trampoline_func_end:
+#else
+ .globl _Py_trampoline_func_end
+_Py_trampoline_func_end:
+ .section .note.GNU-stack,"",@progbits
+#endif
+
/* Add the BTI, PAC and GCS support to GNU Notes section */
#if GNU_PROPERTY_AARCH64_BTI != 0 || GNU_PROPERTY_AARCH64_POINTER_AUTH != 0 || GNU_PROPERTY_AARCH64_GCS != 0
.pushsection .note.gnu.property, "a"; /* Start a new allocatable section */
.long 0; /* padding for 8 byte alignment */
.popsection; /* end the section */
#endif
-
-#endif
+#endif // __aarch64__ && __AARCH64EL__ && !__ILP32__
--- /dev/null
+ .text
+ .globl _Py_trampoline_func_start
+_Py_trampoline_func_start:
+ addi sp,sp,-16
+ sd ra,8(sp)
+ jalr a3
+ ld ra,8(sp)
+ addi sp,sp,16
+ jr ra
+ .globl _Py_trampoline_func_end
+_Py_trampoline_func_end:
+ .section .note.GNU-stack,"",@progbits
-#include "asm_trampoline_aarch64.h"
-
.text
+#ifdef __x86_64__
#if defined(__APPLE__)
.globl __Py_trampoline_func_start
-#else
- .globl _Py_trampoline_func_start
-#endif
-# The following assembly is equivalent to:
-# PyObject *
-# trampoline(PyThreadState *ts, _PyInterpreterFrame *f,
-# int throwflag, py_evaluator evaluator)
-# {
-# return evaluator(ts, f, throwflag);
-# }
-#if defined(__APPLE__)
__Py_trampoline_func_start:
#else
+ .globl _Py_trampoline_func_start
_Py_trampoline_func_start:
#endif
-#ifdef __x86_64__
#if defined(__CET__) && (__CET__ & 1)
endbr64
#endif
call *%rcx
pop %rbp
ret
-#endif // __x86_64__
-#if defined(__aarch64__) && defined(__AARCH64EL__) && !defined(__ILP32__)
- // ARM64 little endian, 64bit ABI
- // generate with aarch64-linux-gnu-gcc 12.1
- SIGN_LR
- stp x29, x30, [sp, -16]!
- mov x29, sp
- blr x3
- ldp x29, x30, [sp], 16
- VERIFY_LR
- ret
-#endif
-#ifdef __riscv
- addi sp,sp,-16
- sd ra,8(sp)
- jalr a3
- ld ra,8(sp)
- addi sp,sp,16
- jr ra
-#endif
#if defined(__APPLE__)
.globl __Py_trampoline_func_end
__Py_trampoline_func_end:
.section .note.GNU-stack,"",@progbits
#endif
# Note for indicating the assembly code supports CET
-#if defined(__x86_64__) && defined(__CET__) && (__CET__ & 1)
+#if defined(__CET__) && (__CET__ & 1)
.section .note.gnu.property,"a"
.align 8
.long 1f - 0f
3:
.align 8
4:
+#endif
#endif // __x86_64__
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking perf trampoline" >&5
printf %s "checking perf trampoline... " >&6; }
+PERF_TRAMPOLINE_OBJ=""
case $PLATFORM_TRIPLET in #(
x86_64-linux-gnu) :
- perf_trampoline=yes ;; #(
+ perf_trampoline=yes
+ PERF_TRAMPOLINE_OBJ=Python/asm_trampoline_x86_64.o ;; #(
aarch64-linux-gnu) :
- perf_trampoline=yes ;; #(
+ perf_trampoline=yes
+ PERF_TRAMPOLINE_OBJ=Python/asm_trampoline_aarch64.o ;; #(
darwin) :
case $MACOSX_DEPLOYMENT_TARGET in #(
10.[0-9]|10.1[0-1]) :
perf_trampoline=no ;; #(
*) :
perf_trampoline=yes
+ if test "${enable_universalsdk}" && test "$UNIVERSAL_ARCHS" = "universal2"; then
+ PERF_TRAMPOLINE_OBJ=Python/asm_trampoline_universal2.o
+ else
+ case "$host_cpu" in
+ x86_64)
+ PERF_TRAMPOLINE_OBJ=Python/asm_trampoline_x86_64.o
+ ;;
+ aarch64|arm64)
+ PERF_TRAMPOLINE_OBJ=Python/asm_trampoline_aarch64.o
+ ;;
+ *)
+ perf_trampoline=no
+ ;;
+ esac
+ fi
;;
esac ;; #(
*) :
printf "%s\n" "#define PY_HAVE_PERF_TRAMPOLINE 1" >>confdefs.h
- PERF_TRAMPOLINE_OBJ=Python/asm_trampoline.o
fi
dnl perf trampoline is Linux and macOS specific and requires an arch-specific
dnl trampoline in assembly.
AC_MSG_CHECKING([perf trampoline])
+PERF_TRAMPOLINE_OBJ=""
AS_CASE([$PLATFORM_TRIPLET],
- [x86_64-linux-gnu], [perf_trampoline=yes],
- [aarch64-linux-gnu], [perf_trampoline=yes],
+ [x86_64-linux-gnu], [perf_trampoline=yes
+ PERF_TRAMPOLINE_OBJ=Python/asm_trampoline_x86_64.o],
+ [aarch64-linux-gnu], [perf_trampoline=yes
+ PERF_TRAMPOLINE_OBJ=Python/asm_trampoline_aarch64.o],
[darwin], [AS_CASE([$MACOSX_DEPLOYMENT_TARGET],
[[10.[0-9]|10.1[0-1]]], [perf_trampoline=no],
- [perf_trampoline=yes]
+ [perf_trampoline=yes
+ if test "${enable_universalsdk}" && test "$UNIVERSAL_ARCHS" = "universal2"; then
+ PERF_TRAMPOLINE_OBJ=Python/asm_trampoline_universal2.o
+ else
+ case "$host_cpu" in
+ x86_64)
+ PERF_TRAMPOLINE_OBJ=Python/asm_trampoline_x86_64.o
+ ;;
+ aarch64|arm64)
+ PERF_TRAMPOLINE_OBJ=Python/asm_trampoline_aarch64.o
+ ;;
+ *)
+ perf_trampoline=no
+ ;;
+ esac
+ fi]
)],
[perf_trampoline=no]
)
AS_VAR_IF([perf_trampoline], [yes], [
AC_DEFINE([PY_HAVE_PERF_TRAMPOLINE], [1], [Define to 1 if you have the perf trampoline.])
- PERF_TRAMPOLINE_OBJ=Python/asm_trampoline.o
])
AC_SUBST([PERF_TRAMPOLINE_OBJ])