M6: addr_mode column on xrefs + extended store/load classes
Adds finer-grained addressing-mode classification to every data xref row plus new dispatch for instruction families not previously emitted: - New `xrefs.addr_mode VARCHAR NULL` column. NULL for control-flow edges (call / ind_call / j / br); one of d_form / lis_addi / lis_ori / multiword / x_form_indexed / x_form_byterev / atomic / dcbz for data edges. Index idx_xrefs_addr_mode. - New `xenia_analysis::xref::AddrMode` enum + Xref::addr_mode field. - Opcode 46/47 (lmw/stmw) expand to one xref per slot — D-form multi-word load/store now resolves all (32-rS) consecutive addresses. - Opcode 31 X-form dispatch — stwx/stbx/sthx/stwux/stbux/sthux/stdx/stdux, lwzx/lbzx/lhzx/lhax/lwzux/lbzux/lhzux/lhaux/ldx/ldux, stwcx./stdcx. (atomic), stwbrx/sthbrx/lwbrx/lhbrx (byte-reverse), dcbz (cache-line clear). - X-form rows are emitted ONLY when both rA and rB resolve to known constants (rare but present); the dominant runtime-indexed pattern remains correctly skipped. Sylpheed yield (regen on master + merge): - 442 newly-detected x_form_indexed reads (lwzx/lhzx into static tables). - 40 newly-detected atomic writes (stwcx./stdcx. with resolvable address). - 28,834 lis_addi refs, 18,485 d_form reads, 3,288 d_form writes — every pre-existing data row now tagged. - 0 multiword / dcbz / byterev (these instructions exist but aren't on lis+addi-tracked code paths). Tests 633→636 (+3 xref unit tests covering AddrMode tag uniqueness, data-edge addr_mode round-trip, control-edge None invariant). Schema golden updated (xrefs gains addr_mode column). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -390,7 +390,8 @@ impl DbWriter {
|
||||
CREATE TABLE xrefs (
|
||||
source BIGINT NOT NULL, -- VA of the referencing instruction
|
||||
target BIGINT NOT NULL, -- VA of the referenced destination
|
||||
kind VARCHAR NOT NULL, -- call | jump | branch | data_read | data_write | data_ref
|
||||
kind VARCHAR NOT NULL, -- call | ind_call | j | br | read | write | ref
|
||||
addr_mode VARCHAR, -- M6 sub-classification of how source computes target (NULL for control-flow)
|
||||
instruction VARCHAR, -- mnemonic of source instruction; NULL if not in binary
|
||||
source_func BIGINT, -- VA of the function containing source; NULL if unknown
|
||||
source_label VARCHAR, -- label at source; NULL if none
|
||||
@@ -418,6 +419,7 @@ impl DbWriter {
|
||||
("idx_methods_function", "CREATE INDEX idx_methods_function ON methods(function_address)"),
|
||||
("idx_classes_rtti", "CREATE INDEX idx_classes_rtti ON classes(rtti_present)"),
|
||||
("idx_strings_encoding", "CREATE INDEX idx_strings_encoding ON strings(encoding)"),
|
||||
("idx_xrefs_addr_mode", "CREATE INDEX idx_xrefs_addr_mode ON xrefs(addr_mode)"),
|
||||
("idx_xrefs_target", "CREATE INDEX idx_xrefs_target ON xrefs(target)"),
|
||||
("idx_xrefs_source", "CREATE INDEX idx_xrefs_source ON xrefs(source)"),
|
||||
("idx_xrefs_source_func", "CREATE INDEX idx_xrefs_source_func ON xrefs(source_func)"),
|
||||
@@ -1062,10 +1064,12 @@ fn insert_xrefs_streaming(
|
||||
xref.source, func_analysis, labels,
|
||||
);
|
||||
|
||||
let addr_mode = xref.addr_mode.map(|m| m.tag());
|
||||
appender.append_row(params![
|
||||
xref.source as i64,
|
||||
target as i64,
|
||||
kind,
|
||||
addr_mode,
|
||||
instruction.as_deref(),
|
||||
source_func,
|
||||
source_label.as_str(),
|
||||
|
||||
Reference in New Issue
Block a user