]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-129763: Remove the LLTRACE macro (GH-129764)
authorBrandt Bucher <brandtbucher@microsoft.com>
Fri, 7 Feb 2025 16:49:51 +0000 (08:49 -0800)
committerGitHub <noreply@github.com>
Fri, 7 Feb 2025 16:49:51 +0000 (08:49 -0800)
Misc/NEWS.d/next/Core_and_Builtins/2025-02-06-17-05-09.gh-issue-129763.6ZxQ8W.rst [new file with mode: 0644]
Misc/SpecialBuilds.txt
Python/bytecodes.c
Python/ceval.c
Python/ceval_macros.h
Python/generated_cases.c.h
Tools/c-analyzer/TODO
Tools/cases_generator/analyzer.py
Tools/jit/template.c

diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-02-06-17-05-09.gh-issue-129763.6ZxQ8W.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-02-06-17-05-09.gh-issue-129763.6ZxQ8W.rst
new file mode 100644 (file)
index 0000000..ffb96c2
--- /dev/null
@@ -0,0 +1 @@
+Remove the internal ``LLTRACE`` macro (use :c:macro:`Py_DEBUG` instead).
index 78201bfbd6741dd8606430c997cb29a981fe8028..23fa36af78cc527f755a92e531362ce158bb2258 100644 (file)
@@ -78,22 +78,16 @@ Py_DEBUG
 
 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
 checks inside "#ifdef Py_DEBUG" blocks.
 
-
-LLTRACE
--------
-
-Compile in support for Low Level TRACE-ing of the main interpreter loop.
-
-When this preprocessor symbol is defined, before PyEval_EvalFrame executes a
-frame's code it checks the frame's global namespace for a variable
-"__lltrace__".  If such a variable is found, mounds 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 value stack.
-
-Not useful very often, but very useful when needed.
-
-Py_DEBUG implies LLTRACE.
+Also, compile in support for "lltrace" (Low Level TRACE-ing) of the main
+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
+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
+value stack. Higher integer values for the environment variable result in more
+and more detail being printed (the global __lltrace__ always enables the maximum
+output). Not useful very often, but *very* useful when needed.
index c3024f7f98f28c195842a35876c6b6e34c01640a..07022e9932d20382e8bc85e7ffadb4921cba41b9 100644 (file)
@@ -5301,7 +5301,7 @@ dummy_func(
                 goto exception_unwind;
             }
             /* Resume normal execution */
-#ifdef LLTRACE
+#ifdef Py_DEBUG
             if (frame->lltrace >= 5) {
                 lltrace_resume_frame(frame);
             }
@@ -5340,15 +5340,7 @@ dummy_func(
             }
             next_instr = frame->instr_ptr;
 
-        #ifdef LLTRACE
-            {
-                int lltrace = maybe_lltrace_resume_frame(frame, GLOBALS());
-                frame->lltrace = lltrace;
-                if (lltrace < 0) {
-                    goto exit_unwind;
-                }
-            }
-        #endif
+            LLTRACE_RESUME_FRAME();
 
         #ifdef Py_DEBUG
             /* _PyEval_EvalFrameDefault() must not be called with an exception set,
index 5e834883f355e1c5c86dfc4c95cb511467d9650a..b2e2b5407838807bcceb8a7a464f82df2f0f61ba 100644 (file)
 
 #include <stdbool.h>              // bool
 
-#ifdef Py_DEBUG
-   /* For debugging the interpreter: */
-#  define LLTRACE  1      /* Low-level trace feature */
-#endif
-
 #if !defined(Py_BUILD_CORE)
 #  error "ceval.c must be build with Py_BUILD_CORE define for best performance"
 #endif
 #endif
 
 
-#ifdef LLTRACE
+#ifdef Py_DEBUG
 static void
 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.visited = 0;
     entry_frame.return_offset = 0;
-#ifdef LLTRACE
+#ifdef Py_DEBUG
     entry_frame.lltrace = 0;
 #endif
     /* Push frame */
index 44bb52a09aab5f96c5d78fcd73141c12ebf45beb..fde8e5efa983b2c260c2c46cef730ffcf98520d4 100644 (file)
 #endif
 
 /* PRE_DISPATCH_GOTO() does lltrace if enabled. Normally a no-op */
-#ifdef LLTRACE
+#ifdef Py_DEBUG
 #define PRE_DISPATCH_GOTO() if (frame->lltrace >= 5) { \
     lltrace_instruction(frame, stack_pointer, next_instr, opcode, oparg); }
 #else
 #define PRE_DISPATCH_GOTO() ((void)0)
 #endif
 
-#if LLTRACE
+#ifdef Py_DEBUG
 #define LLTRACE_RESUME_FRAME() \
 do { \
     int lltrace = maybe_lltrace_resume_frame(frame, GLOBALS()); \
-    frame->lltrace = lltrace; \
     if (lltrace < 0) { \
         JUMP_TO_LABEL(exit_unwind); \
     } \
+    frame->lltrace = lltrace; \
 } while (0)
 #else
 #define LLTRACE_RESUME_FRAME() ((void)0)
index facdf2f78d28ea4fb21339eaae66026b3513c646..ec9b287541f016061aa117ca74277e2df96a12a2 100644 (file)
@@ -11416,7 +11416,7 @@ JUMP_TO_LABEL(error);
                 JUMP_TO_LABEL(exception_unwind);
             }
             /* Resume normal execution */
-            #ifdef LLTRACE
+            #ifdef Py_DEBUG
             if (frame->lltrace >= 5) {
                 lltrace_resume_frame(frame);
             }
@@ -11458,16 +11458,7 @@ JUMP_TO_LABEL(error);
                 JUMP_TO_LABEL(exit_unwind);
             }
             next_instr = frame->instr_ptr;
-            #ifdef LLTRACE
-            {
-                int lltrace = maybe_lltrace_resume_frame(frame, GLOBALS());
-                frame->lltrace = lltrace;
-                if (lltrace < 0) {
-                    JUMP_TO_LABEL(exit_unwind);
-                }
-            }
-            #endif
-
+            LLTRACE_RESUME_FRAME();
             #ifdef Py_DEBUG
             /* _PyEval_EvalFrameDefault() must not be called with an exception set,
                because it can clear it (directly or indirectly) and so the
index e81ceb29c64bf0628add918f32aaa58181952582..edd0c4bc7fdaa6cd23e67f5013f3bde3311a8037 100644 (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
 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/ceval.c:lltrace                                           static int lltrace
 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:nhandles                                  static int nhandles
index aa88608168c1be4d31bc9bee97c38ddb1d26470b..57cc587428c2b907158efebdd7d7310dcb0a8976 100644 (file)
@@ -676,7 +676,6 @@ NON_ESCAPING_FUNCTIONS = (
     "backoff_counter_triggers",
     "initial_temperature_backoff_counter",
     "JUMP_TO_LABEL",
-    "maybe_lltrace_resume_frame",
     "restart_backoff_counter",
 )
 
index 929f37d2dddea1e2757fed46a5f60e6de8570dd6..6ea04f5640ef05e13492ceda2cb7e72fc4fe4d0d 100644 (file)
@@ -81,6 +81,11 @@ do {                                                         \
 #undef WITHIN_STACK_BOUNDS
 #define WITHIN_STACK_BOUNDS() 1
 
+#undef LLTRACE_RESUME_FRAME
+#define LLTRACE_RESUME_FRAME() \
+    do {                       \
+    } while (0)
+
 #define TIER_TWO 2
 
 __attribute__((preserve_none)) _Py_CODEUNIT *