https://github.com/python/cpython/commit/5809b2590956d51ce805f877e4708d21f59fb222
commit: 5809b2590956d51ce805f877e4708d21f59fb222
branch: main
author: Ken Jin <[email protected]>
committer: Fidget-Spinner <[email protected]>
date: 2025-01-21T22:17:15+08:00
summary:
gh-128563: Move lltrace into the frame struct (GH-129113)
files:
M Include/internal/pycore_frame.h
M Python/bytecodes.c
M Python/ceval.c
M Python/ceval_macros.h
M Python/executor_cases.c.h
diff --git a/Include/internal/pycore_frame.h b/Include/internal/pycore_frame.h
index 77a922630cde08..14dc91e54298ce 100644
--- a/Include/internal/pycore_frame.h
+++ b/Include/internal/pycore_frame.h
@@ -76,7 +76,12 @@ typedef struct _PyInterpreterFrame {
_PyStackRef *stackpointer;
uint16_t return_offset; /* Only relevant during a function call */
char owner;
- char visited;
+#ifdef Py_DEBUG
+ uint8_t visited:1;
+ uint8_t lltrace:7;
+#else
+ uint8_t visited;
+#endif
/* Locals and stack */
_PyStackRef localsplus[1];
} _PyInterpreterFrame;
diff --git a/Python/bytecodes.c b/Python/bytecodes.c
index 8bda4501df5f74..8bed29ca2c8fc7 100644
--- a/Python/bytecodes.c
+++ b/Python/bytecodes.c
@@ -4990,7 +4990,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 (frame->lltrace >= 2) {
printf("SIDE EXIT: [UOp ");
_PyUOpPrint(&next_uop[-1]);
printf(", exit %u, temp %d, target %d -> %s]\n",
@@ -5108,7 +5108,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 (frame->lltrace >= 2) {
printf("DYNAMIC EXIT: [UOp ");
_PyUOpPrint(&next_uop[-1]);
printf(", exit %u, temp %d, target %d -> %s]\n",
diff --git a/Python/ceval.c b/Python/ceval.c
index 813d980acf5aab..58a54467f06bb0 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -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;
@@ -821,6 +818,9 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate,
_PyInterpreterFrame *frame, int
entry_frame.owner = FRAME_OWNED_BY_INTERPRETER;
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;
@@ -880,9 +880,12 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate,
_PyInterpreterFrame *frame, int
stack_pointer = _PyFrame_GetStackPointer(frame);
#ifdef LLTRACE
- lltrace = maybe_lltrace_resume_frame(frame, GLOBALS());
- if (lltrace < 0) {
- goto exit_unwind;
+ {
+ int lltrace = maybe_lltrace_resume_frame(frame, GLOBALS());
+ frame->lltrace = lltrace;
+ if (lltrace < 0) {
+ goto exit_unwind;
+ }
}
#endif
@@ -1002,7 +1005,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate,
_PyInterpreterFrame *frame, int
}
/* Resume normal execution */
#ifdef LLTRACE
- if (lltrace >= 5) {
+ if (frame->lltrace >= 5) {
lltrace_resume_frame(frame);
}
#endif
@@ -1079,7 +1082,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate,
_PyInterpreterFrame *frame, int
for (;;) {
uopcode = next_uop->opcode;
#ifdef Py_DEBUG
- if (lltrace >= 3) {
+ if (frame->lltrace >= 3) {
dump_stack(frame, stack_pointer);
if (next_uop->opcode == _START_EXECUTOR) {
printf("%4d uop: ", 0);
@@ -1121,7 +1124,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate,
_PyInterpreterFrame *frame, int
jump_to_error_target:
#ifdef Py_DEBUG
- if (lltrace >= 2) {
+ if (frame->lltrace >= 2) {
printf("Error: [UOp ");
_PyUOpPrint(&next_uop[-1]);
printf(" @ %d -> %s]\n",
@@ -1157,7 +1160,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 (frame->lltrace >= 2) {
printf("DEOPT: [UOp ");
_PyUOpPrint(&next_uop[-1]);
printf(" -> %s]\n",
diff --git a/Python/ceval_macros.h b/Python/ceval_macros.h
index 6a982ee2ca5d9a..feaac07fe435b6 100644
--- a/Python/ceval_macros.h
+++ b/Python/ceval_macros.h
@@ -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 (frame->lltrace >= 5) { \
lltrace_instruction(frame, stack_pointer, next_instr, opcode, oparg); }
#else
#define PRE_DISPATCH_GOTO() ((void)0)
@@ -89,7 +89,8 @@
#if LLTRACE
#define LLTRACE_RESUME_FRAME() \
do { \
- lltrace = maybe_lltrace_resume_frame(frame, GLOBALS()); \
+ int lltrace = maybe_lltrace_resume_frame(frame, GLOBALS()); \
+ frame->lltrace = lltrace; \
if (lltrace < 0) { \
goto exit_unwind; \
} \
diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h
index 0d6719a5c40bdd..93072304e6e111 100644
--- a/Python/executor_cases.c.h
+++ b/Python/executor_cases.c.h
@@ -5878,7 +5878,7 @@
stack_pointer = _PyFrame_GetStackPointer(frame);
#if defined(Py_DEBUG) && !defined(_Py_JIT)
OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
- if (lltrace >= 2) {
+ if (frame->lltrace >= 2) {
_PyFrame_SetStackPointer(frame, stack_pointer);
printf("SIDE EXIT: [UOp ");
_PyUOpPrint(&next_uop[-1]);
@@ -6072,7 +6072,7 @@
_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 (frame->lltrace >= 2) {
_PyFrame_SetStackPointer(frame, stack_pointer);
printf("DYNAMIC EXIT: [UOp ");
_PyUOpPrint(&next_uop[-1]);
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]