
    xIj}.                       d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ej                  j                  d e e	e      j                         j                               ddlmZmZ  e	e      j                         j&                  d   Zedz  ZdZd	Zd
ZdZddZddZddZddZddZddZdddZ d dZ!d!dZ"d!dZ#dd"dZ$d#dZ%e&dk(  r e%        yy)$zLSummarize secondaryBranchState fill candidates in the current selector root.    )annotationsN)Path)read_sectionsva_to_offset   outiT ix5T i+T i`Y c                    d| dS )N0x08x values    L/home/exedev/hwanse/tools/summarize_save_selector_secondary_state_sources.pyhex32r          c{    c                    d| dS )Nr
   02xr   r   s    r   hex8r      r   r   c                v    t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )N   z<Ir   )r   lenstructunpack_from)exesectionsvaoffsets       r   dword_atr   !   s?    (B'F~!c#h.dC033r   c                    t        | ||dz
        }|y |dz  }|dk(  rdt        |dz
        ddS |dv rdt        |dz
        d	|d
ddS y )Nr         branchTargetOperandz>previous opcode 0x11 reads this dword as branch target operand)kind
ownerVaHexmeaning>      "   /   Y   \   streamOperandzprevious opcode 0xr   z% can consume this dword as an operand)r   r   )r   r   r   previousopcodes        r   operand_roler/   (   s    XrAv.H_F~)Q-W
 	

 //#Q-+F3<7\]
 	

 r   c                    | dz  dk7  ry | dz	  dz  }| dz	  dz  }t        |       t        |      t        |      |dk(  rdnd|dk  dS )	Nr!         r   primaryBranchStatesecondaryBranchState   )valueHexstreamPlus1HexhelperArgumentHex
stateTablehelperDispatchValid)r   r   )r   stream_plus_1
helper_args      r   decode_op10r=   <   sd    aZ4'M2+%J%L}-!*-.;q.@*F\)T1 r   c                `   | sd i i g dS | j                  d      xs g D ci c]  }|j                  d      | }}|j                  d      xs i }|j                  d      xs g }|D cg c]  }|j                  d      dk(  r| }}i }|D ]/  }|j                  d      xs d	}|j                  |d
      dz   ||<   1 t        |      ||j                  d      xs i |D cg c]5  }|j                  d      |j                  d      |j                  d      d7 c}dS c c}w c c}w c c}w )N)directWriterCountdirectWriteValueCountsrefKindCountsrefstablesnamer4   rB   r$   indexedWriteImmediatewriteValueHex-r   r   rA   refVaHex)rH   r$   rF   )getr   )	branch_statetablerC   	secondaryrB   refdirect_writerswrite_countsr   s	            r   secondary_direct_write_summaryrP   J   sa   !%&(	
 	
 5A4D4DX4N4TRTU5eii&UFU

128bI== &BD776?55 	N  $&L =(/C*..ua81<U= !0"."7=2 
 	  GGJ/!$!9
	  V
s   D!*D&":D+
c                >   t        |       }g }t        t        t        d      D ]{  }t	        | ||      }|t        |      }|s!|d   dk7  r*t        | ||      }|t        k  }dt        |      i||||r|d   sdn|s|d   rdn|rdnd	d
}	|j                  |	       } |D 	cg c]
  }	|	d   s	|	 }
}	|
D 	cg c]
  }	|	d   s	|	 }}	|D 	cg c]  }	|	j                  d      r|	 }}	|D 	cg c]  }	|	d   r	|	d   s|	 }}	t        |      }d}t        t               dt        t               t        t              t        t              ddt        |      t        |
      t        |      t        |      t        |      ||||dS c c}	w c c}	w c c}	w c c}	w )Nr   r9   r4   vaHexr:   z>candidate before frontier but helper arg is outside 0x00..0x0bzGvalid helper fill after frontier; cannot initialize the earlier blockerz!valid helper fill before frontierz,secondary opcode10-like dword after frontier)beforeFrontierReaderoperandRolerouteRelevancerS   rT   aD  No valid secondaryBranchState opcode 0x10 fill is present before the 0x00542b0c frontier reader in the current selector root. The only valid secondary fill-like candidate in this root appears after the frontier, so it cannot initialize the blocker. The secondaryBranchState table also has no direct indexedWriteImmediate refs in .text; its direct refs are handler reads/base loads rather than route-specific producers. The map1_01a->map2_02d branch therefore still depends on inherited runtime secondaryBranchState contents from an earlier helper/root or a still-untraced VM path.z..
