Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-128563: Move lltrace into the frame struct #129113

Merged
merged 15 commits into from
Jan 21, 2025
3 changes: 3 additions & 0 deletions Include/internal/pycore_frame.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,9 @@ typedef struct _PyInterpreterFrame {
uint16_t return_offset; /* Only relevant during a function call */
char owner;
char visited;
#ifdef Py_DEBUG
Fidget-Spinner marked this conversation as resolved.
Show resolved Hide resolved
unsigned char lltrace;
#endif
/* Locals and stack */
_PyStackRef localsplus[1];
} _PyInterpreterFrame;
Expand Down
5 changes: 3 additions & 2 deletions Lib/test/test_sys.py
Original file line number Diff line number Diff line change
Expand Up @@ -1620,10 +1620,11 @@ class C(object): pass
def func():
return sys._getframe()
x = func()
LLTRACE = 'B' if support.Py_DEBUG else ''
Fidget-Spinner marked this conversation as resolved.
Show resolved Hide resolved
if support.Py_GIL_DISABLED:
INTERPRETER_FRAME = '10PhcP'
INTERPRETER_FRAME = f'10Phcc{LLTRACE}P'
else:
INTERPRETER_FRAME = '9PhcP'
INTERPRETER_FRAME = f'9Phcc{LLTRACE}P'
check(x, size('3PiccPP' + INTERPRETER_FRAME + 'P'))
# function
def func(): pass
Expand Down
4 changes: 2 additions & 2 deletions Python/bytecodes.c
Original file line number Diff line number Diff line change
Expand Up @@ -4993,7 +4993,7 @@ dummy_func(
_Py_CODEUNIT *target = _PyFrame_GetBytecode(frame) + exit->target;
#if defined(Py_DEBUG) && !defined(_Py_JIT)
OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
if (lltrace >= 2) {
if (FT_ATOMIC_LOAD_UINT8_RELAXED(frame->lltrace) >= 2) {
Fidget-Spinner marked this conversation as resolved.
Show resolved Hide resolved
printf("SIDE EXIT: [UOp ");
_PyUOpPrint(&next_uop[-1]);
printf(", exit %u, temp %d, target %d -> %s]\n",
Expand Down Expand Up @@ -5111,7 +5111,7 @@ dummy_func(
_Py_CODEUNIT *target = frame->instr_ptr;
#if defined(Py_DEBUG) && !defined(_Py_JIT)
OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
if (lltrace >= 2) {
if (FT_ATOMIC_LOAD_UINT8_RELAXED(frame->lltrace) >= 2) {
Fidget-Spinner marked this conversation as resolved.
Show resolved Hide resolved
printf("DYNAMIC EXIT: [UOp ");
_PyUOpPrint(&next_uop[-1]);
printf(", exit %u, temp %d, target %d -> %s]\n",
Expand Down
24 changes: 14 additions & 10 deletions Python/ceval.c
Original file line number Diff line number Diff line change
Expand Up @@ -799,9 +799,6 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
#endif
uint8_t opcode; /* Current opcode */
int oparg; /* Current opcode argument, if any */
#ifdef LLTRACE
int lltrace = 0;
#endif

_PyInterpreterFrame entry_frame;

Expand All @@ -821,6 +818,9 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
entry_frame.owner = FRAME_OWNED_BY_CSTACK;
entry_frame.visited = 0;
entry_frame.return_offset = 0;
#ifdef LLTRACE
entry_frame.lltrace = 0;
#endif
/* Push frame */
entry_frame.previous = tstate->current_frame;
frame->previous = &entry_frame;
Expand Down Expand Up @@ -880,9 +880,13 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
stack_pointer = _PyFrame_GetStackPointer(frame);

#ifdef LLTRACE
lltrace = maybe_lltrace_resume_frame(frame, &entry_frame, GLOBALS());
if (lltrace < 0) {
goto exit_unwind;
{
int lltrace = maybe_lltrace_resume_frame(frame, &entry_frame,
GLOBALS());
FT_ATOMIC_STORE_UINT8_RELAXED(frame->lltrace, (uint8_t)lltrace);
if (lltrace < 0) {
goto exit_unwind;
}
}
#endif

Expand Down Expand Up @@ -1002,7 +1006,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
}
/* Resume normal execution */
#ifdef LLTRACE
if (lltrace >= 5) {
if (FT_ATOMIC_LOAD_UINT8_RELAXED(frame->lltrace) >= 5) {
lltrace_resume_frame(frame);
}
#endif
Expand Down Expand Up @@ -1079,7 +1083,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
for (;;) {
uopcode = next_uop->opcode;
#ifdef Py_DEBUG
if (lltrace >= 3) {
if (FT_ATOMIC_LOAD_UINT8_RELAXED(frame->lltrace) >= 3) {
dump_stack(frame, stack_pointer);
if (next_uop->opcode == _START_EXECUTOR) {
printf("%4d uop: ", 0);
Expand Down Expand Up @@ -1121,7 +1125,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int

jump_to_error_target:
#ifdef Py_DEBUG
if (lltrace >= 2) {
if (FT_ATOMIC_LOAD_UINT8_RELAXED(frame->lltrace) >= 2) {
printf("Error: [UOp ");
_PyUOpPrint(&next_uop[-1]);
printf(" @ %d -> %s]\n",
Expand Down Expand Up @@ -1157,7 +1161,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
next_instr = next_uop[-1].target + _PyFrame_GetBytecode(frame);
goto_to_tier1:
#ifdef Py_DEBUG
if (lltrace >= 2) {
if (FT_ATOMIC_LOAD_UINT8_RELAXED(frame->lltrace) >= 2) {
printf("DEOPT: [UOp ");
_PyUOpPrint(&next_uop[-1]);
printf(" -> %s]\n",
Expand Down
5 changes: 3 additions & 2 deletions Python/ceval_macros.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@

/* PRE_DISPATCH_GOTO() does lltrace if enabled. Normally a no-op */
#ifdef LLTRACE
#define PRE_DISPATCH_GOTO() if (lltrace >= 5) { \
#define PRE_DISPATCH_GOTO() if (FT_ATOMIC_LOAD_UINT8_RELAXED(frame->lltrace) >= 5) { \
lltrace_instruction(frame, stack_pointer, next_instr, opcode, oparg); }
#else
#define PRE_DISPATCH_GOTO() ((void)0)
Expand All @@ -89,7 +89,8 @@
#if LLTRACE
#define LLTRACE_RESUME_FRAME() \
do { \
lltrace = maybe_lltrace_resume_frame(frame, &entry_frame, GLOBALS()); \
int lltrace = maybe_lltrace_resume_frame(frame, &entry_frame, GLOBALS()); \
FT_ATOMIC_STORE_UINT8_RELAXED(frame->lltrace, (uint8_t)lltrace); \
if (lltrace < 0) { \
goto exit_unwind; \
} \
Expand Down
4 changes: 2 additions & 2 deletions Python/executor_cases.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading