GH-129763: Remove the LLTRACE macro (GH-129764)

This commit is contained in:
Brandt Bucher 2025-02-07 08:49:51 -08:00 committed by GitHub
parent f52a3a51eb
commit fbaa6c8ff0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 25 additions and 49 deletions

View file

@ -0,0 +1 @@
Remove the internal ``LLTRACE`` macro (use :c:macro:`Py_DEBUG` instead).

View file

@ -78,22 +78,16 @@ Py_DEBUG
This is what is generally meant by "a debug build" of Python. This is what is generally meant by "a debug build" of Python.
Py_DEBUG implies LLTRACE and Py_REF_DEBUG. In addition, C assert()s are enabled Py_DEBUG implies Py_REF_DEBUG. In addition, C assert()s are enabled
(via the C way: by not defining NDEBUG), and some routines do additional sanity (via the C way: by not defining NDEBUG), and some routines do additional sanity
checks inside "#ifdef Py_DEBUG" blocks. checks inside "#ifdef Py_DEBUG" blocks.
Also, compile in support for "lltrace" (Low Level TRACE-ing) of the main
LLTRACE interpreter loop. Before _PyEval_EvalFrameDefault executes a frame's code, it
------- checks the frame's global namespace for a variable "__lltrace__" (as well as for
the environment variable PYTHON_LLTRACE"). If such a variable is found, mounds
Compile in support for Low Level TRACE-ing of the main interpreter loop. of information about what the interpreter is doing are sprayed to stdout, such
as every opcode and opcode argument and values pushed onto and popped off the
When this preprocessor symbol is defined, before PyEval_EvalFrame executes a value stack. Higher integer values for the environment variable result in more
frame's code it checks the frame's global namespace for a variable and more detail being printed (the global __lltrace__ always enables the maximum
"__lltrace__". If such a variable is found, mounds of information about what output). Not useful very often, but *very* useful when needed.
the interpreter is doing are sprayed to stdout, such as every opcode and opcode
argument and values pushed onto and popped off the value stack.
Not useful very often, but very useful when needed.
Py_DEBUG implies LLTRACE.

View file

@ -5301,7 +5301,7 @@ dummy_func(
goto exception_unwind; goto exception_unwind;
} }
/* Resume normal execution */ /* Resume normal execution */
#ifdef LLTRACE #ifdef Py_DEBUG
if (frame->lltrace >= 5) { if (frame->lltrace >= 5) {
lltrace_resume_frame(frame); lltrace_resume_frame(frame);
} }
@ -5340,15 +5340,7 @@ dummy_func(
} }
next_instr = frame->instr_ptr; next_instr = frame->instr_ptr;
#ifdef LLTRACE LLTRACE_RESUME_FRAME();
{
int lltrace = maybe_lltrace_resume_frame(frame, GLOBALS());
frame->lltrace = lltrace;
if (lltrace < 0) {
goto exit_unwind;
}
}
#endif
#ifdef Py_DEBUG #ifdef Py_DEBUG
/* _PyEval_EvalFrameDefault() must not be called with an exception set, /* _PyEval_EvalFrameDefault() must not be called with an exception set,

View file

@ -43,11 +43,6 @@
#include <stdbool.h> // bool #include <stdbool.h> // bool
#ifdef Py_DEBUG
/* For debugging the interpreter: */
# define LLTRACE 1 /* Low-level trace feature */
#endif
#if !defined(Py_BUILD_CORE) #if !defined(Py_BUILD_CORE)
# error "ceval.c must be build with Py_BUILD_CORE define for best performance" # error "ceval.c must be build with Py_BUILD_CORE define for best performance"
#endif #endif
@ -136,7 +131,7 @@
#endif #endif
#ifdef LLTRACE #ifdef Py_DEBUG
static void static void
dump_stack(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer) dump_stack(_PyInterpreterFrame *frame, _PyStackRef *stack_pointer)
{ {
@ -818,7 +813,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int
entry_frame.owner = FRAME_OWNED_BY_INTERPRETER; entry_frame.owner = FRAME_OWNED_BY_INTERPRETER;
entry_frame.visited = 0; entry_frame.visited = 0;
entry_frame.return_offset = 0; entry_frame.return_offset = 0;
#ifdef LLTRACE #ifdef Py_DEBUG
entry_frame.lltrace = 0; entry_frame.lltrace = 0;
#endif #endif
/* Push frame */ /* Push frame */

View file

@ -108,21 +108,21 @@
#endif #endif
/* PRE_DISPATCH_GOTO() does lltrace if enabled. Normally a no-op */ /* PRE_DISPATCH_GOTO() does lltrace if enabled. Normally a no-op */
#ifdef LLTRACE #ifdef Py_DEBUG
#define PRE_DISPATCH_GOTO() if (frame->lltrace >= 5) { \ #define PRE_DISPATCH_GOTO() if (frame->lltrace >= 5) { \
lltrace_instruction(frame, stack_pointer, next_instr, opcode, oparg); } lltrace_instruction(frame, stack_pointer, next_instr, opcode, oparg); }
#else #else
#define PRE_DISPATCH_GOTO() ((void)0) #define PRE_DISPATCH_GOTO() ((void)0)
#endif #endif
#if LLTRACE #ifdef Py_DEBUG
#define LLTRACE_RESUME_FRAME() \ #define LLTRACE_RESUME_FRAME() \
do { \ do { \
int lltrace = maybe_lltrace_resume_frame(frame, GLOBALS()); \ int lltrace = maybe_lltrace_resume_frame(frame, GLOBALS()); \
frame->lltrace = lltrace; \
if (lltrace < 0) { \ if (lltrace < 0) { \
JUMP_TO_LABEL(exit_unwind); \ JUMP_TO_LABEL(exit_unwind); \
} \ } \
frame->lltrace = lltrace; \
} while (0) } while (0)
#else #else
#define LLTRACE_RESUME_FRAME() ((void)0) #define LLTRACE_RESUME_FRAME() ((void)0)

