]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-45116: Py_DEBUG ignores Py_ALWAYS_INLINE (GH-28419)
authorVictor Stinner <vstinner@python.org>
Fri, 17 Sep 2021 20:46:38 +0000 (22:46 +0200)
committerGitHub <noreply@github.com>
Fri, 17 Sep 2021 20:46:38 +0000 (22:46 +0200)
If the Py_DEBUG macro is defined, the Py_ALWAYS_INLINE macro does
nothing.

Doc/c-api/intro.rst
Include/pyport.h

index aac28b1e77561a6104f350b53e5c0aef7e775549..3e7890cb7664710dfc02704e54200b7f3e8f53dc 100644 (file)
@@ -124,6 +124,9 @@ complete listing.
    worse performances (due to increased code size for example). The compiler is
    usually smarter than the developer for the cost/benefit analysis.
 
+   If Python is :ref:`built in debug mode <debug-build>` (if the ``Py_DEBUG``
+   macro is defined), the :c:macro:`Py_ALWAYS_INLINE` macro does nothing.
+
    It must be specified before the function return type. Usage::
 
        static inline Py_ALWAYS_INLINE int random(void) { return 4; }
index af7fbe7fc71954aabc8e54f5f375c05bd340553c..d27d0838f1b2cb64646cb29fceb43b46a4094cf9 100644 (file)
@@ -568,10 +568,19 @@ extern "C" {
 // worse performances (due to increased code size for example). The compiler is
 // usually smarter than the developer for the cost/benefit analysis.
 //
+// If Python is built in debug mode (if the Py_DEBUG macro is defined), the
+// Py_ALWAYS_INLINE macro does nothing.
+//
 // It must be specified before the function return type. Usage:
 //
 //     static inline Py_ALWAYS_INLINE int random(void) { return 4; }
-#if defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER)
+#if defined(Py_DEBUG)
+   // If Python is built in debug mode, usually compiler optimizations are
+   // disabled. In this case, Py_ALWAYS_INLINE can increase a lot the stack
+   // memory usage. For example, forcing inlining using gcc -O0 increases the
+   // stack usage from 6 KB to 15 KB per Python function call.
+#  define Py_ALWAYS_INLINE
+#elif defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER)
 #  define Py_ALWAYS_INLINE __attribute__((always_inline))
 #elif defined(_MSC_VER)
 #  define Py_ALWAYS_INLINE __forceinline