bpo-45116: Py_DEBUG ignores Py_ALWAYS_INLINE (GH-28419)

If the Py_DEBUG macro is defined, the Py_ALWAYS_INLINE macro does
nothing.
This commit is contained in:
Victor Stinner 2021-09-17 22:46:38 +02:00 committed by GitHub
parent 51ebb7f4f5
commit e4044e9f89
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 1 deletions

View file

@ -124,6 +124,9 @@ complete listing.
worse performances (due to increased code size for example). The compiler is worse performances (due to increased code size for example). The compiler is
usually smarter than the developer for the cost/benefit analysis. 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:: It must be specified before the function return type. Usage::
static inline Py_ALWAYS_INLINE int random(void) { return 4; } static inline Py_ALWAYS_INLINE int random(void) { return 4; }

View file

@ -568,10 +568,19 @@ extern "C" {
// worse performances (due to increased code size for example). The compiler is // worse performances (due to increased code size for example). The compiler is
// usually smarter than the developer for the cost/benefit analysis. // 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: // It must be specified before the function return type. Usage:
// //
// static inline Py_ALWAYS_INLINE int random(void) { return 4; } // 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)) # define Py_ALWAYS_INLINE __attribute__((always_inline))
#elif defined(_MSC_VER) #elif defined(_MSC_VER)
# define Py_ALWAYS_INLINE __forceinline # define Py_ALWAYS_INLINE __forceinline