Files
psxrecomp/runtime/codegen_hash_sources.cmake
T
Matthew Stanley 4ce56cbc46 cache tag: hash the image view and the walker headers too
codegen_hash_sources.cmake is the canonical list of files folded into the
overlay cache tag, and its own header comment records why the list keeps
growing: something that changes emitted code but is not listed leaves the tag
put, existing DLLs keep loading, and new shards are stamped with the current
tag carrying different semantics. The comment names the 2026-07-03 instance
(full_function_emitter.cpp changed, only the .h files were listed).

The image VIEW was missing, one level below that. ps1_exe_parser.h now decides
what the emitter is allowed to see at all: it carries the READ bound
(end_address) and the ANALYSIS bound (analysis_end_address, which stops short
of an overlay capture's trailing delay-slot guard words), and
ps1_exe_parser.cpp decodes the producer's guard-byte declaration. A change
confined to either file moves every overlay shard's CFG -- measured in the
previous commit as a real change to Tomba 2's 0x8010A000 shard -- while leaving
the tag untouched. That is the same stale-but-same-tag hazard, reachable from a
one-line edit.

Adds ps1_exe_parser.h, ps1_exe_parser.cpp, and the headers of the walker and
analysis translation units already on the list (control_flow.h,
function_analysis.h, basic_block.h, code_generator.h) for the same reason: their
structs and bounds helpers are part of the emitter contract even when the .cpp
files do not move.

Verified the two independent computations still agree after the change --
runtime/include/overlay_codegen_hash.h says 0x73277fff and psxrecomp-game
--codegen-hash reports 73277fff -- so the stale-recompiler guard in
compile_overlays.py passes rather than being bypassed.

This bumps the tag, which is the intended effect: every existing overlay cache
is invalidated and resharded, because the analysis in the previous commit really
did change.

Bead beads-eio.3.100.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-02 15:35:30 -07:00

71 lines
4.6 KiB
CMake

# codegen_hash_sources.cmake — the CANONICAL list of recompiler codegen sources
# folded into the overlay cache tag hash (hash_codegen.cmake).
#
# Included from BOTH:
# - runtime/runtime.cmake (bakes the hash into the runtime's cg tag)
# - recompiler/CMakeLists.txt (bakes the SAME hash into psxrecomp-game,
# exposed via `--codegen-hash`)
# so the two hash computations can never drift by list divergence. Any file
# added to the emitter pipeline must be added HERE, once.
#
# Input: PSXRECOMP_CODEGEN_HASH_ROOT — the psxrecomp repo root.
# Output: PSXRECOMP_CODEGEN_HASH_SRCS — absolute paths to hash.
# NOTE: include the emitter .cpp translation units, not just their headers. A
# change confined to full_function_emitter.cpp (e.g. the 2026-07-03 Class-A
# shell-window overlay-dispatch fix) alters both generated dispatch and overlay
# code but left the hash unchanged when only the .h files were listed — a stale
# overlay-cache hazard (same class as the "ws emission not in cg hash" gap).
set(PSXRECOMP_CODEGEN_HASH_SRCS
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/src/code_generator.cpp
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/src/mips_decoder.cpp
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/src/control_flow.cpp
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/src/basic_block.cpp
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/src/function_analysis.cpp
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/src/recompiler_patch.cpp
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/src/recompiler_patch.h
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/src/full_function_emitter.cpp
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/src/full_function_emitter.h
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/src/strict_translator.cpp
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/src/strict_translator.h
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/src/pgxp_hook_emitter.cpp
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/src/pgxp_hook_emitter.h
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/src/function_discovery.cpp
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/src/function_discovery.h
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/include/gte_register_classification.h
# --- image view + walker headers ------------------------------------------
# Same gap as the .cpp/.h note above, one level down. The image VIEW decides
# what the emitter is even allowed to see: ps1_exe_parser.h now carries two
# distinct bounds (the READ bound end_address() and the ANALYSIS bound
# analysis_end_address(), which stops short of an overlay capture's trailing
# delay-slot guard words), and ps1_exe_parser.cpp decodes the producer's
# guard-byte declaration. A change confined to either would move every
# overlay shard's CFG while leaving the cg tag untouched — precisely the
# stale-but-same-tag hazard this list exists to prevent. The walker/analysis
# headers are listed for the same reason: their structs and bounds helpers
# are part of the emitter contract even when the .cpp files do not move.
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/include/ps1_exe_parser.h
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/src/ps1_exe_parser.cpp
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/include/control_flow.h
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/include/function_analysis.h
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/include/basic_block.h
${PSXRECOMP_CODEGEN_HASH_ROOT}/recompiler/include/code_generator.h
# --- Shard COMPILE surface -------------------------------------------------
# The cg tag must invalidate on anything a shard compiles/links against, not
# just what the emitter WRITES. A change to the overlay ABI header, the
# CPUState layout, or the dispatch-shim link contract leaves the emitter
# sources untouched — so without these the tag stayed put, existing DLLs kept
# loading, and every NEW shard silently failed to compile against the moved-on
# runtime (the recurring "header change broke the shards" class). Folding the
# compile surface in makes such a change reshard SAME-TREE instead of breaking
# silently. overlay_api.h pulls cpu_state.h and its cycle-helper headers; the
# .inc is the shim every shard links against.
${PSXRECOMP_CODEGEN_HASH_ROOT}/runtime/include/overlay_api.h
${PSXRECOMP_CODEGEN_HASH_ROOT}/runtime/include/cpu_state.h
${PSXRECOMP_CODEGEN_HASH_ROOT}/runtime/include/pgxp_hooks.h
${PSXRECOMP_CODEGEN_HASH_ROOT}/runtime/include/psx_cyc.h
${PSXRECOMP_CODEGEN_HASH_ROOT}/runtime/include/psx_cycles.h
${PSXRECOMP_CODEGEN_HASH_ROOT}/runtime/include/overlay_dispatch_preamble.c.inc)