mirror of
https://github.com/python/cpython.git
synced 2025-10-09 16:34:44 +00:00
A smattering of cleanups in uop debug output and lltrace (#112980)
* Include destination T1 opcode in Error debug message * Include destination T1 opcode in DEOPT debug message * Remove obsolete comment from remove_unneeded_uops * Change lltrace_instruction() to print caller's opcode/oparg
This commit is contained in:
parent
fdee7b7b3e
commit
5b86644338
3 changed files with 11 additions and 10 deletions
|
@ -135,14 +135,14 @@ dump_stack(_PyInterpreterFrame *frame, PyObject **stack_pointer)
|
||||||
static void
|
static void
|
||||||
lltrace_instruction(_PyInterpreterFrame *frame,
|
lltrace_instruction(_PyInterpreterFrame *frame,
|
||||||
PyObject **stack_pointer,
|
PyObject **stack_pointer,
|
||||||
_Py_CODEUNIT *next_instr)
|
_Py_CODEUNIT *next_instr,
|
||||||
|
int opcode,
|
||||||
|
int oparg)
|
||||||
{
|
{
|
||||||
if (frame->owner == FRAME_OWNED_BY_CSTACK) {
|
if (frame->owner == FRAME_OWNED_BY_CSTACK) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
dump_stack(frame, stack_pointer);
|
dump_stack(frame, stack_pointer);
|
||||||
int oparg = next_instr->op.arg;
|
|
||||||
int opcode = next_instr->op.code;
|
|
||||||
const char *opname = _PyOpcode_OpName[opcode];
|
const char *opname = _PyOpcode_OpName[opcode];
|
||||||
assert(opname != NULL);
|
assert(opname != NULL);
|
||||||
int offset = (int)(next_instr - _PyCode_CODE(_PyFrame_GetCode(frame)));
|
int offset = (int)(next_instr - _PyCode_CODE(_PyFrame_GetCode(frame)));
|
||||||
|
@ -1051,9 +1051,10 @@ pop_2_error_tier_two:
|
||||||
pop_1_error_tier_two:
|
pop_1_error_tier_two:
|
||||||
STACK_SHRINK(1);
|
STACK_SHRINK(1);
|
||||||
error_tier_two:
|
error_tier_two:
|
||||||
DPRINTF(2, "Error: [UOp %d (%s), oparg %d, operand %" PRIu64 ", target %d @ %d]\n",
|
DPRINTF(2, "Error: [UOp %d (%s), oparg %d, operand %" PRIu64 ", target %d @ %d -> %s]\n",
|
||||||
uopcode, _PyUOpName(uopcode), next_uop[-1].oparg, next_uop[-1].operand, next_uop[-1].target,
|
uopcode, _PyUOpName(uopcode), next_uop[-1].oparg, next_uop[-1].operand, next_uop[-1].target,
|
||||||
(int)(next_uop - current_executor->trace - 1));
|
(int)(next_uop - current_executor->trace - 1),
|
||||||
|
_PyOpcode_OpName[frame->instr_ptr->op.code]);
|
||||||
OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
|
OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
|
||||||
frame->return_offset = 0; // Don't leave this random
|
frame->return_offset = 0; // Don't leave this random
|
||||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||||
|
@ -1064,14 +1065,15 @@ error_tier_two:
|
||||||
deoptimize:
|
deoptimize:
|
||||||
// On DEOPT_IF we just repeat the last instruction.
|
// On DEOPT_IF we just repeat the last instruction.
|
||||||
// This presumes nothing was popped from the stack (nor pushed).
|
// This presumes nothing was popped from the stack (nor pushed).
|
||||||
DPRINTF(2, "DEOPT: [UOp %d (%s), oparg %d, operand %" PRIu64 ", target %d @ %d]\n",
|
frame->instr_ptr = next_uop[-1].target + _PyCode_CODE(_PyFrame_GetCode(frame));
|
||||||
|
DPRINTF(2, "DEOPT: [UOp %d (%s), oparg %d, operand %" PRIu64 ", target %d @ %d -> %s]\n",
|
||||||
uopcode, _PyUOpName(uopcode), next_uop[-1].oparg, next_uop[-1].operand, next_uop[-1].target,
|
uopcode, _PyUOpName(uopcode), next_uop[-1].oparg, next_uop[-1].operand, next_uop[-1].target,
|
||||||
(int)(next_uop - current_executor->trace - 1));
|
(int)(next_uop - current_executor->trace - 1),
|
||||||
|
_PyOpcode_OpName[frame->instr_ptr->op.code]);
|
||||||
OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
|
OPT_HIST(trace_uop_execution_counter, trace_run_length_hist);
|
||||||
UOP_STAT_INC(uopcode, miss);
|
UOP_STAT_INC(uopcode, miss);
|
||||||
frame->return_offset = 0; // Dispatch to frame->instr_ptr
|
frame->return_offset = 0; // Dispatch to frame->instr_ptr
|
||||||
_PyFrame_SetStackPointer(frame, stack_pointer);
|
_PyFrame_SetStackPointer(frame, stack_pointer);
|
||||||
frame->instr_ptr = next_uop[-1].target + _PyCode_CODE(_PyFrame_GetCode(frame));
|
|
||||||
Py_DECREF(current_executor);
|
Py_DECREF(current_executor);
|
||||||
// Fall through
|
// Fall through
|
||||||
// Jump here from ENTER_EXECUTOR
|
// Jump here from ENTER_EXECUTOR
|
||||||
|
|
|
@ -81,7 +81,7 @@
|
||||||
/* 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 LLTRACE
|
||||||
#define PRE_DISPATCH_GOTO() if (lltrace >= 5) { \
|
#define PRE_DISPATCH_GOTO() if (lltrace >= 5) { \
|
||||||
lltrace_instruction(frame, stack_pointer, next_instr); }
|
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
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
static void
|
static void
|
||||||
remove_unneeded_uops(_PyUOpInstruction *buffer, int buffer_size)
|
remove_unneeded_uops(_PyUOpInstruction *buffer, int buffer_size)
|
||||||
{
|
{
|
||||||
// Note that we don't enter stubs, those SET_IPs are needed.
|
|
||||||
int last_set_ip = -1;
|
int last_set_ip = -1;
|
||||||
bool maybe_invalid = false;
|
bool maybe_invalid = false;
|
||||||
for (int pc = 0; pc < buffer_size; pc++) {
|
for (int pc = 0; pc < buffer_size; pc++) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue