Skip to content

Commit 6656ba0

Browse files
committed
show stack infos when set PYTHON_OPT_DEBUG>4
1 parent bb25f72 commit 6656ba0

2 files changed

Lines changed: 83 additions & 0 deletions

File tree

Python/optimizer_analysis.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#ifdef Py_DEBUG
4040
extern const char *_PyUOpName(int index);
4141
extern void _PyUOpPrint(const _PyUOpInstruction *uop);
42+
extern void _PyUOpSymPrint(JitOptRef ref);
4243
static const char *const DEBUG_ENV = "PYTHON_OPT_DEBUG";
4344
static inline int get_lltrace(void) {
4445
char *uop_debug = Py_GETENV(DEBUG_ENV);
@@ -50,6 +51,38 @@
5051
}
5152
#define DPRINTF(level, ...) \
5253
if (get_lltrace() >= (level)) { printf(__VA_ARGS__); }
54+
55+
56+
57+
static void
58+
dump_abstract_stack(_Py_UOpsAbstractFrame *frame, JitOptRef *stack_pointer)
59+
{
60+
JitOptRef *stack_base = frame->stack;
61+
JitOptRef *locals_base = frame->locals;
62+
printf(" locals=[");
63+
for (JitOptRef *ptr = locals_base; ptr < stack_base; ptr++) {
64+
if (ptr != locals_base) {
65+
printf(", ");
66+
}
67+
_PyUOpSymPrint(*ptr);
68+
}
69+
printf("]\n");
70+
if (stack_pointer < stack_base) {
71+
printf(" stack=%d\n", (int)(stack_pointer - stack_base));
72+
}
73+
else {
74+
printf(" stack=[");
75+
for (JitOptRef *ptr = stack_base; ptr < stack_pointer; ptr++) {
76+
if (ptr != stack_base) {
77+
printf(", ");
78+
}
79+
_PyUOpSymPrint(*ptr);
80+
}
81+
printf("]\n");
82+
}
83+
fflush(stdout);
84+
}
85+
5386
#else
5487
#define DPRINTF(level, ...)
5588
#endif
@@ -381,6 +414,9 @@ optimize_uops(
381414

382415
#ifdef Py_DEBUG
383416
if (get_lltrace() >= 3) {
417+
if (get_lltrace() >= 5 && !CURRENT_FRAME_IS_INIT_SHIM()) {
418+
dump_abstract_stack(ctx->frame, stack_pointer);
419+
}
384420
printf("%4d abs: ", (int)(this_instr - trace));
385421
_PyUOpPrint(this_instr);
386422
printf(" ");

Python/optimizer_symbols.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,53 @@ static inline int get_lltrace(void) {
6868
}
6969
#define DPRINTF(level, ...) \
7070
if (get_lltrace() >= (level)) { printf(__VA_ARGS__); }
71+
72+
void
73+
_PyUOpSymPrint(JitOptRef ref)
74+
{
75+
if (PyJitRef_IsNull(ref)) {
76+
printf("<JitRef NULL>");
77+
return;
78+
}
79+
JitOptSymbol *sym = PyJitRef_Unwrap(ref);
80+
switch (sym->tag) {
81+
case JIT_SYM_UNKNOWN_TAG:
82+
printf("<UNKNOWN at %p>", (void *)sym);
83+
break;
84+
case JIT_SYM_NULL_TAG:
85+
printf("<NULL at %p>", (void *)sym);
86+
break;
87+
case JIT_SYM_NON_NULL_TAG:
88+
printf("<!NULL at %p>", (void *)sym);
89+
break;
90+
case JIT_SYM_BOTTOM_TAG:
91+
printf("<BOTTOM at %p>", (void *)sym);
92+
break;
93+
case JIT_SYM_TYPE_VERSION_TAG:
94+
printf("<v%u at %p>", sym->version.version, (void *)sym);
95+
break;
96+
case JIT_SYM_KNOWN_CLASS_TAG:
97+
printf("<%s at %p>", sym->cls.type->tp_name, (void *)sym);
98+
break;
99+
case JIT_SYM_KNOWN_VALUE_TAG:
100+
printf("<%s val=%p at %p>", Py_TYPE(sym->value.value)->tp_name,
101+
(void *)sym->value.value, (void *)sym);
102+
break;
103+
case JIT_SYM_TUPLE_TAG:
104+
printf("<tuple[%d] at %p>", sym->tuple.length, (void *)sym);
105+
break;
106+
case JIT_SYM_TRUTHINESS_TAG:
107+
printf("<truthiness%s at %p>", sym->truthiness.invert ? "!" : "", (void *)sym);
108+
break;
109+
case JIT_SYM_COMPACT_INT:
110+
printf("<compact_int at %p>", (void *)sym);
111+
break;
112+
default:
113+
printf("<tag=%d at %p>", sym->tag, (void *)sym);
114+
break;
115+
}
116+
}
117+
71118
#else
72119
#define DPRINTF(level, ...)
73120
#endif

0 commit comments

Comments
 (0)