0x00410c90z
0x00..0x0b)rootRangeHexfrontierReaderHexsecondaryBranchStateHexhelperVaHexhelperValidCaseRangeHexcandidateCountbeforeFrontierCountvalidBeforeFrontierCount"validBeforeFrontierNonOperandCountvalidAfterFrontierCountsecondaryDirectWrites
candidatesvalidAfterFrontier
conclusion)r   range
ROOT_STARTROOT_ENDr   r=   r/   FRONTIER_READERr   appendrI   rP   SECONDARY_TABLEr   )r   rJ   r   rb   r   r   decodedrolebefore_frontierrowbeforevalid_beforevalid_before_non_operandvalid_afterdirect_writesrd   s                   r   build_summaryrt   l   s   S!HJJ!, h+=e$< $::C2..U2Y

 %4 #73H+I Q '73H+I _ # 9C
 	#56 (Gc3/E+FcGFG#)HCS1F-GCHLH/;Z377=CYZZ",o3C8N4OTWXmTn3oKo2<@M	a  !,-Rh/@A"?3#(#9##/j/"6{$'$5.12J.K#&{#3!. )   HHZos6   %
F0F:
FFF&F0
F;FFc                h    dj                  d t        | j                               D              xs dS )Nz, c              3  0   K   | ]  \  }}| d |   yw):Nr   ).0keyr   s      r   	<genexpr>z format_counts.<locals>.<genexpr>   s     O*#uuAeW%Os   rG   )joinsorteditems)countss    r   format_countsr      s(    99Ov||~8NOOVSVVr   c                x   ddd| d    dd| d    dd| d	    dd
| d    d| d    dd| d    d| d    d| d    d| d    d| d    d| d   d    d| d   ddddt        | d   d          dt        | d   d           dd!dd"d#g}| d$   D ]  }|j                  d%      xs i }|j                  d&|d'    d(|d)    d(|d*    d(|d+    d,|d-   rd.nd/ d0|d1   rd.nd/ d0|j                  d2      xs d3 d4|j                  d5      xs d d0|d6    d7        |j                  d       d8j                  |      S )9Nz.# Save Selector Secondary Branch-State Sources z- root range: `rW   `z- frontier reader: `rX   z- secondaryBranchState: `rY   z- helper: `rZ   z` valid cases `r[   z&- secondary opcode10-like candidates: r\   z- before frontier: r]   z- valid before frontier: r^   z)- valid before frontier and not operand: r_   z- valid after frontier: r`   z'- direct secondaryBranchState writers: ra   r?   rd   z## Direct Secondary Table Refsz- ref kinds: rA   z- direct write values: r@   z&## Current Root Opcode 0x10 Candidatesza| va | value | stream+1 | helper arg | valid | before frontier | operand role | route relevance |z1| --- | --- | --- | --- | --- | --- | --- | --- |rb   rT   z| `rR   z` | `r6   r7   r8   z` | r:   yesnoz | rS   r$   rG    r%   rU   z |
)r   rI   ri   r{   )summarylinesrn   rl   s       r   markdownr      s   8

