mirror of
https://github.com/python/cpython.git
synced 2025-10-21 22:22:48 +00:00
bpo-45094: Add Py_NO_INLINE macro (GH-28140)
* Rename _Py_NO_INLINE macro to Py_NO_INLINE: make it public and document it. * Sort macros in the C API documentation.
This commit is contained in:
parent
be9de8721d
commit
7974c30b9f
8 changed files with 87 additions and 76 deletions
|
@ -105,6 +105,71 @@ defined closer to where they are useful (e.g. :c:macro:`Py_RETURN_NONE`).
|
||||||
Others of a more general utility are defined here. This is not necessarily a
|
Others of a more general utility are defined here. This is not necessarily a
|
||||||
complete listing.
|
complete listing.
|
||||||
|
|
||||||
|
.. c:macro:: Py_ABS(x)
|
||||||
|
|
||||||
|
Return the absolute value of ``x``.
|
||||||
|
|
||||||
|
.. versionadded:: 3.3
|
||||||
|
|
||||||
|
.. c:macro:: Py_CHARMASK(c)
|
||||||
|
|
||||||
|
Argument must be a character or an integer in the range [-128, 127] or [0,
|
||||||
|
255]. This macro returns ``c`` cast to an ``unsigned char``.
|
||||||
|
|
||||||
|
.. c:macro:: Py_DEPRECATED(version)
|
||||||
|
|
||||||
|
Use this for deprecated declarations. The macro must be placed before the
|
||||||
|
symbol name.
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void);
|
||||||
|
|
||||||
|
.. versionchanged:: 3.8
|
||||||
|
MSVC support was added.
|
||||||
|
|
||||||
|
.. c:macro:: Py_GETENV(s)
|
||||||
|
|
||||||
|
Like ``getenv(s)``, but returns ``NULL`` if :option:`-E` was passed on the
|
||||||
|
command line (i.e. if ``Py_IgnoreEnvironmentFlag`` is set).
|
||||||
|
|
||||||
|
.. c:macro:: Py_MAX(x, y)
|
||||||
|
|
||||||
|
Return the maximum value between ``x`` and ``y``.
|
||||||
|
|
||||||
|
.. versionadded:: 3.3
|
||||||
|
|
||||||
|
.. c:macro:: Py_MEMBER_SIZE(type, member)
|
||||||
|
|
||||||
|
Return the size of a structure (``type``) ``member`` in bytes.
|
||||||
|
|
||||||
|
.. versionadded:: 3.6
|
||||||
|
|
||||||
|
.. c:macro:: Py_MIN(x, y)
|
||||||
|
|
||||||
|
Return the minimum value between ``x`` and ``y``.
|
||||||
|
|
||||||
|
.. versionadded:: 3.3
|
||||||
|
|
||||||
|
.. c:macro:: Py_NO_INLINE
|
||||||
|
|
||||||
|
Disable inlining on a function. For example, it reduces the C stack
|
||||||
|
consumption: useful on LTO+PGO builds which heavily inline code (see
|
||||||
|
:issue:`33720`).
|
||||||
|
|
||||||
|
Usage::
|
||||||
|
|
||||||
|
Py_NO_INLINE static int random(void) { return 4; }
|
||||||
|
|
||||||
|
.. versionadded:: 3.11
|
||||||
|
|
||||||
|
.. c:macro:: Py_STRINGIFY(x)
|
||||||
|
|
||||||
|
Convert ``x`` to a C string. E.g. ``Py_STRINGIFY(123)`` returns
|
||||||
|
``"123"``.
|
||||||
|
|
||||||
|
.. versionadded:: 3.4
|
||||||
|
|
||||||
.. c:macro:: Py_UNREACHABLE()
|
.. c:macro:: Py_UNREACHABLE()
|
||||||
|
|
||||||
Use this when you have a code path that cannot be reached by design.
|
Use this when you have a code path that cannot be reached by design.
|
||||||
|
@ -127,47 +192,6 @@ complete listing.
|
||||||
|
|
||||||
.. versionadded:: 3.7
|
.. versionadded:: 3.7
|
||||||
|
|
||||||
.. c:macro:: Py_ABS(x)
|
|
||||||
|
|
||||||
Return the absolute value of ``x``.
|
|
||||||
|
|
||||||
.. versionadded:: 3.3
|
|
||||||
|
|
||||||
.. c:macro:: Py_MIN(x, y)
|
|
||||||
|
|
||||||
Return the minimum value between ``x`` and ``y``.
|
|
||||||
|
|
||||||
.. versionadded:: 3.3
|
|
||||||
|
|
||||||
.. c:macro:: Py_MAX(x, y)
|
|
||||||
|
|
||||||
Return the maximum value between ``x`` and ``y``.
|
|
||||||
|
|
||||||
.. versionadded:: 3.3
|
|
||||||
|
|
||||||
.. c:macro:: Py_STRINGIFY(x)
|
|
||||||
|
|
||||||
Convert ``x`` to a C string. E.g. ``Py_STRINGIFY(123)`` returns
|
|
||||||
``"123"``.
|
|
||||||
|
|
||||||
.. versionadded:: 3.4
|
|
||||||
|
|
||||||
.. c:macro:: Py_MEMBER_SIZE(type, member)
|
|
||||||
|
|
||||||
Return the size of a structure (``type``) ``member`` in bytes.
|
|
||||||
|
|
||||||
.. versionadded:: 3.6
|
|
||||||
|
|
||||||
.. c:macro:: Py_CHARMASK(c)
|
|
||||||
|
|
||||||
Argument must be a character or an integer in the range [-128, 127] or [0,
|
|
||||||
255]. This macro returns ``c`` cast to an ``unsigned char``.
|
|
||||||
|
|
||||||
.. c:macro:: Py_GETENV(s)
|
|
||||||
|
|
||||||
Like ``getenv(s)``, but returns ``NULL`` if :option:`-E` was passed on the
|
|
||||||
command line (i.e. if ``Py_IgnoreEnvironmentFlag`` is set).
|
|
||||||
|
|
||||||
.. c:macro:: Py_UNUSED(arg)
|
.. c:macro:: Py_UNUSED(arg)
|
||||||
|
|
||||||
Use this for unused arguments in a function definition to silence compiler
|
Use this for unused arguments in a function definition to silence compiler
|
||||||
|
@ -175,18 +199,6 @@ complete listing.
|
||||||
|
|
||||||
.. versionadded:: 3.4
|
.. versionadded:: 3.4
|
||||||
|
|
||||||
.. c:macro:: Py_DEPRECATED(version)
|
|
||||||
|
|
||||||
Use this for deprecated declarations. The macro must be placed before the
|
|
||||||
symbol name.
|
|
||||||
|
|
||||||
Example::
|
|
||||||
|
|
||||||
Py_DEPRECATED(3.8) PyAPI_FUNC(int) Py_OldFunction(void);
|
|
||||||
|
|
||||||
.. versionchanged:: 3.8
|
|
||||||
MSVC support was added.
|
|
||||||
|
|
||||||
.. c:macro:: PyDoc_STRVAR(name, str)
|
.. c:macro:: PyDoc_STRVAR(name, str)
|
||||||
|
|
||||||
Creates a variable with name ``name`` that can be used in docstrings.
|
Creates a variable with name ``name`` that can be used in docstrings.
|
||||||
|
@ -221,6 +233,7 @@ complete listing.
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
.. _api-objects:
|
.. _api-objects:
|
||||||
|
|
||||||
Objects, Types and Reference Counts
|
Objects, Types and Reference Counts
|
||||||
|
|
|
@ -163,12 +163,7 @@ PyAPI_FUNC(void) _Py_set_387controlword(unsigned short);
|
||||||
#pragma float_control(push)
|
#pragma float_control(push)
|
||||||
#pragma float_control(precise, on)
|
#pragma float_control(precise, on)
|
||||||
#pragma float_control(except, on)
|
#pragma float_control(except, on)
|
||||||
#if defined(_MSC_VER)
|
Py_NO_INLINE static double __icc_nan()
|
||||||
__declspec(noinline)
|
|
||||||
#else /* Linux */
|
|
||||||
__attribute__((noinline))
|
|
||||||
#endif /* _MSC_VER */
|
|
||||||
static double __icc_nan()
|
|
||||||
{
|
{
|
||||||
return sqrt(-1.0);
|
return sqrt(-1.0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -557,19 +557,20 @@ extern "C" {
|
||||||
#define _Py_HOT_FUNCTION
|
#define _Py_HOT_FUNCTION
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* _Py_NO_INLINE
|
// Py_NO_INLINE
|
||||||
* Disable inlining on a function. For example, it helps to reduce the C stack
|
// Disable inlining on a function. For example, it reduces the C stack
|
||||||
* consumption.
|
// consumption: useful on LTO+PGO builds which heavily inline code (see
|
||||||
*
|
// bpo-33720).
|
||||||
* Usage:
|
//
|
||||||
* int _Py_NO_INLINE x(void) { return 3; }
|
// Usage:
|
||||||
*/
|
//
|
||||||
#if defined(_MSC_VER)
|
// Py_NO_INLINE static int random(void) { return 4; }
|
||||||
# define _Py_NO_INLINE __declspec(noinline)
|
#if defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER)
|
||||||
#elif defined(__GNUC__) || defined(__clang__)
|
# define Py_NO_INLINE __attribute__ ((noinline))
|
||||||
# define _Py_NO_INLINE __attribute__ ((noinline))
|
#elif defined(_MSC_VER)
|
||||||
|
# define Py_NO_INLINE __declspec(noinline)
|
||||||
#else
|
#else
|
||||||
# define _Py_NO_INLINE
|
# define Py_NO_INLINE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Add the :c:macro:`Py_NO_INLINE` macro to disable inlining on a function.
|
||||||
|
Patch by Victor Stinner.
|
|
@ -186,7 +186,7 @@ partial_dealloc(partialobject *pto)
|
||||||
/* Merging keyword arguments using the vectorcall convention is messy, so
|
/* Merging keyword arguments using the vectorcall convention is messy, so
|
||||||
* if we would need to do that, we stop using vectorcall and fall back
|
* if we would need to do that, we stop using vectorcall and fall back
|
||||||
* to using partial_call() instead. */
|
* to using partial_call() instead. */
|
||||||
_Py_NO_INLINE static PyObject *
|
Py_NO_INLINE static PyObject *
|
||||||
partial_vectorcall_fallback(PyThreadState *tstate, partialobject *pto,
|
partial_vectorcall_fallback(PyThreadState *tstate, partialobject *pto,
|
||||||
PyObject *const *args, size_t nargsf,
|
PyObject *const *args, size_t nargsf,
|
||||||
PyObject *kwnames)
|
PyObject *kwnames)
|
||||||
|
|
|
@ -176,7 +176,7 @@ resize_buffer(bytesio *self, size_t size)
|
||||||
object. Returns the number of bytes written, or -1 on error.
|
object. Returns the number of bytes written, or -1 on error.
|
||||||
Inlining is disabled because it's significantly decreases performance
|
Inlining is disabled because it's significantly decreases performance
|
||||||
of writelines() in PGO build. */
|
of writelines() in PGO build. */
|
||||||
_Py_NO_INLINE static Py_ssize_t
|
Py_NO_INLINE static Py_ssize_t
|
||||||
write_bytes(bytesio *self, PyObject *b)
|
write_bytes(bytesio *self, PyObject *b)
|
||||||
{
|
{
|
||||||
if (check_closed(self)) {
|
if (check_closed(self)) {
|
||||||
|
|
|
@ -451,7 +451,7 @@ reset_signal_handlers(const sigset_t *child_sigmask)
|
||||||
* If vfork-unsafe functionality is desired after vfork(), consider using
|
* If vfork-unsafe functionality is desired after vfork(), consider using
|
||||||
* syscall() to obtain it.
|
* syscall() to obtain it.
|
||||||
*/
|
*/
|
||||||
_Py_NO_INLINE static void
|
Py_NO_INLINE static void
|
||||||
child_exec(char *const exec_array[],
|
child_exec(char *const exec_array[],
|
||||||
char *const argv[],
|
char *const argv[],
|
||||||
char *const envp[],
|
char *const envp[],
|
||||||
|
@ -650,7 +650,7 @@ error:
|
||||||
* child_exec() should not be inlined to avoid spurious -Wclobber warnings from
|
* child_exec() should not be inlined to avoid spurious -Wclobber warnings from
|
||||||
* GCC (see bpo-35823).
|
* GCC (see bpo-35823).
|
||||||
*/
|
*/
|
||||||
_Py_NO_INLINE static pid_t
|
Py_NO_INLINE static pid_t
|
||||||
do_fork_exec(char *const exec_array[],
|
do_fork_exec(char *const exec_array[],
|
||||||
char *const argv[],
|
char *const argv[],
|
||||||
char *const envp[],
|
char *const envp[],
|
||||||
|
|
|
@ -891,7 +891,7 @@ r_float_bin(RFILE *p)
|
||||||
|
|
||||||
/* Issue #33720: Disable inlining for reducing the C stack consumption
|
/* Issue #33720: Disable inlining for reducing the C stack consumption
|
||||||
on PGO builds. */
|
on PGO builds. */
|
||||||
_Py_NO_INLINE static double
|
Py_NO_INLINE static double
|
||||||
r_float_str(RFILE *p)
|
r_float_str(RFILE *p)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue