
    UHj                         d Z ddlmZ ddlZddlZddlZddlmZ  ee      j                         j                  d   Zedz  ZddZddZdd	Zdd
ZddZefddZddZedk(  r e        yy)zFSummarize selection-buffer use around save-selector frontier branches.    )annotationsN)Path   outc                0    t        | d      }||dz  z	  dz  S )N         )int)	value_hexindexvalues      L/home/exedev/hwanse/tools/summarize_save_selector_frontier_selection_flow.pybyte_at_wordr      s"    	2Eeai D((    c           
         | j                  d      xs d}| j                  d      |t        |d      dt        |d      dt        |d      dt        |d      ddS )	NvalueHex
0x00000000	opcodeHexr   0x02x   )r   r   streamPlus1streamPlus1HexstreamPlus2streamPlus2Hex)getr   )stepr   s     r   stream_fieldsr      sj    $4IXXk*#Iq1|Iq9#>?#Iq1|Iq9#>? r   c                x   |D ci c]  }|j                  d      | }}g }| D ]  }|j                  d      xs g D ]k  |j                  j                  d            xs$ |j                  j                  d            xs i }|j                  d      xs g }t        fd|D        d       }|st        d |D        i       }t        |      }	g }
|D ]  }|j                  d      |j                  d      k(  r n|j                  d      d	vr<t        |      }|
j                  |j                  d      |j                  d      |j                  d
      |j                  d      |d   |d   |j                  d      dk(  r
|d   dk(  rdn|j                  d      dk(  rdnd |j                  d      dk(  rdndd        j                  d      }|
D cg c],  }|j                  d      dk(  r|j                  d      |k(  r|. }}|j                  |j                  d      |j                  d      j                  d      j                  d      j                  d      |j                  d      j                  d      |
t	        |      t        |      |sdndd       n  |S c c}w c c}w ) NstreamVaHexbranchStepsleafPointerHextracec              3  j   K   | ]*  }|j                  d       j                  d      k(  s'| , yw)vaHexr!   Nr   ).0r   branchs     r   	<genexpr>zbuild_rows.<locals>.<genexpr>(   s*     Z$488G+<

=@Y+YZs   (33c              3  J   K   | ]  }|j                  d       dk(  s|  yw)r   0x11Nr'   r(   r   s     r   r*   zbuild_rows.<locals>.<genexpr>,   s!     #^Tdhh{>SW]>]D#^s   ##r&   r   >   0x100x12handlerVaHexr   r   r   r.   r   r   primaryBranchStatesecondaryBranchStatez5fill branch-state table from helper argument stream+2z=select/store active state slot into selectionBuffer[stream+2])r&   r   r0   r   selectionBufferOffsetHexselectionBufferOffset
stateTablemeaningr4   r/   sourcetarget	conditionr3   r5   zThe branch reads selectionBuffer[0x20], but this frontier stream does not write that offset before the branch. The value is inherited from wider runtime state; the next reverse-engineering step is tracing writers to context+0xa8+0x20.z8The branch offset is written earlier in the same stream.)r7   r8   r#   branchVaHexr9   branchSelectionBufferOffsetbranchSelectionBufferOffsetHexbranchStateTable
setupStepslocalWriterCounthasLocalWriterForBranchOffset
conclusion)r   nextr   appendlenbool)frontier_branchesstream_tracesrowtraces_by_streamrowsedger$   stepsbranch_stepbranch_fieldssetup_stepsr   fieldsbranch_offsetlocal_writesr)   s                  @r   
build_rowsrS       s   ?LM.3MMD! >hh}-3 =	F$((4D)EFJZJ^J^_e_i_ijw_xJy}EIIg&,"EZ%ZK "#^U#^`bc)+6MK 88G$(@@88K(0@@&t,""!XXg.!%+!6$(HH^$< $ 4067G0H-3M-B  88K0F:vm?TXY?Y -  88K0F: 4!  88K0F: P\#$ 4 #JJ'>?M!,88K(F2txx@W7X\i7i L  KK((8,((8,"(**-=">%zz-8#ZZ4/<28**=W2X$*JJ|$<)$'$515l1C
 (a T# U=	>~ KC NRs   J21J7c                   g d}| D ]  }dj                  d |j                  d      xs g D              xs d}|j                  d|j                  d       d|j                  d	       d|j                  d
       d|j                  d       d| d|j                  d      rdnd d|j                  d       d        | s|j                  d       |j                  d       dj                  |      S )N)z'# Save Selector Frontier Selection Flow zESelection-buffer offsets used before save-selector frontier branches.rU   zI| source | target | branch | setup offsets | local writer? | conclusion |z%| --- | --- | --- | --- | --- | --- |z, c              3  B   K   | ]  }|d     d|d    d|d      yw)r&    r   z->r3   N r-   s     r   r*   zmarkdown.<locals>.<genexpr>o   s:      
 G}oQtK01D9S4T3UV
s   r>   -z| r7   z | r8   r:   z `r9   z` | r@   yesnorA   z |z| - | - | - | - | - | - |rU   
)joinr   rC   )rJ   linesrH   setups       r   markdownr`   e   s   E  	
		 
-3
 
   	 	"#3swwx'8&9ww}%&b)=(>d5' ?@udK3swwWcOdNeegi	
	
 01	LL99Ur   c                   g }| D ]*  }dj                  d |j                  d      xs g D              xs d}|j                  dt        j                  |j                  d      xs d       dt        j                  |j                  d      xs d       d	t        j                  |j                  d
      xs d       dt        j                  |j                  d      xs d       d| d|j                  d      rdnd dt        j                  |j                  d      xs d       d       - dj                  dddddddddddd d!d"d#d$d%d&d'dj                  |      xs d( d)d*d+dg      S ),Nz<br>c              3     K   | ]<  }t        j                  |d     d|d    d|d    d|j                  d              > yw)r&   rW   r   z selectionBuffer[r3   z] r6   N)htmlescaper   r-   s     r   r*   zhtml_page.<locals>.<genexpr>   s]      

 	 KK=/4#4"55FtLfGgFhhj88I&')
s   AAr>   rY   z<tr><td>r7   z	</td><td>r8   z</td><td><code>r:   z</code><br><code>r9   z</code></td><td>r@   rZ   r[   rA   rU   z
</td></tr>r\   z<!doctype html>z<html lang="en">z<head>z  <meta charset="utf-8">zF  <meta name="viewport" content="width=device-width, initial-scale=1">z6  <title>Save Selector Frontier Selection Flow</title>z	  <style>z^    body { margin: 24px; background: #101010; color: #eee; font: 14px system-ui, sans-serif; }z5    table { border-collapse: collapse; width: 100%; }zM    th, td { border: 1px solid #333; padding: 6px 8px; vertical-align: top; }z9    th { background: #1d1d1d; position: sticky; top: 0; }z    code { color: #f5d76e; }z
  </style>z</head>z<body>z0  <h1>Save Selector Frontier Selection Flow</h1>zN  <p>Selection-buffer offsets used before save-selector frontier branches.</p>z  <table><thead><tr><th>source</th><th>target</th><th>branch</th><th>setup offsets</th><th>local writer?</th><th>conclusion</th></tr></thead>z	  <tbody>z&<tr><td colspan="6">No rows.</td></tr>z</tbody></table>z</body>z</html>)r]   r   rC   rc   rd   )rJ   bodyrH   r_   s       r   	html_pagerf   ~   s   D 
 

 -3
 
   	 	;;swwx07C89 :;;swwx07C89 :SWW]%;%BsCDDUVZVaVabebibijubvb}z}V~U @' GG$CD5$O P;;sww|4:;< =		

$ 99"P@h?WC&:X 	X
BGGDMO%OPP`a
-  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_ok*save_selector_frontier_selection_flow.jsonFr   )ensure_asciiindentr\   utf-8encoding)mkdir
write_textjsondumps)rJ   out_dirs     r   write_outputsru      sD    MM$M.;;GG

4eA6= H r   c                 R   t        j                  t              } | j                  dt        t
        dz         | j                  dt        t
        dz         | j                  dt        t
               | j                         }t        t        j                  |j                  j                  d	            t        j                  |j                  j                  d	                  }t        ||j                         t        d
t!        |       d|j                  dz          y )N)descriptionz--frontier-branchesz$save_selector_frontier_branches.json)typedefaultz--stream-tracesz save_selector_stream_traces.jsonz	--out-dirrm   rn   zwrote z selection-flow rows -> rj   )argparseArgumentParser__doc__add_argumentr   OUT
parse_argsrS   rr   loadsrF   	read_textrG   ru   rt   printrD   )parserargsrJ   s      r   mainr      s    $$9F
-D#HnBno
)cDf>fg
$<D

4))33W3EF

4%%///ABD $%	F3t9+5dllEq6q5r
str   __main__)r   strr   r   returnr   )r   dictr   r   )rF   
list[dict]rG   r   r   r   )rJ   r   r   r   )rJ   r   rt   r   r   None)r   r   )r|   
__future__r   rz   rc   rr   pathlibr   __file__resolverh   ROOTr~   r   r   rS   r`   rf   ru   r   __name__rX   r   r   <module>r      s    L "     H~''*
Ul)
	BJ2+\ 58 u zF r   