mirror of
https://github.com/python/cpython.git
synced 2026-04-17 09:20:43 +00:00
GH-126910: Revert "Make _Py_get_machine_stack_pointer return the stack pointer (#147945)" (GH-147994)
Revert "GH-126910: Make `_Py_get_machine_stack_pointer` return the stack pointer (#147945)"
This reverts commit 255026d9ee,
which broke a tier-1 buildbot.
This commit is contained in:
parent
fc7a188fe7
commit
9b08f8c56f
7 changed files with 55 additions and 37 deletions
|
|
@ -49,6 +49,20 @@ _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)
|
||||
|
|
@ -264,7 +278,7 @@ PyUnstable_ThreadState_ResetStackProtection(PyThreadState *tstate)
|
|||
|
||||
|
||||
/* The function _Py_EnterRecursiveCallTstate() only calls _Py_CheckRecursiveCall()
|
||||
if the stack pointer is beyond c_stack_soft_limit. */
|
||||
if the stack pointer is between the stack base and c_stack_hard_limit. */
|
||||
int
|
||||
_Py_CheckRecursiveCall(PyThreadState *tstate, const char *where)
|
||||
{
|
||||
|
|
@ -273,21 +287,16 @@ _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) {
|
||||
if (here_addr < _tstate->c_stack_hard_limit - _PyOS_STACK_MARGIN_BYTES) {
|
||||
// Far out of bounds -- Assume stack switching has occurred
|
||||
return 0;
|
||||
}
|
||||
/* Overflowing while handling an overflow. Give up. */
|
||||
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) {
|
||||
if (here_addr > _tstate->c_stack_hard_limit + _PyOS_STACK_MARGIN_BYTES) {
|
||||
// Far out of bounds -- Assume stack switching has occurred
|
||||
return 0;
|
||||
}
|
||||
/* Overflowing while handling an overflow. Give up. */
|
||||
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);
|
||||
|
|
@ -1192,6 +1201,19 @@ _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
|
||||
|
|
|
|||
|
|
@ -734,7 +734,7 @@ _PyJIT_Compile(_PyExecutorObject *executor, const _PyUOpInstruction trace[], siz
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* One-off compilation of the jit entry shim.
|
||||
/* One-off compilation of the jit entry shim
|
||||
* We compile this once only as it effectively a normal
|
||||
* function, but we need to use the JIT because it needs
|
||||
* to understand the jit-specific calling convention.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue