
    eCi.                     0   d dl Z d dlmZ ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
  e j        d          Zd	 Zd
 Zd Zd Zd Zej        d             Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z ed           G d d                      Zd ZdS )    N)	dataclass   )webassembly)settings)exit_with_error)AtomicOpCodeMemoryOpCodeOpCodeextract_metadatac                     |                                  }|r1|                                  }|                                 }|dz  }|/d S d S )Nr   )	read_uleb	read_type)modulenum_local_declslocal_count
local_types       A/home/ngoprek/emsdk/upstream/emscripten/tools/extract_metadata.pyskip_function_headerr      se    $$&&/ ""$$K!!##JqO 	         c                 0   |                                   |                                  |                     |j                   t	          |            |j        |j        z   }|                                 |k    r
|                                 }	 t          |          }n# t          $ r Y dS w xY w|xt          j
        k    rE |                                 }|                     |          }t          |j                  dk    rdS nexxt          j        k    rnxt          j        k    rn n  |                                  n)xt          j        k    rnxt          j        k    rn n n	 dS |                                 |k    
|t          j        k    sJ dS )NFr   T)	get_typesget_function_typesseekoffsetr   sizetell	read_byter
   
ValueErrorCALLr   get_function_typelenparams	LOCAL_GET	LOCAL_SETENDRETURN)r   functionendopcodecalleecallee_types         r   is_orig_main_wrapperr,      s   ++hov(-'#Ff~~ff   UU
6;;;;!!##..v66{!""a''.6.f........6::::u% 	( 
6:					s   B 
B-,B-c                 P   t          |           dk    sJ | d         d         t          j        k    sJ | d         \  }}|xxt          j        k    rnxt          j        k    rn n  t          |          dk    sJ |d         S t          j        k    rdS 	 t          d|           d S )N   r   r   z#unexpected opcode in const expr: %s)r!   r
   r%   	I32_CONST	I64_CONST
GLOBAL_GETr   )exprr)   
immediatess      r   get_const_expr_valuer4   7   s    	Ta	avz	!	!	!	!Aw&*	,					,F,,,,,,,,__!!!!]				Q	
;VDDDDDr   c                 *    t          | j                  S N)r4   init)globls    r   get_global_valuer9   E   s    	ej	)	))r   c                    |                                  }|                     |          }|                     |j                   t	          |            |j        |j        z   }g }g }|                                 |k    rt          |                                           }|xxt          j	        k    rnFxt          j
        k    rn5xt          j        k    rn$xt          j        k    rnxt          j        k    rn n  n9xt          j        k    r |                                  nxxt          j        k    rnxt          j        k    rn n+  |                    |                                            nxxt          j        k    rnWxt          j        k    rnFxt          j        k    rn5xt          j        k    rn$xt          j        k    rnxt          j        k    rn n  |                                  nAxt          j        k    r* |                    |                                            nxt          j        k    r t;          |                                           }|xt:          j        k    rS |                                 }	||	         }
t?          |d                   }|||
<   |                                 }|dk    saJ xt:          j         k    r |                                 }|dk    s4J t:          j!        k    r|                                 }
n	 J d|z              nxt          j"        k    r tG          |                                           }|tF          j$        tF          j%        tF          j&        tF          j'        tF          j(        fv r)|                                  |                                  nJ d|z              nlt          j)        k    rO|                                 }tU          |          D ]}|                                 }|                                 }n	 J d|z              |                                 |k    |D ]}tW          | ||           dS )a  Very limited function parser that uses `memory.init` instructions
  to derive segment offset.

  When segments are passive they don't have an offset but (at least with
  llvm-generated code) are loaded during the start function
  (`__wasm_init_memory`) using `memory.init` instructions.

  Here we parse the `__wasm_init_memory` function and make many assumptions
  about its layout.  For example, we assume the first argument to `memory.init`
  is either an `i32.const` or the result of an `i32.add`.
  r   Fzunknown: %sN),get_segmentsget_functionr   r   r   r   r   r
   r   r%   NOPDROPI32_ADDI64_ADDBLOCKr   r/   r0   append	read_sleb