'.12!4
w':;<A>
#G,E$F#GqI
gm,-_WE^=_<``ab
09I1J0KL
g&;<=>
#G,F$G#HI
3G<`4a3bc
"7+D#E"FG
1':Q2RSf2g1hi

(

g.E&F&WXYZ
!-8O0PQi0j"k!lm
0
k;1E4 |$ 
ww}%+#g,uS_$5U3?O;P:QQVWZ[nWoVppt12u=S#NdJeko@ppsxx&3'q,)?)E2(Fc#N^J_I``bd	

 
LL99Ur   c                6   | d   }dj                  d | d   D              }dj                  ddddt        j                  | d	          d
dt        j                  | d          dt        j                  | d          dt        j                  | d          d
d| d    d| d    d| d    d|d    d	dt        j                  t        |d                dt        j                  t        |d                ddt        j                  | d          dd |d!g      S )"Nra   r   c              3    K   | ]  }d t        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          d|d   rdnd	 d
|d   rdnd	 d
t        j                  t        |j                  d      xs i j                  d      xs d             d
t        j                  |d          d  yw)z<tr><td><code>rR   z</code></td><td><code>r6   r7   r8   z</code></td><td>r:   r   r   z	</td><td>rS   rT   r$   rG   rU   z
</td></tr>N)htmlescapestrrI   )rx   rn   s     r   rz   zhtml_page.<locals>.<genexpr>   s       	[[W./ 0[[Z12 3[[%5!678 9[[%8!9:; <12u= >23u> ?{{3 6 <"AA&IPSQRS T{{3/012 3		s   C#C%rb   z`<!doctype html><meta charset="utf-8"><title>Save Selector Secondary Branch-State Sources</title>z<style>body{font-family:system-ui,sans-serif;background:#111;color:#eee}table{border-collapse:collapse}td,th{border:1px solid #444;padding:6px 8px;vertical-align:top}code{color:#9bd4ff}</style>z5<h1>Save Selector Secondary Branch-State Sources</h1>z<p>Root range: <code>rW   z</code></p>z<p>Frontier reader: <code>rX   z%</code>; secondaryBranchState: <code>rY   z</code>; helper: <code>rZ   z<p>Valid before frontier: r^   z); valid before frontier and not operand: r_   z; valid after frontier: r`   z'; direct secondaryBranchState writers: r?   z</p>z%<p>Direct secondary table ref kinds: rA   z; direct write values: r@   z<p>rd   z<table><thead><tr><th>va</th><th>value</th><th>stream+1</th><th>helper arg</th><th>valid</th><th>before frontier</th><th>operand role</th><th>route relevance</th></tr></thead><tbody>z</tbody></table>)r{   r   r   r   )r   directrowss      r   	html_pager      s   ,-F99  <( D 99l 	L?
GN,C DE[Q
$T[[9L1M%N$OOtuy  vA  vA  BI  Jc  Bd  ve  uf  f}  ~B  ~I  ~I  JQ  R_  J`  ~a  }b  bm  	n
$W-G%H$IIrsz  |`  ta  sb  bz  {B  C\  {]  z^  ^E  FL  M`  Fa  Eb  bf  	g
/M&Q`Ja<b0c/dd{  }A  }H  }H  IV  W]  ^v  Ww  Ix  }y  |z  z~  	
dkk',/016 	A  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |:|j                  j                  dd       |j                  t        |       d	       y y )
NT)parentsexist_ok*save_selector_secondary_state_sources.jsonF),rw   )ensure_ascii
separatorsr   utf-8encoding)mkdir
write_textjsondumpsparentr   )r   out_dirhtml_outs      r   write_outputsr      s    MM$M.;;GG

7:FM H  dT:Ig.A r   c                    t        j                         } | j                  dt        t        dz         | j                  dt        t
        dz         | j                  dt        t
               | j                  dt        d d	       | j                         }|j                  j                         r/t        j                  |j                  j                  d
            nd }t        |j                  j                         |      }t        ||j                   |j"                         t%        d|j                   dz          y )Nz--exezHwanse2.exe)typedefaultz--branch-statezsave_selector_branch_state.jsonz	--out-dirz
--html-outz!Optional HTML report output path.)r   r   helpr   r   z(wrote secondary branch-state sources -> r   )argparseArgumentParseradd_argumentr   ROOTOUT
parse_argsrJ   existsr   loads	read_textrt   r   
read_bytesr   r   r   print)parserargsrJ   r   s       r   mainr      s	   $$&F
dD=4HI
(tSCd=de
$<
4DghD ##% 	

4$$...@A 
 DHH//1<@G'4<<7	4T\\Dp5p4q
rsr   __main__)r   intreturnr   )r   bytesr   
list[dict]r   r   r   z
int | None)r   r   r   r   r   r   r   dict | None)r   r   r   r   )rJ   r   r   dict)N)r   r   rJ   r   r   r   )r~   r   r   r   )r   r   r   r   )r   r   r   r   r   zPath | Noner   None)r   r   )'__doc__
__future__r   r   r   r   r   syspathlibr   pathinsertr   __file__resolver   probe_exe_scene_tablesr   r   r   r   r   rf   rg   rh   rj   r   r   r   r/   r=   rP   rt   r   r   r   r   r   __name__r   r   r   <module>r      s    R "     
  3tH~--/667 8 > H~''*
Ul
4(D9xW#L<Bt" zF r   