- ``-fno-omit-frame-pointer`` and/or ``-mno-omit-leaf-frame-pointer``
are added when the compiler supports them.
- - ``-marm`` is added on 32-bit ARM when supported,
+ - ``-marm`` and/or ``-mno-thumb`` is added on 32-bit ARM when supported,
- on s390x platforms, when supported, ``-mbackchain`` is added *instead*.
of the above frame pointer flags.
Frame pointers enable profilers, debuggers, and system tracing tools
(``perf``, ``eBPF``, ``dtrace``, ``gdb``) to walk the C call stack
- without DWARF metadata.
- The flags propagate to third-party C
+ without DWARF metadata. The flags propagate to third-party C
extensions through :mod:`sysconfig`. On compilers that do not
understand them, the build silently skips them.
# define FRAME_POINTER_NEXT_OFFSET 0
# define FRAME_POINTER_RETURN_OFFSET \
(S390X_FRAME_RETURN_ADDRESS_OFFSET / (Py_ssize_t)sizeof(uintptr_t))
+#elif defined(__powerpc64__) || defined(__ppc64__)
+// ppc64le puts the return address at fp[2]; it saves the Condition Register
+// in fp[1]. See:
+// https://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html#STACK
+# define FRAME_POINTER_NEXT_OFFSET 0
+# define FRAME_POINTER_RETURN_OFFSET 2
#else
# define FRAME_POINTER_NEXT_OFFSET 0
# define FRAME_POINTER_RETURN_OFFSET 1
case $host_cpu in #(
arm|armv*) :
- { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -marm" >&5
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -marm" >&5
printf %s "checking whether C compiler accepts -marm... " >&6; }
if test ${ax_cv_check_cflags__Werror__marm+y}
then :
frame_pointer_cflags="$frame_pointer_cflags -marm"
+else case e in #(
+ e) : ;;
+esac
+fi
+
+ { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mno-thumb" >&5
+printf %s "checking whether C compiler accepts -mno-thumb... " >&6; }
+if test ${ax_cv_check_cflags__Werror__mno_thumb+y}
+then :
+ printf %s "(cached) " >&6
+else case e in #(
+ e)
+ ax_check_save_flags=$CFLAGS
+ CFLAGS="$CFLAGS -Werror -mno-thumb"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main (void)
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"
+then :
+ ax_cv_check_cflags__Werror__mno_thumb=yes
+else case e in #(
+ e) ax_cv_check_cflags__Werror__mno_thumb=no ;;
+esac
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext
+ CFLAGS=$ax_check_save_flags ;;
+esac
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror__mno_thumb" >&5
+printf "%s\n" "$ax_cv_check_cflags__Werror__mno_thumb" >&6; }
+if test "x$ax_cv_check_cflags__Werror__mno_thumb" = xyes
+then :
+
+ frame_pointer_cflags="$frame_pointer_cflags -mno-thumb"
+
else case e in #(
e) : ;;
esac
frame_pointer_cflags="$frame_pointer_cflags -mno-omit-leaf-frame-pointer"
], [], [-Werror])
AS_CASE([$host_cpu], [arm|armv*], [
+ dnl GCC uses "-marm"; clang uses "-mno-thumb"
AX_CHECK_COMPILE_FLAG([-marm], [
frame_pointer_cflags="$frame_pointer_cflags -marm"
], [], [-Werror])
+ AX_CHECK_COMPILE_FLAG([-mno-thumb], [
+ frame_pointer_cflags="$frame_pointer_cflags -mno-thumb"
+ ], [], [-Werror])
])
AS_CASE([$host_cpu], [s390*], [
AX_CHECK_COMPILE_FLAG([-mbackchain], [