mirror of
https://github.com/python/cpython.git
synced 2026-06-08 02:41:11 +00:00
GH-126910: Make _Py_get_machine_stack_pointer return the actual stack pointer (GH-149103)
* Make _Py_ReachedRecursionLimit inline again * Remove _Py_MakeRecCheck replacing its use with _Py_ReachedRecursionLimit * Move the check for C stack swtiching into _Py_CheckRecursiveCall
This commit is contained in:
parent
d8a97cb65c
commit
a6793662e7
6 changed files with 33 additions and 51 deletions
|
|
@ -49,20 +49,6 @@ _Py_ReachedRecursionLimitWithMargin(PyThreadState *tstate, int margin_count)
|
|||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
_Py_EnterRecursiveCallUnchecked(PyThreadState *tstate)
|
||||
{
|
||||
uintptr_t here_addr = _Py_get_machine_stack_pointer();
|
||||
_PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
|
||||
#if _Py_STACK_GROWS_DOWN
|
||||
if (here_addr < _tstate->c_stack_hard_limit) {
|
||||
#else
|
||||
if (here_addr > _tstate->c_stack_hard_limit) {
|
||||
#endif
|
||||
Py_FatalError("Unchecked stack overflow.");
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(__s390x__)
|
||||
# define Py_C_STACK_SIZE 320000
|
||||
#elif defined(_WIN32)
|
||||
|
|
@ -278,7 +264,7 @@ PyUnstable_ThreadState_ResetStackProtection(PyThreadState *tstate)
|
|||
|
||||
|
||||
/* The function _Py_EnterRecursiveCallTstate() only calls _Py_CheckRecursiveCall()
|
||||
if the stack pointer is between the stack base and c_stack_hard_limit. */
|
||||
if the stack pointer is beyond c_stack_soft_limit. */
|
||||
int
|
||||
_Py_CheckRecursiveCall(PyThreadState *tstate, const char *where)
|
||||
{
|
||||
|
|
@ -287,16 +273,21 @@ _Py_CheckRecursiveCall(PyThreadState *tstate, const char *where)
|
|||
assert(_tstate->c_stack_soft_limit != 0);
|
||||
assert(_tstate->c_stack_hard_limit != 0);
|
||||
#if _Py_STACK_GROWS_DOWN
|
||||
assert(here_addr >= _tstate->c_stack_hard_limit - _PyOS_STACK_MARGIN_BYTES);
|
||||
if (here_addr < _tstate->c_stack_hard_limit) {
|
||||
/* Overflowing while handling an overflow. Give up. */
|
||||
if (here_addr < _tstate->c_stack_hard_limit - _PyOS_STACK_MARGIN_BYTES) {
|
||||
// Far out of bounds -- Assume stack switching has occurred
|
||||
return 0;
|
||||
}
|
||||
int kbytes_used = (int)(_tstate->c_stack_top - here_addr)/1024;
|
||||
#else
|
||||
assert(here_addr <= _tstate->c_stack_hard_limit + _PyOS_STACK_MARGIN_BYTES);
|
||||
if (here_addr > _tstate->c_stack_hard_limit) {
|
||||
/* Overflowing while handling an overflow. Give up. */
|
||||
if (here_addr > _tstate->c_stack_hard_limit + _PyOS_STACK_MARGIN_BYTES) {
|
||||
// Far out of bounds -- Assume stack switching has occurred
|
||||
return 0;
|
||||
}
|
||||
int kbytes_used = (int)(here_addr - _tstate->c_stack_top)/1024;
|
||||
#endif
|
||||
/* Too much stack used to safely raise an exception. Give up. */
|
||||
char buffer[80];
|
||||
snprintf(buffer, 80, "Unrecoverable stack overflow (used %d kB)%s", kbytes_used, where);
|
||||
Py_FatalError(buffer);
|
||||
|
|
@ -1146,19 +1137,6 @@ _PyEval_GetIter(_PyStackRef iterable, _PyStackRef *index_or_null, int yield_from
|
|||
return PyStackRef_FromPyObjectSteal(iter_o);
|
||||
}
|
||||
|
||||
Py_NO_INLINE int
|
||||
_Py_ReachedRecursionLimit(PyThreadState *tstate) {
|
||||
uintptr_t here_addr = _Py_get_machine_stack_pointer();
|
||||
_PyThreadStateImpl *_tstate = (_PyThreadStateImpl *)tstate;
|
||||
assert(_tstate->c_stack_hard_limit != 0);
|
||||
#if _Py_STACK_GROWS_DOWN
|
||||
return here_addr <= _tstate->c_stack_soft_limit;
|
||||
#else
|
||||
return here_addr >= _tstate->c_stack_soft_limit;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#if (defined(__GNUC__) && __GNUC__ >= 10 && !defined(__clang__)) && defined(__x86_64__)
|
||||
/*
|
||||
* gh-129987: The SLP autovectorizer can cause poor code generation for
|
||||
|
|
@ -1169,7 +1147,7 @@ _Py_ReachedRecursionLimit(PyThreadState *tstate) {
|
|||
* (prior to GCC 9, 40% performance drop), so we have to selectively disable
|
||||
* it.
|
||||
*/
|
||||
#define DONT_SLP_VECTORIZE __attribute__((optimize ("no-tree-slp-vectorize")))
|
||||
#define DONT_SLP_VECTORIZE __attribute__((optimize ("no-tree-slp-vectorize", "no-omit-frame-pointer")))
|
||||
#else
|
||||
#define DONT_SLP_VECTORIZE
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
|
||||
#include "pycore_jit.h"
|
||||
|
||||
// Memory management stuff: ////////////////////////////////////////////////////
|
||||
// Memory management stuff: ///////////////////////////////////////////////////
|
||||
|
||||
#ifndef MS_WINDOWS
|
||||
#include <sys/mman.h>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue