a
    xþd‰u  ã                   @   sp   d dl Z d dlZd dl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
 d dl	mZ daG dd„ deƒZdS )é    N)ÚFindTool)Ú	ToolSubstFc                   @   s®   e Zd Zdd„ Zdd„ Zd&dd„Zd'dd	„Zd
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d „Zg g d!dfd"d#„Zg d!dfd$d%„ZdS )*Ú
LLVMConfigc                 C   s  || _ || _|j}d| _tjdkr´d }t|dd ƒ}g d¢}| j  ||jd |¡}|d u rb|  	|¡}|d urz| j
d|dd |  g d¢¡ d| _| j js´tdu r´| j  d	 |¡¡ datj d
¡}|rÒtj |¡| _| jsâ| d¡ |  g d¢¡ t ¡ dkr| d¡ | d¡ n´t ¡ dkr.| d¡ nšt ¡ dkrH| d¡ n€t ¡ dv rb| d¡ nft ¡ dkr|| d¡ nLt ¡ dkr–| d¡ n2t ¡ dkr°| d¡ nt ¡ dkrÈ| d¡ t|dd ƒ}t|dd ƒ}	| d |	 ¡ |r||	kr| d!¡ t|d"d#ƒ}
td$d%„ |
 d&¡D ƒƒ}
d'|
v r@| d(¡ d)|
v rT| d*¡ d+|
v shd,|
v rr| d-¡ d.|
v r†| d/¡ t|d0d ƒ}|r¢| d1¡ t|d2d ƒ}|r¾| d3¡ |j d4d ¡}tj |¡rä| d5¡ |	rÎt d6|	¡r6| d7¡ t|d8d ƒ}d'|
v r6|  ||	¡r6| j
d9d:dd t d;|	¡rN| d<¡ t d=|	¡rh| d>¡ nft d?|	¡r‚| d@¡ nLt dA|	¡rœ| dB¡ n2t dC|	¡r¶| dB¡ nt dD|	¡rÎ| dE¡ |j dFd ¡}tj |¡r|j dGdH¡}|d ur|  
dI|¡ d S )JNFÚwin32Úlit_tools_dir)zcmp.exezgrep.exezsed.exezdiff.exezecho.exeÚPATHT©Úappend_path)ZSystemDriveZ
SystemRootÚTEMPÚTMPZPLATFORMzusing lit tools: {}ZLIT_USE_INTERNAL_SHELLÚshell)	ZASAN_SYMBOLIZER_PATHZHWASAN_SYMBOLIZER_PATHZMSAN_SYMBOLIZER_PATHZTSAN_SYMBOLIZER_PATHZ!UBSAN_SYMBOLIZER_PATHASAN_OPTIONSZHWASAN_OPTIONSZMSAN_OPTIONSZTSAN_OPTIONSZUBSAN_OPTIONSÚDarwinzsystem-linker-mach-ozsystem-darwinÚWindowszsystem-windowsÚLinuxzsystem-linux)ZFreeBSDzsystem-freebsdZNetBSDzsystem-netbsdZAIXz
system-aixÚSunOSzsystem-solariszOS/390z
system-zosÚhost_tripleÚtarget_triplez	target=%sZnativeZllvm_use_sanitizerÚ c                 s   s   | ]}|  ¡ V  qd S ©N)Úlower©Ú.0Úx© r   úX/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/lit/llvm/config.pyÚ	<genexpr>i   ó    z&LLVMConfig.__init__.<locals>.<genexpr>ú;ÚaddressZasanZ	hwaddressZhwasanZmemoryZmemorywithoriginsZmsanZ	undefinedZubsanÚ	have_zlibÚzlibÚ	have_zstdZzstdZrun_long_testsÚ
long_testsú^x86_64.*-applezx86_64-appleÚhost_cxxZASAN_OPTIONSzdetect_leaks=1z^x86_64.*-linuxzx86_64-linuxz^i.86.*z
target-x86z	^x86_64.*ztarget-x86_64z
^aarch64.*ztarget-aarch64z^arm64.*z^arm.*z
target-armÚuse_gmallocZgmalloc_pathz/usr/lib/libgmalloc.dylibZDYLD_INSERT_LIBRARIES)Ú
lit_configÚconfigÚavailable_featuresÚuse_lit_shellÚsysÚplatformÚgetattrZgetToolsPathÚenvironmentÚ_find_git_windows_unix_toolsÚwith_environmentÚwith_system_environmentÚquietÚlit_path_displayedÚnoteÚformatÚosÚenvironÚgetÚlitÚutilZpythonize_boolÚaddÚsystemÚ	frozensetÚsplitÚparamsÚreÚmatchÚget_clang_has_lsan)Úselfr&   r'   ÚfeaturesÚpathr   Zrequired_toolsZlit_shell_envr   r   Z
sanitizersr   r!   r"   r$   r%   Zgmalloc_path_strr   r   r   Ú__init__   sÊ    
þ
ÿ
















ÿÿ

ÿ
ÿzLLVMConfig.__init__c              	   C   s  t jdksJ ‚t jjdkr$dd l}ndd l}d|jg}|j|jg}t	 
||¡D ]¸\}}zž| |dd|j|B ¡t}| |d¡\}}	|s”W d   ƒ W qNtj |dd¡}
tj |
|¡sÂW d   ƒ W qNtj |
¡W  d   ƒ W   S 1 sè0    Y  W qN   Y qNY qN0 qNd S )Nr   é   r   zSOFTWARE\GitForWindowsZInstallPathZusrÚbin)r*   r+   Úversion_infoÚmajorÚwinregÚ_winregZKEY_WOW64_64KEYÚHKEY_LOCAL_MACHINEÚHKEY_CURRENT_USERÚ	itertoolsÚproductÚOpenKeyZKEY_READÚQueryValueExr5   rD   Újoinr8   r9   ZcheckToolsPathÚ	to_string)rB   Ztools_neededrJ   ÚmasksZhivesÚmaskZhiveÚkeyZinstall_rootÚ_Zcandidate_pathr   r   r   r.   ž   s0    


ÿÿ4z'LLVMConfig._find_git_windows_unix_toolsFc              	      sº   |rª|}t j |¡r|g}dd„ ‰ | jj |d ¡}|rX| tjj	¡}‡ fdd„|D ƒ}ng }t
|ƒD ]8}ˆ |ƒ}z| |¡ W n ty   Y n0 |g| }qdtj	 |¡}|| jj|< d S )Nc                 S   s   t j t j | ¡¡S r   )r5   rD   ÚnormcaseÚnormpath)r   r   r   r   ÚnormÄ   s    z)LLVMConfig.with_environment.<locals>.normc                    s   g | ]}ˆ |ƒ‘qS r   r   )r   Úp©rZ   r   r   Ú
<listcomp>Ê   r   z/LLVMConfig.with_environment.<locals>.<listcomp>)r8   r9   Ú	is_stringr'   r-   r7   r=   r5   rD   ÚpathsepÚreversedÚremoveÚ
ValueErrorrR   )rB   ÚvariableÚvaluer	   Zpaths_to_addZcurrent_pathsÚpathsr[   r   r\   r   r/   ¼   s&    zLLVMConfig.with_environmentc                 C   s>   t j |¡r|g}|D ]"}tj |¡}|r|  |||¡ qd S r   )r8   r9   r^   r5   r6   r7   r/   )rB   Ú	variablesr	   Úvrd   r   r   r   r0   Ý   s    z"LLVMConfig.with_system_environmentc                 C   s$   |D ]}|| j jv r| j j|= qd S r   )r'   r-   )rB   rf   Únamer   r   r   Úclear_environmentå   s    zLLVMConfig.clear_environmentc                 C   sp   zHt j|t jt j| jjd}| ¡ \}}tj |¡}tj |¡}||fW S  t	yj   | j
 d| ¡ Y n0 d S )N)ÚstdoutÚstderrÚenvzCould not run process %s)Ú
subprocessÚPopenÚPIPEr'   r-   Úcommunicater8   r9   rS   ÚOSErrorr&   Úfatal)rB   ÚcommandÚcmdrj   rk   r   r   r   Úget_process_outputê   s    
þ
zLLVMConfig.get_process_outputc                 C   s¦   dd„ |D ƒ}t j | jjd¡}|  |g| ¡\}}| d¡}t||ƒD ]X\}\}}t|ƒrt||ƒ}	| jj	 
|	¡ qH| ¡ D ]"\}
}t |
|¡r|| jj	 |¡ q|qHd S )Nc                 S   s   g | ]\}}|‘qS r   r   )r   r   rW   r   r   r   r]   ø   r   z-LLVMConfig.feature_config.<locals>.<listcomp>zllvm-configÚ
)r5   rD   rR   r'   Úllvm_tools_dirru   r=   ÚzipÚcallabler(   ÚupdateÚitemsr?   Úsearchr:   )rB   rC   Ú	argumentsZconfig_pathÚoutputrW   ÚlinesZfeature_lineÚpatternsZfeatures_to_addZ
re_patternÚfeaturer   r   r   Úfeature_configö   s    
zLLVMConfig.feature_configc                 C   sV   |   |dg¡\}}|s.t|ƒ | j d| ¡ | ¡ }tjdv rR| jsR| dd¡}|S )Nz-print-file-name=includez.Couldn't find the include dir for Clang ('%s'))r   ú\ú/)	ru   Úprintr&   rr   Ústripr*   r+   r)   Úreplace)rB   ÚclangZ	clang_dirrW   r   r   r   Úget_clang_builtin_include_dir  s    ÿÿz(LLVMConfig.get_clang_builtin_include_dirc           
      C   sÄ   |s| j  d¡ dS | ¡ d }|  |dg¡\}}d|vrR| j  d| d ¡ dS t d|¡rbd	S t d
|¡rÀt d|¡}t| d¡ƒ}t| d¡ƒ}t| d¡ƒ}	d|v s´d|v r¸dS |dkS dS )NzHconfig.host_cxx is unset but test suite is configured to use sanitizers.Fr   z	--versionrˆ   z+compiler '%s' does not appear to be clang, z/but test suite is configured to use sanitizers.z.*-linuxTr#   z#version ([0-9]+)\.([0-9]+).([0-9]+)é   é   rF   z
Apple LLVMzApple clangé   )	r&   Úwarningr=   ru   r?   r@   r|   ÚintÚgroup)
rB   rˆ   ÚtripleZclang_binaryÚversion_stringrW   Úversion_regexZmajor_version_numberZminor_version_numberZpatch_version_numberr   r   r   rA      s>    ÿÿÿÿÿÿzLLVMConfig.get_clang_has_lsanc                 C   s`   t  d|¡}|s | j d| ¡ | d¡ ¡ dkr6|S | d¡d | d¡ d | d¡ d S )	Nú(\w+)-(\w+)-(\w+)z+Could not turn '%s' into Itanium ABI triplerF   ÚwindowsrŠ   ú-r‹   z-gnu)r?   r@   r&   rr   r   r   )rB   r   Úmr   r   r   Úmake_itanium_abi_tripleA  s    ÿz"LLVMConfig.make_itanium_abi_triplec                 C   s”   t  d|¡}|s | j d| ¡ | d¡ ¡ }| d¡ ¡ }| d¡ ¡ }|dkrbt  d|¡rb|S | d¡s€|d	ks€t  d
|¡r|d | d S dS )Nr“   z&Could not turn '%s' into MS ABI triplerŠ   r‹   rF   r”   z.*-msvc$Úx86Úamd64zi\d86r•   z-windows-msvczi686-pc-windows-msvc)r?   r@   r&   rr   r   r   Ú
startswith)rB   r   r–   ZisaÚvendorr5   r   r   r   Úmake_msabi_tripleK  s    ÿzLLVMConfig.make_msabi_tripleNc           	      C   s’   |s| j jg}tj |¡r |g}dd„ |D ƒ}tj |¡}g }|D ]<}| | |¡}|sXqB|\}}}|sl dS | 	||| f¡ qB| j j
 |¡ dS )Nc                 S   s"   g | ]}t |tƒr|nt|ƒ‘qS r   )Ú
isinstancer   r   r   r   r   r]   c  s   ÿz5LLVMConfig.add_tool_substitutions.<locals>.<listcomp>FT)r'   rw   r8   r9   r^   r5   r_   rR   ÚresolveÚappendÚsubstitutionsÚextend)	rB   ZtoolsZsearch_dirsr    Útoolr@   Z	subst_keyZ	tool_pipers   r   r   r   Úadd_tool_substitutions\  s&    
ÿ
z!LLVMConfig.add_tool_substitutionsc                 C   s"  t | jddƒ}t|ƒdkr–| d¡\}}}}| jj dd| d f¡ | jj dd| d f¡ | jj dd| d f¡ | jj d	d| d f¡ nˆ| jj ddt tj	¡ d f¡ | jj ddt tj
¡ d f¡ | jj ddt tj¡ d f¡ | jj d	dt tj¡ d f¡ d S )
NÚerrc_messagesr   r   r   z%errc_ENOENTú'z%errc_EISDIRz%errc_EINVALz%errc_EACCES)r,   r'   Úlenr=   r    rŸ   r5   ÚstrerrorÚerrnoÚENOENTZEISDIRÚEINVALÚEACCES)rB   r¤   Zerrc_enoentZerrc_eisdirZerrc_einvalZerrc_eaccesr   r   r   Úadd_err_msg_substitutions}  s:    ÿÿÿÿÿÿÿÿÿz$LLVMConfig.add_err_msg_substitutionsc                 C   sh   t dddt dtdƒdddt dtd	ƒdddg}| jj d
dtj f¡ |  || jjg¡ |  	¡  d S )NZ	FileCheckrr   )Ú
unresolvedz\| \bcount\bÚcountT)rs   Zverbatimr­   z
\| \bnot\bÚnotz%pythonz"%s")
r   r   r'   r    rŸ   r*   Ú
executabler£   rw   r¬   )rB   Ztool_patternsr   r   r   Úuse_default_substitutionsš  s    

ÿ
ÿú	
ÿz$LLVMConfig.use_default_substitutionsc           
      C   sÈ   d}|r| j j |¡}|sF|du r,| j jg}tj |¡}tj 	||¡}|sd|rdtj 	|| j jd ¡}|r”|s”d 
|¡}	|rˆ|	d 
|¡ }	| j |	¡ |rÄtj |¡}| jjsÄ|sÄ| j d 
||¡¡ |S )zÉFind the executable program 'name', optionally using the specified
        environment variable as an override before searching the build directory
        and then optionally the configuration's PATH.Nr   zcouldn't find '{}' programz$, try setting {} in your environmentzusing {}: {})r'   r-   r7   rw   r5   r_   rR   r8   r9   Úwhichr4   r&   rr   rD   rY   r1   r3   )
rB   rh   Ú
search_envÚrequiredr1   Úsearch_pathsÚuse_installedr¢   rD   Úmessager   r   r   Úuse_llvm_tool«  s,    

ÿzLLVMConfig.use_llvm_toolTc                    s’  g d¢}t  ¡ dkr| d¡ ˆ |¡ ˆjj ¡ d ddg}‡fdd„|D ƒ}|| }ˆjd	|d
d ˆjj ¡ d ddg}‡fdd„|D ƒ}	ˆjd|	d
d tˆjddƒ}
tˆjddƒ}|
rÒˆjj	 d|
f¡ |rèˆjj	 d|f¡ ˆj
dd|||dˆj_ˆjjrÞˆjj d¡ ˆ ˆjj¡}tdˆjj|dtddg d¢| dtdˆjjdd|dg| dtd ˆjjd!g| dtd"ˆjjd#g| dtd$ˆjjd%g| dtd&ˆjjd'g| dg}ˆ |¡ ˆjj	 d(|f¡ ˆjj	 d)ˆ ˆjj¡f¡ ˆjj	 d*ˆ ˆjj¡f¡ ˆjjrPˆjjd+krPˆjj	 d,d-ˆ ˆjj¡ f¡ nˆjj	 d.¡ ttj d/d0¡ƒ‰ d1‰‡ ‡‡fd2d3„}|d4ƒ |d5ƒ |d6ƒ |d7ƒ |d8ƒ |d9ƒ |d:ƒ |d;ƒ |d<ƒ d=d>„ }ˆjj	 d?|ddƒf¡ ˆjj	 d@|d&dAƒf¡ ˆjj	 dB|ddCƒf¡ ˆjj	 dD|d"dEƒf¡ ˆjj	 dF|ddGƒf¡ ˆjj	 dH|ddIƒf¡ ˆjj	 dJ¡ ˆjj	 dK¡ ˆjj	 dL¡ dS )Ma  Configure the test suite to be able to invoke clang.

        Sets up some environment variables important to clang, locates a
        just-built or optionally an installed clang, and add a set of standard
        substitutions useful to any test suite that makes use of clang.

        )ZCOMPILER_PATHZRC_DEBUG_OPTIONSZCINDEXTEST_PREAMBLE_FILEZLIBRARY_PATHZCPATHZC_INCLUDE_PATHZCPLUS_INCLUDE_PATHZOBJC_INCLUDE_PATHZOBJCPLUS_INCLUDE_PATHZLIBCLANG_TIMINGZLIBCLANG_OBJTRACKINGZLIBCLANG_LOGGINGZLIBCLANG_BGPRIO_INDEXZLIBCLANG_BGPRIO_EDITZLIBCLANG_NOTHREADSZLIBCLANG_RESOURCE_USAGEZ LIBCLANG_CODE_COMPLETION_LOGGINGr   ZINCLUDEÚ
_tools_dirZclang_tools_dirrw   c                    s&   g | ]}t ˆ j|d ƒrt ˆ j|ƒ‘qS r   ©r,   r'   ©r   Úpp©rB   r   r   r]   ú  s   ÿz(LLVMConfig.use_clang.<locals>.<listcomp>r   Tr   Ú	_libs_dirÚllvm_shlib_dirÚllvm_libs_dirc                    s&   g | ]}t ˆ j|d ƒrt ˆ j|ƒ‘qS r   rº   r»   r½   r   r   r]     s   ÿÚLD_LIBRARY_PATHNZllvm_plugin_extz%llvmshlibdirz
%pluginextrˆ   ZCLANG)r³   r´   rµ   r¶   z%clang)rs   Ú
extra_argsz%clang_analyze_cc1z
%clang_cc1)z-analyzez%analyzez-setup-static-analyzerz-cc1z-internal-isystemz-nostdsystemincz
%clang_cppz--driver-mode=cppz	%clang_clz--driver-mode=clz
%clang_dxcz--driver-mode=dxcz%clangxxz--driver-mode=g++z%resource_dirz%itanium_abi_triplez%ms_abi_triplez@LLVM_HOST_TRIPLE@ú%target_itanium_abi_host_triplez	--target=)rÃ   r   ZLIT_CLANG_STD_GROUPÚ0)Z98Z11Z14Z17Z20Ú2bc                    sŒ   | dd … }|  d¡r"|ˆd 7 }ˆ |dd… dkrB|dd… nd¡}ˆ |dd	… ¡}|ˆ || d
   }ˆjj | dˆ|  f¡ d S )Né   r•   éÿÿÿÿr   r‹   Z23rÅ   rF   rŒ   rŠ   z-std=c++)ÚendswithÚindexr'   r    rŸ   )ÚsÚtÚlÚh©Zclang_std_groupZclang_std_valuesrB   r   r   Úadd_std_cxxG  s    
&z)LLVMConfig.use_clang.<locals>.add_std_cxxz%std_cxx98-14z%std_cxx98-z%std_cxx11-14z%std_cxx11-z%std_cxx14-z%std_cxx17-20z%std_cxx17-z%std_cxx20-z%std_cxx23-c                 S   s   d|| f S )Nz-"*** Do not use '%s' in tests, use '%s'. ***"r   )ÚthisÚtor   r   r   Úprefer]  s    ÿz$LLVMConfig.use_clang.<locals>.preferz clang z clang\+\+ zclang++z
 clang-cc zclang-ccz
 clang-cl zclang-clz clang -cc1 -analyze zclang -cc1 -analyzez clang -cc1 z
clang -cc1)z %clang-cc1 z1"*** invalid substitution, use '%clang_cc1'. ***")z %clang-cpp z1"*** invalid substitution, use '%clang_cpp'. ***")z %clang-cl z0"*** invalid substitution, use '%clang_cl'. ***")r+   r;   rŸ   ri   r'   rh   r   r/   r,   r    r¸   rˆ   r(   r:   r‰   r   r£   r—   r   rœ   r   rŽ   r5   r6   r7   )rB   Úadditional_tool_dirsZadditional_flagsr´   r¶   Zpossibly_dangerous_env_varsÚexe_dir_propsre   Úlib_dir_propsÚ	lib_pathsZshlZpextZbuiltin_include_dirÚtool_substitutionsrÏ   rÒ   r   rÎ   r   Ú	use_clangÎ  s    

ÿýþ

ÿ
ÿÿÿ
ÿþÿ
ÿ
ÿ
ÿ
ÿð
ÿÿÿÿÿ

ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿzLLVMConfig.use_clangc                    sz  ˆ j j ¡ d ddg}‡ fdd„|D ƒ}|| }ˆ jd|dd ˆ j j ¡ d	 d
ddg}‡ fdd„|D ƒ}ˆ jd|dd ˆ jd|||d}ˆ jd|||d}	ˆ jd|||d}
ˆ jd|||d}|oÐ|	oÐ|
oÐ|}g }|rú| td|d¡ ˆ j j d¡ |	r | td|	d¡ ˆ j j d¡ |
rF| td|
d¡ ˆ j j d¡ |rl| td|d¡ ˆ j j d¡ ˆ  	|¡ |S )a  Configure the test suite to be able to invoke lld.

        Sets up some environment variables important to lld, locates a
        just-built or optionally an installed lld, and add a set of standard
        substitutions useful to any test suite that makes use of lld.

        r¹   Zlld_tools_dirrw   c                    s&   g | ]}t ˆ j|d ƒrt ˆ j|ƒ‘qS r   rº   r»   r½   r   r   r]   „  s   ÿz&LLVMConfig.use_lld.<locals>.<listcomp>r   Tr   r¾   Zlld_libs_dirr¿   rÀ   c                    s&   g | ]}t ˆ j|d ƒrt ˆ j|ƒ‘qS r   rº   r»   r½   r   r   r]   ‹  s   ÿrÁ   zld.lld)r´   rµ   r¶   zlld-linkzld64.lldzwasm-ldzld\.lld)rs   z	ld64\.lld)
r'   rh   r   r/   r¸   rŸ   r   r(   r:   r£   )rB   rÓ   r´   r¶   rÔ   re   rÕ   rÖ   Zld_lldZlld_linkZld64_lldZwasm_ldZ	was_foundr×   r   r½   r   Úuse_lldw  sV    ÿÿþþþþ
zLLVMConfig.use_lld)F)F)N)NFFNF)Ú__name__Ú
__module__Ú__qualname__rE   r.   r/   r0   ri   ru   r‚   r‰   rA   r—   rœ   r£   r¬   r±   r¸   rØ   rÙ   r   r   r   r   r      s2    
!
!

!  ÿ
#ÿ
 *ÿr   )rN   r5   r+   r?   rm   r*   r¨   Zlit.utilr8   Zlit.llvm.substr   r   r2   Úobjectr   r   r   r   r   Ú<module>   s   