Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion Makefile.pre.in
Original file line number Diff line number Diff line change
Expand Up @@ -3111,9 +3111,18 @@ config.status: $(srcdir)/configure

.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
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
#ifndef ASM_TRAMPOLINE_AARCH_64_H_
#define ASM_TRAMPOLINE_AARCH_64_H_

/*
* References:
* - https://developer.arm.com/documentation/101028/0012/5--Feature-test-macros
Expand Down Expand Up @@ -38,6 +35,31 @@
#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 */
Expand All @@ -52,5 +74,4 @@
.long 0; /* padding for 8 byte alignment */
.popsection; /* end the section */
#endif

#endif
#endif // __aarch64__ && __AARCH64EL__ && !__ILP32__
12 changes: 12 additions & 0 deletions Python/asm_trampoline_riscv64.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
.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
39 changes: 4 additions & 35 deletions Python/asm_trampoline.S → Python/asm_trampoline_x86_64.S
Original file line number Diff line number Diff line change
@@ -1,24 +1,12 @@
#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
Expand All @@ -27,26 +15,6 @@ _Py_trampoline_func_start:
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:
Expand All @@ -56,7 +24,7 @@ _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
Expand All @@ -73,4 +41,5 @@ _Py_trampoline_func_end:
3:
.align 8
4:
#endif
#endif // __x86_64__
23 changes: 20 additions & 3 deletions configure

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 21 additions & 4 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -3818,20 +3818,37 @@ AC_MSG_RESULT([$SHLIBS])
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]
)
AC_MSG_RESULT([$perf_trampoline])

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])

Expand Down
Loading