View file

@ -11416,7 +11416,7 @@ JUMP_TO_LABEL(error);
JUMP_TO_LABEL(exception_unwind); JUMP_TO_LABEL(exception_unwind);
} }
/* Resume normal execution */ /* Resume normal execution */
#ifdef LLTRACE #ifdef Py_DEBUG
if (frame->lltrace >= 5) { if (frame->lltrace >= 5) {
lltrace_resume_frame(frame); lltrace_resume_frame(frame);
} }
@ -11458,16 +11458,7 @@ JUMP_TO_LABEL(error);
JUMP_TO_LABEL(exit_unwind); JUMP_TO_LABEL(exit_unwind);
} }
next_instr = frame->instr_ptr; next_instr = frame->instr_ptr;
#ifdef LLTRACE LLTRACE_RESUME_FRAME();
{
int lltrace = maybe_lltrace_resume_frame(frame, GLOBALS());
frame->lltrace = lltrace;
if (lltrace < 0) {
JUMP_TO_LABEL(exit_unwind);
}
}
#endif
#ifdef Py_DEBUG #ifdef Py_DEBUG
/* _PyEval_EvalFrameDefault() must not be called with an exception set, /* _PyEval_EvalFrameDefault() must not be called with an exception set,
because it can clear it (directly or indirectly) and so the because it can clear it (directly or indirectly) and so the

View file

@ -69,7 +69,6 @@ Objects/tupleobject.c:_Py_tuple_zero_allocs Py_ssize_t _Py_
Objects/typeobject.c:next_version_tag static unsigned int next_version_tag Objects/typeobject.c:next_version_tag static unsigned int next_version_tag
Python/Python-ast.c:init_types():initialized static int initialized Python/Python-ast.c:init_types():initialized static int initialized
Python/bootstrap_hash.c:urandom_cache static struct { int fd; dev_t st_dev; ino_t st_ino; } urandom_cache Python/bootstrap_hash.c:urandom_cache static struct { int fd; dev_t st_dev; ino_t st_ino; } urandom_cache
Python/ceval.c:lltrace static int lltrace
Python/ceval.c:make_pending_calls():busy static int busy Python/ceval.c:make_pending_calls():busy static int busy
Python/dynload_shlib.c:handles static struct { dev_t dev; ino_t ino; void *handle; } handles[128] Python/dynload_shlib.c:handles static struct { dev_t dev; ino_t ino; void *handle; } handles[128]
Python/dynload_shlib.c:nhandles static int nhandles Python/dynload_shlib.c:nhandles static int nhandles

View file

@ -676,7 +676,6 @@ NON_ESCAPING_FUNCTIONS = (
"backoff_counter_triggers", "backoff_counter_triggers",
"initial_temperature_backoff_counter", "initial_temperature_backoff_counter",
"JUMP_TO_LABEL", "JUMP_TO_LABEL",
"maybe_lltrace_resume_frame",
"restart_backoff_counter", "restart_backoff_counter",
) )

View file

@ -81,6 +81,11 @@ do { \
#undef WITHIN_STACK_BOUNDS #undef WITHIN_STACK_BOUNDS
#define WITHIN_STACK_BOUNDS() 1 #define WITHIN_STACK_BOUNDS() 1
#undef LLTRACE_RESUME_FRAME
#define LLTRACE_RESUME_FRAME() \
do { \
} while (0)
#define TIER_TWO 2 #define TIER_TWO 2
__attribute__((preserve_none)) _Py_CODEUNIT * __attribute__((preserve_none)) _Py_CODEUNIT *