@@ -446,7 +446,8 @@ translate_bytecode_to_trace(
446
446
#define DPRINTF (level , ...)
447
447
#endif
448
448
449
- #define ADD_TO_TRACE (OPCODE , OPARG , OPERAND ) \
449
+
450
+ #define ADD_TO_TRACE (OPCODE , OPARG , OPERAND , TARGET ) \
450
451
DPRINTF(2, \
451
452
" ADD_TO_TRACE(%s, %d, %" PRIu64 ")\n", \
452
453
uop_name(OPCODE), \
@@ -458,6 +459,7 @@ translate_bytecode_to_trace(
458
459
trace[trace_length].opcode = (OPCODE); \
459
460
trace[trace_length].oparg = (OPARG); \
460
461
trace[trace_length].operand = (OPERAND); \
462
+ trace[trace_length].target = (TARGET); \
461
463
trace_length++;
462
464
463
465
#define INSTR_IP (INSTR , CODE ) \
@@ -493,7 +495,7 @@ translate_bytecode_to_trace(
493
495
if (trace_stack_depth >= TRACE_STACK_SIZE) { \
494
496
DPRINTF(2, "Trace stack overflow\n"); \
495
497
OPT_STAT_INC(trace_stack_overflow); \
496
- ADD_TO_TRACE(_SET_IP, 0, 0); \
498
+ ADD_TO_TRACE(_SET_IP, 0, 0, 0 ); \
497
499
goto done; \
498
500
} \
499
501
trace_stack[trace_stack_depth].code = code; \
@@ -517,18 +519,22 @@ translate_bytecode_to_trace(
517
519
top : // Jump here after _PUSH_FRAME or likely branches
518
520
for (;;) {
519
521
RESERVE_RAW (3 , "epilogue" ); // Always need space for _SET_IP, _CHECK_VALIDITY and _EXIT_TRACE
520
- ADD_TO_TRACE (_SET_IP , INSTR_IP (instr , code ), 0 );
521
- ADD_TO_TRACE (_CHECK_VALIDITY , 0 , 0 );
522
+ ADD_TO_TRACE (_SET_IP , INSTR_IP (instr , code ), 0 , 0 );
523
+ ADD_TO_TRACE (_CHECK_VALIDITY , 0 , 0 , INSTR_IP ( instr , code ) );
522
524
523
525
uint32_t opcode = instr -> op .code ;
524
526
uint32_t oparg = instr -> op .arg ;
525
527
uint32_t extras = 0 ;
526
528
527
- while (opcode == EXTENDED_ARG ) {
529
+ if (opcode == EXTENDED_ARG ) {
528
530
instr ++ ;
529
531
extras += 1 ;
530
532
opcode = instr -> op .code ;
531
533
oparg = (oparg << 8 ) | instr -> op .arg ;
534
+ if (opcode == EXTENDED_ARG ) {
535
+ instr -- ;
536
+ goto done ;
537
+ }
532
538
}
533
539
534
540
if (opcode == ENTER_EXECUTOR ) {
@@ -554,7 +560,7 @@ translate_bytecode_to_trace(
554
560
DPRINTF (4 , "%s(%d): counter=%x, bitcount=%d, likely=%d, uopcode=%s\n" ,
555
561
uop_name (opcode ), oparg ,
556
562
counter , bitcount , jump_likely , uop_name (uopcode ));
557
- ADD_TO_TRACE (uopcode , max_length , 0 );
563
+ ADD_TO_TRACE (uopcode , max_length , 0 , INSTR_IP ( instr , code ) );
558
564
if (jump_likely ) {
559
565
_Py_CODEUNIT * target_instr = next_instr + oparg ;
560
566
DPRINTF (2 , "Jump likely (%x = %d bits), continue at byte offset %d\n" ,
@@ -569,7 +575,7 @@ translate_bytecode_to_trace(
569
575
{
570
576
if (instr + 2 - oparg == initial_instr && code == initial_code ) {
571
577
RESERVE (1 , 0 );
572
- ADD_TO_TRACE (_JUMP_TO_TOP , 0 , 0 );
578
+ ADD_TO_TRACE (_JUMP_TO_TOP , 0 , 0 , 0 );
573
579
}
574
580
else {
575
581
OPT_STAT_INC (inner_loop );
@@ -653,7 +659,7 @@ translate_bytecode_to_trace(
653
659
expansion -> uops [i ].offset );
654
660
Py_FatalError ("garbled expansion" );
655
661
}
656
- ADD_TO_TRACE (uop , oparg , operand );
662
+ ADD_TO_TRACE (uop , oparg , operand , INSTR_IP ( instr , code ) );
657
663
if (uop == _POP_FRAME ) {
658
664
TRACE_STACK_POP ();
659
665
DPRINTF (2 ,
@@ -682,15 +688,15 @@ translate_bytecode_to_trace(
682
688
PyUnicode_AsUTF8 (new_code -> co_filename ),
683
689
new_code -> co_firstlineno );
684
690
OPT_STAT_INC (recursive_call );
685
- ADD_TO_TRACE (_SET_IP , 0 , 0 );
691
+ ADD_TO_TRACE (_SET_IP , 0 , 0 , 0 );
686
692
goto done ;
687
693
}
688
694
if (new_code -> co_version != func_version ) {
689
695
// func.__code__ was updated.
690
696
// Perhaps it may happen again, so don't bother tracing.
691
697
// TODO: Reason about this -- is it better to bail or not?
692
698
DPRINTF (2 , "Bailing because co_version != func_version\n" );
693
- ADD_TO_TRACE (_SET_IP , 0 , 0 );
699
+ ADD_TO_TRACE (_SET_IP , 0 , 0 , 0 );
694
700
goto done ;
695
701
}
696
702
// Increment IP to the return address
@@ -707,7 +713,7 @@ translate_bytecode_to_trace(
707
713
2 * INSTR_IP (instr , code ));
708
714
goto top ;
709
715
}
710
- ADD_TO_TRACE (_SET_IP , 0 , 0 );
716
+ ADD_TO_TRACE (_SET_IP , 0 , 0 , 0 );
711
717
goto done ;
712
718
}
713
719
}
@@ -732,7 +738,7 @@ translate_bytecode_to_trace(
732
738
assert (code == initial_code );
733
739
// Skip short traces like _SET_IP, LOAD_FAST, _SET_IP, _EXIT_TRACE
734
740
if (trace_length > 4 ) {
735
- ADD_TO_TRACE (_EXIT_TRACE , 0 , 0 );
741
+ ADD_TO_TRACE (_EXIT_TRACE , 0 , 0 , INSTR_IP ( instr , code ) );
736
742
DPRINTF (1 ,
737
743
"Created a trace for %s (%s:%d) at byte offset %d -- length %d+%d\n" ,
738
744
PyUnicode_AsUTF8 (code -> co_qualname ),
0 commit comments