Skip to content

Feat: Settle what fingerprints leave open in rows made without a PDB - #210

Merged
b-re-w merged 4 commits into
developfrom
feat/rows-no-pdb-resolve
Nov 12, 2026
Merged

b-re-w merged 4 commits into
developfrom
feat/rows-no-pdb-resolve

Conversation

@b-re-w

@b-re-w b-re-w commented Nov 12, 2026

Copy link
Copy Markdown
Member

Summary

A row made without its PDB (#202) now tries to close what fingerprints leave open, and still never ships a guessed or carried value.

  • Functions with several fingerprint places, no place, or no fingerprint, and class tables whose holder was not found or that several tables match, are looked for by reading the prior build next to the new one (row_resolve.rs). Methods: calls into it from functions known in both builds (calls and RIP-relative references paired by the instructions before each site), its own calls to callees found by their own fingerprints, its slot in a class table known in both builds (slots lined up by comparing the neighbours, so a removed virtual shifts nothing wrongly), a text it uses that the new build holds once, and for tables, references from known functions and their slot contents. A place is taken only when two different methods name it, no method names another, and it is one of the fingerprint's places. Otherwise the review line gets the reason (...; not settled: the methods disagree: ...).
  • Values with no recipe (member offsets, slots, sizes, ids) are read from the instructions that use them: each use of the prior value in the functions of the row part (and their followed callees) is named by the two instructions on each side with operands cleared, and the same instruction is read in the new build. Taken only when at least two uses are read and all agree. Stack slots and frame sizes are never counted. Anything else keeps a review line and stays in carried; the 156 value is never accepted.
  • tabs.new_tab_delay_ms and the colour half of toolbar.dev.colours pairs are Rivet settings, not build values: kept from the prior row and listed in the new settings report field. The colour ids are still build values.
  • The x64 decoder now reports displacement and immediate positions, and a separate body decoder reads more instructions (lock/segment prefixes, VEX, more 0F opcodes) without changing what guards accept.
  • The PDB path (port_row) and the later PDB comparison are unchanged.

Notes for review

  • "calls into it" and "its calls" are counted as two different methods: they read different code (callers' bodies versus the candidate's body). If that should count as one method, non-virtual functions will almost never resolve.
  • Not built or tested in the worktree, by rule. Tests to run after merge: nfr6_the_operands_of_a_body_instruction_are_located, nfr6_a_function_with_several_places_takes_the_one_two_methods_agree_on, nfr6_methods_that_disagree_leave_the_function_unresolved, nfr6_one_method_alone_does_not_place_a_function, nfr6_a_place_outside_the_fingerprint_matches_is_refused, nfr6_a_carried_value_is_read_from_the_instructions_that_use_it, nfr6_a_value_no_instruction_gives_stops_the_row, nfr6_rivet_settings_are_not_values_of_the_build.

🤖 Generated with Claude Code

…a PDB

The decoder now says where an instruction's register displacement and
immediate are, a body decoder reads the instructions found past a
function start, and a module lists its exception table ranges. A row
made from fingerprints needs these to follow calls and to read member
offsets, slots and ids from the new build.
A row made without its PDB now reads the prior build next to the new one
for each address its fingerprint matched several places, no place, or
had no fingerprint. Calls into it from functions known in both builds,
its own calls to functions their fingerprints find, its slot in a class
table known in both, and the texts it uses each name a place. A place
is taken only when two different methods name it, no method names
another, and it is one of the fingerprint's places. Class tables are
found by references from known functions and by their slots. Anything
else keeps its review line with the reason.
A row made without its PDB no longer carries a member offset, slot,
size or id over from the prior row. Each use of the prior value in the
functions of its part of the row, and in the functions they call, is
named by the instructions around it, and the same instruction is read
in the new build. A value is taken only when two uses are read and all
agree. Any other value keeps its review line and stays listed as
carried, so the row is not published. Stack slots and frame sizes are
never taken for a use.

The new tab delay and the colours of the developer theme are Rivet's
own settings, not values of a build: they are kept from the prior row
and listed as settings in the report.
@b-re-w
b-re-w merged commit 211fdef into develop Nov 12, 2026
1 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant