@@ -465,18 +465,6 @@ translate_bytecode_to_trace(
465
465
#define INSTR_IP (INSTR , CODE ) \
466
466
((uint32_t)((INSTR) - ((_Py_CODEUNIT *)(CODE)->co_code_adaptive)))
467
467
468
- #define ADD_TO_STUB (INDEX , OPCODE , OPARG , OPERAND ) \
469
- DPRINTF(2, " ADD_TO_STUB(%d, %s, %d, %" PRIu64 ")\n", \
470
- (INDEX), \
471
- uop_name(OPCODE), \
472
- (OPARG), \
473
- (uint64_t)(OPERAND)); \
474
- assert(reserved > 0); \
475
- reserved--; \
476
- trace[(INDEX)].opcode = (OPCODE); \
477
- trace[(INDEX)].oparg = (OPARG); \
478
- trace[(INDEX)].operand = (OPERAND);
479
-
480
468
// Reserve space for n uops
481
469
#define RESERVE_RAW (n , opname ) \
482
470
if (trace_length + (n) > max_length) { \
@@ -485,7 +473,7 @@ translate_bytecode_to_trace(
485
473
OPT_STAT_INC(trace_too_long); \
486
474
goto done; \
487
475
} \
488
- reserved = (n); // Keep ADD_TO_TRACE / ADD_TO_STUB honest
476
+ reserved = (n); // Keep ADD_TO_TRACE honest
489
477
490
478
// Reserve space for main+stub uops, plus 3 for _SET_IP, _CHECK_VALIDITY and _EXIT_TRACE
491
479
#define RESERVE (main , stub ) RESERVE_RAW((main) + (stub) + 3, uop_name(opcode))
@@ -495,7 +483,7 @@ translate_bytecode_to_trace(
495
483
if (trace_stack_depth >= TRACE_STACK_SIZE) { \
496
484
DPRINTF(2, "Trace stack overflow\n"); \
497
485
OPT_STAT_INC(trace_stack_overflow); \
498
- ADD_TO_TRACE(_SET_IP , 0, 0, 0); \
486
+ ADD_TO_TRACE(_EXIT_TRACE , 0, 0, 0); \
499
487
goto done; \
500
488
} \
501
489
trace_stack[trace_stack_depth].code = code; \
@@ -515,17 +503,19 @@ translate_bytecode_to_trace(
515
503
PyUnicode_AsUTF8 (code -> co_filename ),
516
504
code -> co_firstlineno ,
517
505
2 * INSTR_IP (initial_instr , code ));
518
-
506
+ uint32_t target = 0 ;
519
507
top : // Jump here after _PUSH_FRAME or likely branches
520
508
for (;;) {
509
+ target = INSTR_IP (instr , code );
521
510
RESERVE_RAW (3 , "epilogue" ); // Always need space for _SET_IP, _CHECK_VALIDITY and _EXIT_TRACE
522
- ADD_TO_TRACE (_SET_IP , INSTR_IP ( instr , code ), 0 , 0 );
523
- ADD_TO_TRACE (_CHECK_VALIDITY , 0 , 0 , INSTR_IP ( instr , code ) );
511
+ ADD_TO_TRACE (_SET_IP , target , 0 , target );
512
+ ADD_TO_TRACE (_CHECK_VALIDITY , 0 , 0 , target );
524
513
525
514
uint32_t opcode = instr -> op .code ;
526
515
uint32_t oparg = instr -> op .arg ;
527
516
uint32_t extras = 0 ;
528
517
518
+
529
519
if (opcode == EXTENDED_ARG ) {
530
520
instr ++ ;
531
521
extras += 1 ;
@@ -560,7 +550,7 @@ translate_bytecode_to_trace(
560
550
DPRINTF (4 , "%s(%d): counter=%x, bitcount=%d, likely=%d, uopcode=%s\n" ,
561
551
uop_name (opcode ), oparg ,
562
552
counter , bitcount , jump_likely , uop_name (uopcode ));
563
- ADD_TO_TRACE (uopcode , max_length , 0 , INSTR_IP ( instr , code ) );
553
+ ADD_TO_TRACE (uopcode , max_length , 0 , target );
564
554
if (jump_likely ) {
565
555
_Py_CODEUNIT * target_instr = next_instr + oparg ;
566
556
DPRINTF (2 , "Jump likely (%x = %d bits), continue at byte offset %d\n" ,
@@ -659,7 +649,7 @@ translate_bytecode_to_trace(
659
649
expansion -> uops [i ].offset );
660
650
Py_FatalError ("garbled expansion" );
661
651
}
662
- ADD_TO_TRACE (uop , oparg , operand , INSTR_IP ( instr , code ) );
652
+ ADD_TO_TRACE (uop , oparg , operand , target );
663
653
if (uop == _POP_FRAME ) {
664
654
TRACE_STACK_POP ();
665
655
DPRINTF (2 ,
@@ -688,15 +678,15 @@ translate_bytecode_to_trace(
688
678
PyUnicode_AsUTF8 (new_code -> co_filename ),
689
679
new_code -> co_firstlineno );
690
680
OPT_STAT_INC (recursive_call );
691
- ADD_TO_TRACE (_SET_IP , 0 , 0 , 0 );
681
+ ADD_TO_TRACE (_EXIT_TRACE , 0 , 0 , 0 );
692
682
goto done ;
693
683
}
694
684
if (new_code -> co_version != func_version ) {
695
685
// func.__code__ was updated.
696
686
// Perhaps it may happen again, so don't bother tracing.
697
687
// TODO: Reason about this -- is it better to bail or not?
698
688
DPRINTF (2 , "Bailing because co_version != func_version\n" );
699
- ADD_TO_TRACE (_SET_IP , 0 , 0 , 0 );
689
+ ADD_TO_TRACE (_EXIT_TRACE , 0 , 0 , 0 );
700
690
goto done ;
701
691
}
702
692
// Increment IP to the return address
@@ -713,7 +703,7 @@ translate_bytecode_to_trace(
713
703
2 * INSTR_IP (instr , code ));
714
704
goto top ;
715
705
}
716
- ADD_TO_TRACE (_SET_IP , 0 , 0 , 0 );
706
+ ADD_TO_TRACE (_EXIT_TRACE , 0 , 0 , 0 );
717
707
goto done ;
718
708
}
719
709
}
@@ -738,7 +728,7 @@ translate_bytecode_to_trace(
738
728
assert (code == initial_code );
739
729
// Skip short traces like _SET_IP, LOAD_FAST, _SET_IP, _EXIT_TRACE
740
730
if (trace_length > 4 ) {
741
- ADD_TO_TRACE (_EXIT_TRACE , 0 , 0 , INSTR_IP ( instr , code ) );
731
+ ADD_TO_TRACE (_EXIT_TRACE , 0 , 0 , target );
742
732
DPRINTF (1 ,
743
733
"Created a trace for %s (%s:%d) at byte offset %d -- length %d+%d\n" ,
744
734
PyUnicode_AsUTF8 (code -> co_qualname ),
0 commit comments