Skip to content

Commit de8a4e5

Browse files
authored
GH-111485: Generate TARGET table for computed goto dispatch. (GH-113319)
1 parent e96f260 commit de8a4e5

File tree

4 files changed

+58
-3
lines changed

4 files changed

+58
-3
lines changed

Makefile.pre.in

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1587,11 +1587,12 @@ regen-cases:
15871587
$(PYTHON_FOR_REGEN) \
15881588
$(srcdir)/Tools/cases_generator/generate_cases.py \
15891589
$(CASESFLAG) \
1590-
-t $(srcdir)/Python/opcode_targets.h.new \
15911590
-a $(srcdir)/Python/abstract_interp_cases.c.h.new \
15921591
$(srcdir)/Python/bytecodes.c
15931592
$(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/opcode_id_generator.py \
15941593
-o $(srcdir)/Include/opcode_ids.h.new $(srcdir)/Python/bytecodes.c
1594+
$(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/target_generator.py \
1595+
-o $(srcdir)/Python/opcode_targets.h.new $(srcdir)/Python/bytecodes.c
15951596
$(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/uop_id_generator.py \
15961597
-o $(srcdir)/Include/internal/pycore_uop_ids.h.new $(srcdir)/Python/bytecodes.c
15971598
$(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/py_metadata_generator.py \

Python/opcode_targets.h

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Tools/cases_generator/generate_cases.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -839,7 +839,6 @@ def main() -> None:
839839
# These raise OSError if output can't be written
840840

841841
a.assign_opcode_ids()
842-
a.write_opcode_targets(args.opcode_targets_h)
843842
a.write_abstract_interpreter_instructions(
844843
args.abstract_interpreter_cases, args.emit_line_directives
845844
)
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
"""Generate targets for computed goto dispatch
2+
Reads the instruction definitions from bytecodes.c.
3+
Writes the table to opcode_targets.h by default.
4+
"""
5+
6+
import argparse
7+
8+
from analyzer import (
9+
Analysis,
10+
analyze_files,
11+
)
12+
from generators_common import (
13+
DEFAULT_INPUT,
14+
ROOT,
15+
)
16+
from cwriter import CWriter
17+
from typing import TextIO
18+
19+
20+
DEFAULT_OUTPUT = ROOT / "Python/opcode_targets.h"
21+
22+
23+
def write_opcode_targets(analysis: Analysis, out: CWriter) -> None:
24+
"""Write header file that defines the jump target table"""
25+
targets = ["&&_unknown_opcode,\n"] * 256
26+
for name, op in analysis.opmap.items():
27+
if op < 256:
28+
targets[op] = f"&&TARGET_{name},\n"
29+
out.emit("static void *opcode_targets[256] = {\n")
30+
for target in targets:
31+
out.emit(target)
32+
out.emit("};\n")
33+
34+
arg_parser = argparse.ArgumentParser(
35+
description="Generate the file with dispatch targets.",
36+
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
37+
)
38+
39+
arg_parser.add_argument(
40+
"-o", "--output", type=str, help="Generated code", default=DEFAULT_OUTPUT
41+
)
42+
43+
arg_parser.add_argument(
44+
"input", nargs=argparse.REMAINDER, help="Instruction definition file(s)"
45+
)
46+
47+
if __name__ == "__main__":
48+
args = arg_parser.parse_args()
49+
if len(args.input) == 0:
50+
args.input.append(DEFAULT_INPUT)
51+
data = analyze_files(args.input)
52+
with open(args.output, "w") as outfile:
53+
out = CWriter(outfile, 0, False)
54+
write_opcode_targets(data, out)

0 commit comments

Comments
 (0)