GLOBAL_SETBRr1   r$   r#   	LOCAL_TEEr   r   MEMORY_PREFIXr	   MEMORY_INITto_unsignedMEMORY_FILLMEMORY_DROPATOMIC_PREFIXr   ATOMIC_I32_RMW_CMPXCHGATOMIC_I32_STOREATOMIC_NOTIFYATOMIC_WAIT32ATOMIC_WAIT64BR_TABLErangeparse_function_for_memory_inits)r   
func_index
offset_mapsegmentsfuncr(   const_valuescall_targetsr)   segment_idxsegmentr   memorycount_depthdefaultts                     r   rU   rU   I   sL      ""(			Z	(	($++dkvdi#,,F$$&&''F
R:6::::




[V[[[[>6>>>>NFNNNNNNNN6<<<<.6.f........F,,..////u6yvyyyy+<6+<+<+<+<?Ov?O?O?O?ORbRXRbRbRbRbeuekeueueueueueueueu6;;;;F,,..////6f..0011'|'''' **,,K{+G b!122F"(Jw%%''FQ;;;;'|''''%%''FQ;;;;'''&&((G(0-&000006f..0011l9<;X"0,2L"02 2 2 












..
.
.
.
.???  ""u 	% 	%A""$$%%""$$$,mf,,,,[ 	d  ; ;a#FAz::::; ;r   c                 \    |                                  }|J i }t          | ||           |S r6   )	get_startrU   )r   start_func_indexrW   s      r   get_passive_segment_offsetsrg      s>    %%''		%	%	%*!&*:JGGG	r   c                     | dk     r| dz  S | S )Nr   l     )vals    r   rJ   rJ      s    1WW-  Jr   c                    |                                  }d |D             }|D ]C}t          t          |j                            }|&||k    r|||j        z   k     r	|||z
  fc S Dd |D             }|rFt          |           }|                                D ]"\  }}||k    r|||j        z   k     r	|||z
  fc S #t          d|z            )Nc                      g | ]}|j         	|S ri   r7   .0ss     r   
<listcomp>z-find_segment_with_address.<locals>.<listcomp>   s    ***!16*A***r   c                      g | ]}|j         	|S ri   rm   rn   s     r   rq   z-find_segment_with_address.<locals>.<listcomp>   s    ///1/Q///r   z&unable to find segment for address: %s)r<   rJ   r4   r7   r   rg   itemsAssertionError)r   addressrX   activesegr   passiverW   s           r   find_segment_with_addressry      s     ""(**x***& % %c-ch7788F~&Wv'8887V#$$$$/////' ',V44J!'')) ' 'V	F		w#():::Wv%&&&&?'IJJJr   c                 \    |                      d          } |                     dd          } | S )Nutf8z\\\)decodereplace)datas    r   data_to_stringr      s-    	V		$ 
fd	#	#$	+r   c                    d| }d| }||vs||vrt                               d|            i S ||         }||         }|                     |j                  }|                     |j                  }t	          t          |                    }	t	          t          |                    }
t          | |	          }|st          d| d|	            |\  }}i }|}|                     |j	        |j
                  }|
|	z
  }||z   }||k     rA|                    d|          }t          |||                   ||	|z
  |z   <   |dz   }||k     A|S )N__start___stop_z)no start/stop symbols found for section: z+unable to find segment starting at __start_z:     r   )loggerdebug
get_globalindexrJ   r9   ry   r   read_atr   r   findr   )r   
export_mapsection_name
start_name	stop_namestartr(   start_global
end_global
start_addrend_addrrw   
seg_offsetasm_strings	str_startr   r   str_ends                     r   get_section_stringsr      s   (,((*&&&)z!!Yj%@%@
LLK\KKLLLI
Z
 %9#""5;//,  ++*+L99::*)*5566(!&*55#	 `^,^^R\^^___/#z+)	
CH	-	-$	J	$T#Ciiy))G7Ed9U\K\F]7^7^K
Z')34!I 	C 
r   c                 
   t           j        rdS |                    d          p|                    d          }|r|j        t          j        j        k    rdS |                     |j                  }t          | |          rdS dS )NTmain__main_argc_argvF)
r   STANDALONE_WASMgetkindr   
ExternTypeFUNCr=   r   r,   )r   r   r   	main_funcs       r   get_main_reads_paramsr      s     4				E:>>2D#E#E$	 k49995!!$*--)&),,  5 
r   c                     i }|                                  D ]>}|j        t          j        j        k    r"|                     |j                  ||j        <   ?|S r6   )get_exportsr   r   r   r   r    r   namer   rtnes      r   get_function_exportsr      sV    
# 6 6av',,,,,QW55c!&k	*r   c                 .   g }|                                  D ]}}|j        t          j        j        k    r0|                    ||                     |j                  f           L|j        t          j        j        k    r|                    |d f           ~|S r6   )	r   r   r   r   GLOBALrC   r   r   r   r   s      r   get_other_exportsr      s    
#  av'...	jj!V&&qw//01111	
;).	.	.	jj!T	*r   c                 6   |j         }|                                 }g x}|_        g x}|_        i x}|_        |                                 D ]}|j        t          j        j	        k    rn|j
                            d          r|                    |j
                   Q|j
        |v r||j                 ||j
        <   |                    |j
                   |j        t          j        j        t          j        j        fv r|                    |j
                   d S )Ninvoke_)em_js_funcsr   importsinvoke_funcsem_js_func_typesget_importsr   r   r   r   field
startswithrC   typer   TAG)r   metadatar   typesr   r   r   is           r   read_module_importsr     s   $+




%!!'H)++,&133X. 	 	av',,,	
		I	&	&  AG$$$$7k!!&+AFm
17
#qw	
K*1;3I3MN	N	NnnQW	 	r   c                    t          j        |           5 }t          |          |_        t	          |          |_        d |                                D             |_        t          ||           d d d            d S # 1 swxY w Y   d S )Nc                 B    g | ]}|j                             d           S 	__em_js__r   removeprefixro   r   s     r   rq   z#update_metadata.<locals>.<listcomp>  s(    [[[AF//<<[[[r   )	r   Moduler   function_exportsr   other_exportsr   all_exportsr   )filenamer   r   s      r   update_metadatar     s    (## *v 4V < <H.v66H[[fFXFXFZFZ[[[H)))	* * * * * * * * * * * * * * * * * *s   AA>>BBc                     t          | |          \  }}|                     |j        |j                  }|                    d|          }t          |||                   S )Nr   )ry   r   r   r   r   r   )r   ru   rw   r   r   r   s         r   get_string_atr   #  sV    )&'::+#v	
CH	-	-$IIeV$$'	VG^,	-	--r   Frm   c                   :   e Zd ZU ee         ed<   ee         ed<   eeef         ed<   ee         ed<   eeef         ed<   eeej	        f         ed<   ee         ed<   ee         ed<   e
ed	<   eeej	        f         ed
<   eej                 ed<   ee         ed<   dS )Metadatar   exportem_asm_constsjs_depsr   r   featuresr   main_reads_paramsr   r   r   N)__name__
__module____qualname__liststr__annotations__dictintr   FuncTypeboolExportri   r   r   r   r   *  s         9
s)c3h9CH~k223333IS	k223333k())))Cyr   r   c                    i }t          j        |           5 }|                                }d |D             }|D ]}|j        t           j        j        k    r}|j                            d          rc|j                            d          }|	                    |j
                  }t          t          |                    }t          ||          ||<   |                                }	d |	                                D             }	d |	D             }	d |	D             }	d |	D             }	t!                      }
t#          |          |
_        t'          |          |
_        d |D             |
_        t-          ||d          |
_        d	 t-          ||d
                                          D             |
_        ||
_        |	|
_        t9          ||          |
_        t=          ||
           |
cd d d            S # 1 swxY w Y   d S )Nc                     i | ]
}|j         |S ri   )r   r   s     r   
<dictcomp>z$extract_metadata.<locals>.<dictcomp>@  s    ---!&!---r   r   c                 H    g | ]\  }}|t           j        j        k    d |  S )z	--enable-)r   TargetFeaturePrefixUSED)ro   featureuseds      r   rq   z$extract_metadata.<locals>.<listcomp>I  s6    |||-'4tWbWvW{O{O{%G%%O{O{O{r   c                 :    g | ]}|                     d d          S )z--enable-atomicsz--enable-threadsr~   ro   fs     r   rq   z$extract_metadata.<locals>.<listcomp>J  s(    TTTa		,.@AATTTr   c                 :    g | ]}|                     d d          S )z--enable-simd128z--enable-simdr   r   s     r   rq   z$extract_metadata.<locals>.<listcomp>K  s'    QQQ1		,o>>QQQr   c                 :    g | ]}|                     d d          S )z--enable-nontrapping-fptointz!--enable-nontrapping-float-to-intr   r   s     r   rq   z$extract_metadata.<locals>.<listcomp>L  s)    qqqcd		8:]^^qqqr   c                 B    g | ]}|j                             d           S r   r   r   s     r   rq   z$extract_metadata.<locals>.<listcomp>S  s(    NNNAF//<<NNNr   em_asmc                     g | ]}||S ri   ri   )ro   ds     r   rq   z$extract_metadata.<locals>.<listcomp>U  s    hhhafghhhhr   em_lib_deps)r   r   r   r   r   r   r   r   r   r   r   rJ   r9   r   get_target_featuresrs   r   r   r   r   r   r   r   r   valuesr   r   r   r   r   r   )r   r   r   exportsr   r   r   r8   string_addressr   r   s              r   r   r   :  sO   +(##  v  ""G--W---J B B	
;)0	0	0QV5F5F{5S5S	0v"";//!!!'**$%5e%<%<==)&.AAD))++H||8>>;K;K|||HTT8TTTHQQQQQHqqhpqqqH zzH 4V < <H.v66HNNgNNNH0XNNHhh#6vz=#Y#Y#`#`#b#bhhhH&H H!6vz!J!JH))) A                                   s   GG::G>G>) loggingdataclassesr    r   r   utilsr   r   r	   r
   	getLoggerr   r   r,   r4   r9   rU   memoizerg   rJ   ry   r   r   r   r   r   r   r   r   r   r   ri   r   r   <module>r      s    ! ! ! ! ! !             " " " " " " ; ; ; ; ; ; ; ; ; ;		-	.	.    <E E E* * *F; F; F;R     K K K*
 
 
  >  $      (* * *. . .        # # # # #r   