mirror of
https://github.com/python/cpython.git
synced 2025-10-28 04:04:44 +00:00
GH-132532: Add new DSL macros to better declare semantics of exits at ends of instructions/uops. (GH-137098)
This commit is contained in:
parent
c744b57fd6
commit
af15e1d13e
15 changed files with 524 additions and 609 deletions
|
|
@ -153,22 +153,19 @@ dummy_func(
|
|||
macro(NOT_TAKEN) = NOP;
|
||||
|
||||
op(_CHECK_PERIODIC, (--)) {
|
||||
_Py_CHECK_EMSCRIPTEN_SIGNALS_PERIODICALLY();
|
||||
QSBR_QUIESCENT_STATE(tstate);
|
||||
if (_Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) {
|
||||
int err = _Py_HandlePending(tstate);
|
||||
ERROR_IF(err != 0);
|
||||
}
|
||||
int err = check_periodics(tstate);
|
||||
ERROR_IF(err != 0);
|
||||
}
|
||||
|
||||
replaced op(_CHECK_PERIODIC_AT_END, (--)) {
|
||||
int err = check_periodics(tstate);
|
||||
ERROR_IF(err != 0);
|
||||
}
|
||||
|
||||
op(_CHECK_PERIODIC_IF_NOT_YIELD_FROM, (--)) {
|
||||
if ((oparg & RESUME_OPARG_LOCATION_MASK) < RESUME_AFTER_YIELD_FROM) {
|
||||
_Py_CHECK_EMSCRIPTEN_SIGNALS_PERIODICALLY();
|
||||
QSBR_QUIESCENT_STATE(tstate);
|
||||
if (_Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker) & _PY_EVAL_EVENTS_MASK) {
|
||||
int err = _Py_HandlePending(tstate);
|
||||
ERROR_IF(err != 0);
|
||||
}
|
||||
int err = check_periodics(tstate);
|
||||
ERROR_IF(err != 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3794,8 +3791,8 @@ dummy_func(
|
|||
ERROR_IF(err);
|
||||
}
|
||||
|
||||
macro(CALL) = _SPECIALIZE_CALL + unused/2 + _MAYBE_EXPAND_METHOD + _DO_CALL + _CHECK_PERIODIC;
|
||||
macro(INSTRUMENTED_CALL) = unused/3 + _MAYBE_EXPAND_METHOD + _MONITOR_CALL + _DO_CALL + _CHECK_PERIODIC;
|
||||
macro(CALL) = _SPECIALIZE_CALL + unused/2 + _MAYBE_EXPAND_METHOD + _DO_CALL + _CHECK_PERIODIC_AT_END;
|
||||
macro(INSTRUMENTED_CALL) = unused/3 + _MAYBE_EXPAND_METHOD + _MONITOR_CALL + _DO_CALL + _CHECK_PERIODIC_AT_END;
|
||||
|
||||
op(_PY_FRAME_GENERAL, (callable, self_or_null, args[oparg] -- new_frame)) {
|
||||
PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
|
||||
|
|
@ -3916,7 +3913,7 @@ dummy_func(
|
|||
unused/2 +
|
||||
_CHECK_IS_NOT_PY_CALLABLE +
|
||||
_CALL_NON_PY_GENERAL +
|
||||
_CHECK_PERIODIC;
|
||||
_CHECK_PERIODIC_AT_END;
|
||||
|
||||
op(_CHECK_CALL_BOUND_METHOD_EXACT_ARGS, (callable, null, unused[oparg] -- callable, null, unused[oparg])) {
|
||||
EXIT_IF(!PyStackRef_IsNull(null));
|
||||
|
|
@ -4073,7 +4070,7 @@ dummy_func(
|
|||
_GUARD_NOS_NULL +
|
||||
_GUARD_CALLABLE_STR_1 +
|
||||
_CALL_STR_1 +
|
||||
_CHECK_PERIODIC;
|
||||
_CHECK_PERIODIC_AT_END;
|
||||
|
||||
op(_GUARD_CALLABLE_TUPLE_1, (callable, unused, unused -- callable, unused, unused)) {
|
||||
PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
|
||||
|
|
@ -4101,7 +4098,7 @@ dummy_func(
|
|||
_GUARD_NOS_NULL +
|
||||
_GUARD_CALLABLE_TUPLE_1 +
|
||||
_CALL_TUPLE_1 +
|
||||
_CHECK_PERIODIC;
|
||||
_CHECK_PERIODIC_AT_END;
|
||||
|
||||
op(_CHECK_AND_ALLOCATE_OBJECT, (type_version/2, callable, self_or_null, unused[oparg] -- callable, self_or_null, unused[oparg])) {
|
||||
PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
|
||||
|
|
@ -4197,7 +4194,7 @@ dummy_func(
|
|||
unused/1 +
|
||||
unused/2 +
|
||||
_CALL_BUILTIN_CLASS +
|
||||
_CHECK_PERIODIC;
|
||||
_CHECK_PERIODIC_AT_END;
|
||||
|
||||
op(_CALL_BUILTIN_O, (callable, self_or_null, args[oparg] -- res)) {
|
||||
/* Builtin METH_O functions */
|
||||
|
|
@ -4232,7 +4229,7 @@ dummy_func(
|
|||
unused/1 +
|
||||
unused/2 +
|
||||
_CALL_BUILTIN_O +
|
||||
_CHECK_PERIODIC;
|
||||
_CHECK_PERIODIC_AT_END;
|
||||
|
||||
op(_CALL_BUILTIN_FAST, (callable, self_or_null, args[oparg] -- res)) {
|
||||
/* Builtin METH_FASTCALL functions, without keywords */
|
||||
|
|
@ -4269,7 +4266,7 @@ dummy_func(
|
|||
unused/1 +
|
||||
unused/2 +
|
||||
_CALL_BUILTIN_FAST +
|
||||
_CHECK_PERIODIC;
|
||||
_CHECK_PERIODIC_AT_END;
|
||||
|
||||
op(_CALL_BUILTIN_FAST_WITH_KEYWORDS, (callable, self_or_null, args[oparg] -- res)) {
|
||||
/* Builtin METH_FASTCALL | METH_KEYWORDS functions */
|
||||
|
|
@ -4305,7 +4302,7 @@ dummy_func(
|
|||
unused/1 +
|
||||
unused/2 +
|
||||
_CALL_BUILTIN_FAST_WITH_KEYWORDS +
|
||||
_CHECK_PERIODIC;
|
||||
_CHECK_PERIODIC_AT_END;
|
||||
|
||||
macro(CALL_LEN) =
|
||||
unused/1 +
|
||||
|
|
@ -4443,7 +4440,7 @@ dummy_func(
|
|||
unused/1 +
|
||||
unused/2 +
|
||||
_CALL_METHOD_DESCRIPTOR_O +
|
||||
_CHECK_PERIODIC;
|
||||
_CHECK_PERIODIC_AT_END;
|
||||
|
||||
op(_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS, (callable, self_or_null, args[oparg] -- res)) {
|
||||
PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
|
||||
|
|
@ -4485,7 +4482,7 @@ dummy_func(
|
|||
unused/1 +
|
||||
unused/2 +
|
||||
_CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS +
|
||||
_CHECK_PERIODIC;
|
||||
_CHECK_PERIODIC_AT_END;
|
||||
|
||||
op(_CALL_METHOD_DESCRIPTOR_NOARGS, (callable, self_or_null, args[oparg] -- res)) {
|
||||
assert(oparg == 0 || oparg == 1);
|
||||
|
|
@ -4523,7 +4520,7 @@ dummy_func(
|
|||
unused/1 +
|
||||
unused/2 +
|
||||
_CALL_METHOD_DESCRIPTOR_NOARGS +
|
||||
_CHECK_PERIODIC;
|
||||
_CHECK_PERIODIC_AT_END;
|
||||
|
||||
op(_CALL_METHOD_DESCRIPTOR_FAST, (callable, self_or_null, args[oparg] -- res)) {
|
||||
PyObject *callable_o = PyStackRef_AsPyObjectBorrow(callable);
|
||||
|
|
@ -4564,7 +4561,7 @@ dummy_func(
|
|||
unused/1 +
|
||||
unused/2 +
|
||||
_CALL_METHOD_DESCRIPTOR_FAST +
|
||||
_CHECK_PERIODIC;
|
||||
_CHECK_PERIODIC_AT_END;
|
||||
|
||||
// Cache layout: counter/1, func_version/2
|
||||
family(CALL_KW, INLINE_CACHE_ENTRIES_CALL_KW) = {
|
||||
|
|
@ -4820,7 +4817,7 @@ dummy_func(
|
|||
unused/2 +
|
||||
_CHECK_IS_NOT_PY_CALLABLE_KW +
|
||||
_CALL_KW_NON_PY +
|
||||
_CHECK_PERIODIC;
|
||||
_CHECK_PERIODIC_AT_END;
|
||||
|
||||
op(_MAKE_CALLARGS_A_TUPLE, (func, unused, callargs, kwargs -- func, unused, callargs, kwargs)) {
|
||||
PyObject *callargs_o = PyStackRef_AsPyObjectBorrow(callargs);
|
||||
|
|
@ -4921,12 +4918,12 @@ dummy_func(
|
|||
macro(CALL_FUNCTION_EX) =
|
||||
_MAKE_CALLARGS_A_TUPLE +
|
||||
_DO_CALL_FUNCTION_EX +
|
||||
_CHECK_PERIODIC;
|
||||
_CHECK_PERIODIC_AT_END;
|
||||
|
||||
macro(INSTRUMENTED_CALL_FUNCTION_EX) =
|
||||
_MAKE_CALLARGS_A_TUPLE +
|
||||
_DO_CALL_FUNCTION_EX +
|
||||
_CHECK_PERIODIC;
|
||||
_CHECK_PERIODIC_AT_END;
|
||||
|
||||
inst(MAKE_FUNCTION, (codeobj_st -- func)) {
|
||||
PyObject *codeobj = PyStackRef_AsPyObjectBorrow(codeobj_st);
|
||||
|
|
@ -5189,23 +5186,20 @@ dummy_func(
|
|||
op (_GUARD_IS_TRUE_POP, (flag -- )) {
|
||||
int is_true = PyStackRef_IsTrue(flag);
|
||||
DEAD(flag);
|
||||
SYNC_SP();
|
||||
EXIT_IF(!is_true);
|
||||
AT_END_EXIT_IF(!is_true);
|
||||
}
|
||||
|
||||
op (_GUARD_IS_FALSE_POP, (flag -- )) {
|
||||
int is_false = PyStackRef_IsFalse(flag);
|
||||
DEAD(flag);
|
||||
SYNC_SP();
|
||||
EXIT_IF(!is_false);
|
||||
AT_END_EXIT_IF(!is_false);
|
||||
}
|
||||
|
||||
op (_GUARD_IS_NONE_POP, (val -- )) {
|
||||
int is_none = PyStackRef_IsNone(val);
|
||||
if (!is_none) {
|
||||
PyStackRef_CLOSE(val);
|
||||
SYNC_SP();
|
||||
EXIT_IF(1);
|
||||
AT_END_EXIT_IF(1);
|
||||
}
|
||||
DEAD(val);
|
||||
}
|
||||
|
|
@ -5213,8 +5207,7 @@ dummy_func(
|
|||
op (_GUARD_IS_NOT_NONE_POP, (val -- )) {
|
||||
int is_none = PyStackRef_IsNone(val);
|
||||
PyStackRef_CLOSE(val);
|
||||
SYNC_SP();
|
||||
EXIT_IF(is_none);
|
||||
AT_END_EXIT_IF(is_none);
|
||||
}
|
||||
|
||||
op(_JUMP_TO_TOP, (--)) {
|
||||
|
|
@ -5380,6 +5373,11 @@ dummy_func(
|
|||
GOTO_TIER_ONE(_PyFrame_GetBytecode(frame) + CURRENT_TARGET());
|
||||
}
|
||||
|
||||
tier2 op(_HANDLE_PENDING_AND_DEOPT, (--)) {
|
||||
int err = _Py_HandlePending(tstate);
|
||||
GOTO_TIER_ONE(err ? NULL : _PyFrame_GetBytecode(frame) + CURRENT_TARGET());
|
||||
}
|
||||
|
||||
tier2 op(_ERROR_POP_N, (target/2 --)) {
|
||||
assert(oparg == 0);
|
||||
frame->instr_ptr = _PyFrame_GetBytecode(frame) + target;
|
||||
|
|
@ -5391,11 +5389,11 @@ dummy_func(
|
|||
* ENTER_EXECUTOR will not re-enter tier 2 with the eval breaker set. */
|
||||
tier2 op(_TIER2_RESUME_CHECK, (--)) {
|
||||
#if defined(__EMSCRIPTEN__)
|
||||
DEOPT_IF(_Py_emscripten_signal_clock == 0);
|
||||
HANDLE_PENDING_AND_DEOPT_IF(_Py_emscripten_signal_clock == 0);
|
||||
_Py_emscripten_signal_clock -= Py_EMSCRIPTEN_SIGNAL_HANDLING;
|
||||
#endif
|
||||
uintptr_t eval_breaker = _Py_atomic_load_uintptr_relaxed(&tstate->eval_breaker);
|
||||
DEOPT_IF(eval_breaker & _PY_EVAL_EVENTS_MASK);
|
||||
HANDLE_PENDING_AND_DEOPT_IF(eval_breaker & _PY_EVAL_EVENTS_MASK);
|
||||
assert(tstate->tracing || eval_breaker == FT_ATOMIC_LOAD_UINTPTR_ACQUIRE(_PyFrame_GetCode(frame)->_co_instrumentation_version));
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue