From: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> Date: Fri, 7 Nov 2025 20:34:49 +0000 (+0000) Subject: Cleanup cases generator X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=46c079a710e2cd7c23b6a3631535a671fe3acf3a;p=thirdparty%2FPython%2Fcpython.git Cleanup cases generator --- diff --git a/Include/internal/pycore_opcode_metadata.h b/Include/internal/pycore_opcode_metadata.h index 18f8baf980e6..825321739c40 100644 --- a/Include/internal/pycore_opcode_metadata.h +++ b/Include/internal/pycore_opcode_metadata.h @@ -1189,7 +1189,7 @@ const struct opcode_metadata _PyOpcode_opcode_metadata[267] = { [INSTRUMENTED_RESUME] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG }, [INSTRUMENTED_RETURN_VALUE] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, [INSTRUMENTED_YIELD_VALUE] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ERROR_FLAG | HAS_ERROR_NO_POP_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, - [INTERPRETER_EXIT] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG | HAS_NEEDS_GUARD_IP_FLAG }, + [INTERPRETER_EXIT] = { true, INSTR_FMT_IX, HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, [IS_OP] = { true, INSTR_FMT_IB, HAS_ARG_FLAG | HAS_ESCAPES_FLAG }, [JUMP_BACKWARD] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, [JUMP_BACKWARD_JIT] = { true, INSTR_FMT_IBC, HAS_ARG_FLAG | HAS_JUMP_FLAG | HAS_EVAL_BREAK_FLAG | HAS_ERROR_FLAG | HAS_ESCAPES_FLAG }, diff --git a/Python/bytecodes.c b/Python/bytecodes.c index dfc7e2952420..ac308c918d0f 100644 --- a/Python/bytecodes.c +++ b/Python/bytecodes.c @@ -5485,33 +5485,33 @@ dummy_func( } tier2 op(_GUARD_IP__PUSH_FRAME, (ip/4 --)) { - _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_CORRESPONDING_UOP; + _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF(_PUSH_FRAME); if (target != (_Py_CODEUNIT *)ip) { - frame->instr_ptr += OFFSET_OF_CORRESPONDING_UOP; + frame->instr_ptr += OFFSET_OF(_PUSH_FRAME); EXIT_IF(true); } } tier2 op(_GUARD_IP_YIELD_VALUE, (ip/4 --)) { - _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_CORRESPONDING_UOP; + _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF(YIELD_VALUE); if (target != (_Py_CODEUNIT *)ip) { - frame->instr_ptr += OFFSET_OF_CORRESPONDING_UOP; + frame->instr_ptr += OFFSET_OF(YIELD_VALUE); EXIT_IF(true); } } tier2 op(_GUARD_IP_RETURN_VALUE, (ip/4 --)) { - _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_CORRESPONDING_UOP; + _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF(RETURN_VALUE); if (target != (_Py_CODEUNIT *)ip) { - frame->instr_ptr += OFFSET_OF_CORRESPONDING_UOP; + frame->instr_ptr += OFFSET_OF(RETURN_VALUE); EXIT_IF(true); } } tier2 op(_GUARD_IP_RETURN_GENERATOR, (ip/4 --)) { - _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_CORRESPONDING_UOP; + _Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF(RETURN_GENERATOR); if (target != (_Py_CODEUNIT *)ip) { - frame->instr_ptr += OFFSET_OF_CORRESPONDING_UOP; + frame->instr_ptr += OFFSET_OF(RETURN_GENERATOR); EXIT_IF(true); } } diff --git a/Python/executor_cases.c.h b/Python/executor_cases.c.h index 16db3e2efcfc..84ce8f862a9d 100644 --- a/Python/executor_cases.c.h +++ b/Python/executor_cases.c.h @@ -8,7 +8,6 @@ #endif #define TIER_TWO 2 - case _NOP: { break; } diff --git a/Tools/cases_generator/analyzer.py b/Tools/cases_generator/analyzer.py index 5bba28578bfe..532d5df14f41 100644 --- a/Tools/cases_generator/analyzer.py +++ b/Tools/cases_generator/analyzer.py @@ -984,7 +984,10 @@ def compute_properties(op: parser.CodeDef) -> Properties: no_save_ip=no_save_ip, tier=tier_variable(op), needs_prev=variable_used(op, "prev_instr"), - needs_guard_ip=(isinstance(op, parser.InstDef) and (unpredictable_jump and "replaced" not in op.annotations)) or variable_used(op, "LLTRACE_RESUME_FRAME") or variable_used(op, "DISPATCH_INLINED"), + needs_guard_ip=(isinstance(op, parser.InstDef) + and (unpredictable_jump and "replaced" not in op.annotations)) + or variable_used(op, "LOAD_IP") + or variable_used(op, "DISPATCH_INLINED"), unpredictable_jump=unpredictable_jump, ) diff --git a/Tools/cases_generator/tier2_generator.py b/Tools/cases_generator/tier2_generator.py index bff1a4370b48..b6eab511232e 100644 --- a/Tools/cases_generator/tier2_generator.py +++ b/Tools/cases_generator/tier2_generator.py @@ -63,7 +63,7 @@ class Tier2Emitter(Emitter): def __init__(self, out: CWriter, labels: dict[str, Label]): super().__init__(out, labels) self._replacers["oparg"] = self.oparg - self._replacers["OFFSET_OF_CORRESPONDING_UOP"] = self.offset_of_corresponding_uop + self._replacers["OFFSET_OF"] = self.offset_of def goto_error(self, offset: int, storage: Storage) -> str: # To do: Add jump targets for popping values. @@ -135,7 +135,7 @@ class Tier2Emitter(Emitter): self.out.emit_at(uop.name[-1], tkn) return True - def offset_of_corresponding_uop( + def offset_of( self, tkn: Token, tkn_iter: TokenIterator, @@ -144,14 +144,21 @@ class Tier2Emitter(Emitter): inst: Instruction | None, ) -> bool: assert uop.name.startswith("_GUARD_IP") - rest = uop.name[len("_GUARD_IP"):] - self.emit(f" OFFSET_OF{rest};\n") + # LPAREN + next(tkn_iter) + inst = next(tkn_iter) + self.emit(f" OFFSET_OF_{inst.text};\n") + # RPAREN + next(tkn_iter) + # SEMI next(tkn_iter) return True -def write_uop(uop: Uop, emitter: Emitter, stack: Stack) -> Stack: +def write_uop(uop: Uop, emitter: Emitter, stack: Stack, offset_strs: dict[str, tuple[str, str]]) -> Stack: locals: dict[str, Local] = {} try: + if name_offset_pair := offset_strs.get(uop.name): + emitter.emit(f"#define OFFSET_OF_{name_offset_pair[0]} ({name_offset_pair[1]})\n") emitter.out.start_line() if uop.properties.oparg: emitter.emit("oparg = CURRENT_OPARG();\n") @@ -172,6 +179,8 @@ def write_uop(uop: Uop, emitter: Emitter, stack: Stack) -> Stack: idx += 1 _, storage = emitter.emit_tokens(uop, storage, None, False) storage.flush(emitter.out) + if name_offset_pair: + emitter.emit(f"#undef OFFSET_OF_{name_offset_pair[0]}\n") except StackError as ex: raise analysis_error(ex.args[0], uop.body.open) from None return storage.stack @@ -179,21 +188,7 @@ def write_uop(uop: Uop, emitter: Emitter, stack: Stack) -> Stack: SKIPS = ("_EXTENDED_ARG",) -def generate_tier2( - filenames: list[str], analysis: Analysis, outfile: TextIO, lines: bool -) -> None: - write_header(__file__, filenames, outfile) - outfile.write( - """ -#ifdef TIER_ONE - #error "This file is for Tier 2 only" -#endif -#define TIER_TWO 2 -""" - ) - out = CWriter(outfile, 2, lines) - emitter = Tier2Emitter(out, analysis.labels) - out.emit("\n") +def populate_offset_strs(analysis: Analysis) -> dict[str, tuple[str, str]]: offset_strs: dict[str, tuple[str, str]] = {} for name, uop in analysis.uops.items(): if not f"_GUARD_IP_{name}" in analysis.uops: @@ -214,7 +209,23 @@ def generate_tier2( found = True assert offset_str offset_strs[f"_GUARD_IP_{name}"] = (name, offset_str) + return offset_strs +def generate_tier2( + filenames: list[str], analysis: Analysis, outfile: TextIO, lines: bool +) -> None: + write_header(__file__, filenames, outfile) + outfile.write( + """ +#ifdef TIER_ONE + #error "This file is for Tier 2 only" +#endif +#define TIER_TWO 2 +""" + ) + out = CWriter(outfile, 2, lines) + emitter = Tier2Emitter(out, analysis.labels) + offset_strs = populate_offset_strs(analysis) out.emit("\n") for name, uop in analysis.uops.items(): @@ -231,11 +242,7 @@ def generate_tier2( out.emit(f"case {uop.name}: {{\n") declare_variables(uop, out) stack = Stack() - if name_offset_pair := offset_strs.get(name): - out.emit(f"#define OFFSET_OF_{name_offset_pair[0]} ({name_offset_pair[1]})\n") - stack = write_uop(uop, emitter, stack) - if name_offset_pair: - out.emit(f"#undef OFFSET_OF_{name_offset_pair[0]}\n") + stack = write_uop(uop, emitter, stack, offset_strs) out.start_line() if not uop.properties.always_exits: out.emit("break;\n")