
    ^jU                       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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Zd dlZd dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d dlZd dlmZ d dlm Z m!Z! d d	l"m#Z#m$Z$ d d
l%m&Z& d dl'm(Z( d dl)m*Z*  e jV                         rd dl,m-Z-m.Z. d dl/m0Z0m1Z1m2Z2m3Z3 n$dededdfdZ0dededdfdZ1dededdfdZ2de4fdZ3dZ5ejl                  jo                  e8      Z9ejl                  ju                  ejl                  ju                  e9            Z;ejl                  jy                  e;d      Z=ej                  j}                  d      Z?ej                  j}                  d      Z@ej                  dk(  ZAdZBeAr ej                         dfndZD ej                  eF      ZG ej                  d      deIdeIfd        ZJdeIfd!ZKej                  d"eIddfd#       ZM G d$ d%      ZNej                  d"eIddfd&       ZOej                  d"eIdeIfd'       ZPdeIfd(ZQd)e4deReIeIf   fd*ZSd+eId,eId-eId.eIdeIf
d/ZT	 dd0eUeReIeIf      d1eId2eIdeIfd3ZVej                  d2eIde4fd4       ZWej                  d2eIde4fd5       ZXej                  d2eIde4fd6       ZYej                  d2eId7eZde4fd8       Z[ej                  d2eIde4fd9       Z\ej                  d2eIde4fd:       Z]ej                  de4fd;       Z^ej                  de4fd<       Z_ej                  de4fd=       Z`ej                  de4fd>       Zaej                  de4fd?       Zbej                  d"eIdeIfd@       ZcdAeUeI   dBeUeI   ddfdCZddDeUeI   deUeI   fdEZedFeIddfdGZfdFeIddfdHZgdIeIdJeIddfdKZhdIeIdJeIddfdLZidMeIdeIfdNZj G dO dP      ZkddQe4deUeI   fdRZlddSeIdeUeI   fdTZmd2eIdeUeI   fdUZnd2eIdeUeI   fdVZodeUeI   fdWZpdeReUeI   eUeI   f   fdXZqej                  de*eI   fdY       Zrej                  d2eIdeIfdZ       Zsd2eIdeUeI   fd[Zt	 dd2eId\e4deReUeI   eUeI   f   fd]Zud^e4deUeI   fd_Zv	 	 	 dd2eId^e4dQe4d`eeI   d\e4deReUeI   eUeI   eUeI   eUeI   eUeI   eUeI   eUeI   f   fdaZw G db dcek      ZxdeUeI   fddZydeUeI   fdeZzdeUeI   fdfZ{d2eIdge4d)e4deReUeI   eUeI   eUeI   eUeI   f   fdhZ|die$deReUeI   eUeI   f   fdjZ}dke4dge4deReUeI   eUeI   eUeI   f   fdlZ~deUeI   fdmZdeReUeI   eUeI   f   fdnZej                  de4fdo       Zej                  deRe4eIf   fdp       Zej                  d2eIdqeIddfdr       Zej                  d2eIddfds       Zd2eIdeReUeI   eUeI   eUeI   eUeI   eUeI   eUeI   f   fdtZdeReUeI   eUeI   f   fduZdve4dwe4deUeI   fdxZdeUeI   fdyZd2eIdie$dke4dge4d)e4dve4dwe4deReUeI   eUeI   eUeI   eUeI   eUeI   eUeI   eUeI   f   fdzZ G d{ d|ex      Zdd}Z ej                  d~      deIdedz  fd       ZdeIdeIdeIddfdZdZd1eIdeIdz  fdZdeUeI   deUeI   fdZdeUeI   ddfdZdeUeI   ddfdZ	 	 ddeIdge4de4deReUeI   eUeI   eUeI   eUeI   eUeI   eUeI   eUeI   f   fdZ G d de      ZdeIdeReIeIf   fdZ G d d      ZdeIdeIdJeIddfdZy)    N)Sequence)cdllwintypes)find_library)Path)Any)dynamo_timed)configexc)invalid_vec_isaVecISA)	cache_dir)TorchVersion)
OrderedSet)_run_build_commandbuild_paths)log_global_cache_errorslog_global_cache_statslog_global_cache_valsuse_global_cacheargskwargsreturnc                       y N r   r   s     f/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/_inductor/cpp_builder.pyr   r   0           c                       y r   r   r   s     r   r   r   3   r   r    c                       y r   r   r   s     r   r   r   6   r   r    c                       y)NFr   r   r    r   r   r   9   s    r    CxxBuildz_inductor/script.ldlinuxdarwinwin32zx86_64-w64-mingw32-g++replacer      searchc                    ddl m}m} | D ]  }	 |tt        j                  dk7  rt        j                  d      s0ddlm}  |       } |t
        j                  j                  |d      |      }|5  t               }d d d        t        j                  |dg       |c S  t"        j$                  # 1 sw Y   5xY w# t        j                  t        t         f$ r Y w xY w)	Nr   )get_lock_dirLOCK_TIMEOUTr%   TORCH_INDUCTOR_INSTALL_GXX)FileLockzg++.lock)timeout	--version)torch._inductor.codecacher,   r-   sysplatformosgetenvtorch.utils._filelockr/   pathjoininstall_gcc_via_conda
subprocesscheck_outputSubprocessErrorFileNotFoundErrorImportErrorr   InvalidCxxCompiler)r*   r,   r-   cxxr/   lock_dirlocks          r   cpp_compiler_searchrD   R   s    D 	{ <<7*yy!=>:'>GGLL:6  2/1C2##S+$67J', 
 
  2 2 **,={K 		s3   B=B=7B=2B1= B=1B:	6B==CCc            
         t         j                  j                  t               d      } t         j                  j                  | dd      }t         j                  j	                  |      s~t
        j                  d       t         j                  j                  dd      }|t        j                  d      }|0t        j                  |dd|  d	d
dddgt        j                         |S )z>On older systems, this is a quick way to get a modern compilergccbing++zDownloading GCC via conda	CONDA_EXEcondacreatez	--prefix=z--channel=conda-forgez--quietz-yz
python=3.8gxx)stdout)r5   r8   r9   r   existsloginfoenvirongetshutilwhichr;   
check_callPIPE)prefixcxx_pathrJ   s      r   r:   r:   o   s    WW\\)+u-Fww||FE51H77>>(#,-

{G4=LL)E!!x(+ 	 " Or    compilerc                     	 t        j                  | dgt         j                         y# t        $ r}t	        j
                  |       |d}~wt         j                  $ r Y yw xY w)zU
    Check if compiler is ready, in case end user not activate MSVC environment.
    /helpstderrN)r;   r<   STDOUTr>   r   r@   r=   )rY   es     r   check_compiler_exist_windowsr`      sV    
7 3J<M<MN 6$$X.A5%% s   '* 	A"A		A"!A"c                   8    e Zd ZdeddfdZddZddZdefdZy)	WinPeFileVersionInfo	file_pathr   Nc                     || _         t        j                  d      | _        | j	                          | j                          y )Nzversion.dll)rc   ctypesWinDLLversion_dll_setup_functions_get_version_info)selfrc   s     r   __init__zWinPeFileVersionInfo.__init__   s2    "!==7 r    c                    t         j                  t         j                  g| j                  j                  _        t         j                  | j                  j                  _        t         j                  t         j                  t         j                  t         j                  g| j                  j                  _        t         j                  | j                  j                  _        t         j                  t         j                  t        j                  t        j                        t        j                  t         j                        g| j                  j                   _        t         j                  | j                  j                   _        y r   )r   LPCWSTRLPDWORDrg   GetFileVersionInfoSizeWargtypesDWORDrestypeLPVOIDGetFileVersionInfoWBOOLLPCVOIDre   POINTERc_void_pUINTVerQueryValueWrj   s    r   rh   z%WinPeFileVersionInfo._setup_functions   s    =
009 <D>>008 NNNNOO	9
,,5 8@}},,4 NN6??+NN8==)	4
''0 3;--''/r    c                    t        j                         }| j                  j                  | j                  t        j                  |            }|dk(  rt        d| j                   d      t        j                  |      | _	        | j                  j                  | j                  d|| j                        }|st        d| j                   d      y )Nr   zCan't get version info size of .zCan't get version info of )r   rq   rg   ro   rc   re   byrefRuntimeErrorcreate_string_bufferversion_infort   )rj   dummysizesuccesss       r   ri   z&WinPeFileVersionInfo._get_version_info   s     77NNFLL/
 19!@@PPQRSS"77=""66NNAtT%6%6
 !;DNN;K1MNN r    c                 d   t        j                         }t        j                         }| j                  j                  | j                  dt        j                  |      t        j                  |            }|r|j                  dk(  ryg }d}|j                  t        |j                  dz        D ]o  }|dz  }t        j                  |j                  |z   d      }t        j                  |d d d      }t        j                  |dd d      }	|j                  ||	f       q |S t        d       |S )Nz\VarFileInfo\Translationr         littlezBuffer is None)re   rx   r   ry   rg   rz   r   r~   valuerange	string_atint
from_bytesappendprint)
rj   	lp_bufferu_lenr   translationslang_idioffsetdata	code_pages
             r   get_language_idz$WinPeFileVersionInfo.get_language_id   s   OO%	""11'LL#LL	
 %++*??&5;;!+, :Q''	&(@!D..bq8<NN4!9h?	##Wi$89:  "#r    r   N)	__name__
__module____qualname__strrk   rh   ri   r   r   r   r    r   rb   rb      s-    !# !$ !@.O" r    rb   c                    dt         t        t        f   fd}t        |       syt        j
                  j                  |       r| }n |       \  }}|du ryt        |      }|j                         }|dk7  rt        d      y)z
    Torch.compile() is only work on MSVC with English language pack well.
    Check MSVC's language pack: https://github.com/pytorch/pytorch/issues/157673#issuecomment-3051682766
    r   c            	         t         j                  j                  t         j                  j	                  dd      ddd      } t         j                  j                  |       s`t         j                  j                  t         j                  j	                  dd      ddd      } t         j                  j                  |       sy	 | d	d
ddddddg	}t        j                  |dd      j                         }|syt         j                  j                  |ddd      }t         j                  j                  |      syt        j                  |      D cg c]A  }t         j                  j                  t         j                  j                  ||            r|C }}|syt        |d      d   }t         j                  j                  ||dddd      }t         j                  j                  |      rd|fS t         j                  j                  ||dddd      }t         j                  j                  |      rd|fS 	 yc c}w # t        j                  t        f$ r Y yw xY w)z=
        Finds the path to cl.exe using vswhere.exe.
        zProgramFiles(x86)zC:\Program Files (x86)zMicrosoft Visual Studio	Installerzvswhere.exeProgramFileszC:\Program FilesF z-latestz-prereleasez	-products*z	-requiresz1Microsoft.VisualStudio.Component.VC.Tools.x86.x64z	-propertyinstallationPathTutf-8)textencodingVCToolsMSVC)reverser   rG   HostX64x64zcl.exeHostX86x86)r5   r8   r9   rQ   rR   rN   r;   r<   striplistdirisdirsortedCalledProcessErrorr>   )vswhere_pathcmdvs_install_pathmsvc_tools_pathdtoolset_versionslatest_toolset_versioncl_paths           r   get_msvc_cl_pathz3check_msvc_cl_language_id.<locals>.get_msvc_cl_path   s!    ww||JJNN.0IJ%	
 ww~~l+77<<

~/BC)	L 77>>,/ <	 C"
C )55$eg  #  !ggll?D'6RO77>>/2 
 O4 77==oq!AB    
 $ %+,<d%KA%N" ggll&G ww~~g&W}$ '',,#* 77>>'*=( + I B --/@A 		s@   3H> 5AH> 7H> AH9H> AH> 0AH> 9H> >IINFi	  znTorch.compile() is only support MSVC with English language pack,Please reinstall its language pack to English.)
tupleboolr   _is_msvc_clr5   r8   rN   rb   r   r   )rY   r   cl_exe_pathb_retr   r   s         r   check_msvc_cl_language_idr      s    ReD#I. Rh x 	ww~~h-/{E>'4L**,G$=
 	
 r    c                    	 t        j                  | dgt         j                  d      }d}|j                         D ]8  }d	|v s|j                  d
d      d   j                         j                         }: |t	        d|  d|  d      |dvrt	        d|  d|       |S # t        $ r}t	        d|  d      |d}~wt
        $ r}t	        d|  d      |d}~ww xY w)zS
    Check if MinGW `compiler` exists and return it's flavor (win32 or posix).
    -vT)r]   r   z
Compiler: z is not found.NzFailed to run z -vzThread model:r)   zCannot determine the flavor of z, (win32 or posix). No Thread model found in )r'   posixzOnly win32 and pofix flavor of z is supported. The flavor is )
r;   r<   r^   r>   r   	Exception
splitlinessplitr   lower)rY   outr_   flavorlines        r   check_mingw_win32_flavorr   T  s   
B%%tZ%6%6T
 F  <T!ZZQ'+11399;F< ~-hZ7cdlcmmpq
 	
 ''-hZ7TU[T\]
 	
 M)  IZz@AqH B^H:S9:ABs#   (B" "	C+B;;CCCc                     t         j                  j                  dk(  r@t        j                  dk7  r-t
        } t         j                  j                  st        |        | S t        rCt        j                  j                  dd      } t        |       } t        |        t        |        | S t        j                         rt         j"                  S t%        t         j&                  j(                  t*        t,        f      r$t-        t         j&                  j(                        }nt         j&                  j(                  f}t/        |      } | S )Nwindowsr'   CXXcl)r
   aot_inductorcross_target_platformr3   r4   	MINGW_GXXpackage_cpp_onlyr   _IS_WINDOWSr5   rQ   rR   normalize_path_separatorr`   r   	is_fbcoder   cc
isinstancecpprA   listr   rD   )rY   r*   s     r   get_cpp_compilerr   t  s    11Y>LLG# ""33$X.::>>%.+H5$X.!(+ O >>!fjjnntUm46::>>*Fjjnn&F&v.Or    use_relative_pathc                     t         rt        d      t        j                         r6t        j
                  }| rt        j                  nt        j                  }||fS d}d}||fS )NzWindows is not supported yet.ldobjcopy)r   r   r
   r   r   r   objcopy_fallbackr   )r   r   r   s      r   get_ld_and_objcopyr     sf    :;;B % ,, ((  w; BGw;r    
cubin_filekernel_namer   r   c                    | dz   }| d| d|  }t        j                  |j                         ddd       | d| }t        j                  |j                         ddd       t        j                  dd|       }|d	| d
| dz   d| d| dz   d| d| dz   |z   }t        j                  |j                         ddd       |S )N.oz  -r -b binary -z noexecstack -o  Tcapture_outputr   checkzB --rename-section .data=.rodata,alloc,load,readonly,data,contents z[\W]_z --redefine-sym _binary_z	_start=__z_start z--redefine-sym _binary_z_size=__z_size z_end=__z_end )r;   runr   resub)r   r   r   r   obj_filer   	file_names          r   convert_cubin_to_objr     s     D HD0
!J<
HCNN399;t$dKIWX`Wa
bCNN399;t$dK wZ0I$YKyW
M	N#I;h{m6
J	K $I;gk]%
H	I 		  NN399;t$dKOr    cubins
output_dircpp_compilerc                    t         j                  j                  |d      }t         j                  j                  |d      }t        |d      5 }|j	                  d       | D ]s  \  }}t         j                  j                  |      }|j                  dd      j                  dd      }	|j	                  d	| d
| d| d|	 d| d| d| d| d| d       u 	 ddd       t        j                  |d|d|gddd       |S # 1 sw Y   )xY w)aq  Convert multiple cubin files to a single .o using batched .incbin assembly.

    Instead of spawning 3 subprocesses per cubin (ld + 2x objcopy), generates
    a single .S file with .incbin directives for all cubins and compiles it
    with one compiler invocation. Produces bit-identical rodata and symbols
    as the per-cubin convert_cubin_to_obj approach.

    Args:
        cubins: list of (cubin_file_path, kernel_name) tuples.
        output_dir: directory for the generated .S and .o files.
        cpp_compiler: C compiler to use for assembling (default: gcc).

    Returns:
        Path to the combined .o file.
    zcubins_combined.Szcubins_combined.owz.section .rodata
\z\\"z\"z.balign 16
.global __z_start
.global __z_end
__z_start:
.incbin "z"
__z_end:
.global __z_size
.set __z	_size, __z	_end - __z_start
N-c-oTr   )	r5   r8   r9   openwriteabspathr(   r;   r   )
r   r   r   asm_pathobj_pathfr   r   	abs_cubinescaped_paths
             r   batch_convert_cubins_to_objr    s7   ( ww||J(;<Hww||J(;<H	h	 	$%'- 	#J
3I$,,T6:BB3NLGG(M *(M * M "(> * M "(M *% ' M;-xA
		$ NN	tXtX6	 O1 s   B
D  D	c                 x    t        j                  | dg      j                  d      }d|j                         d   v S )Nr1   utf8Appler   )r;   r<   decoder   )r   version_strings     r   _is_apple_clangr    s<    ,,lK-HIPPQWXNn//1!444r    c                    t         j                  dk(  rt        |       S t        r@t	        j
                  d|       rt        d      t        t	        j
                  d|             S t        t	        j
                  d|             S )Nr&   z((clang$)|(clang\+\+$))z]Please use clang-cl, due to torch.compile only support MSVC-like CLI (compiler flags syntax).z
(clang-cl)z(clang|clang\+\+))r3   r4   r  r   r   r*   r   r   r   s    r   	_is_clangr    sl     ||x|,,	99/>o  BIIm\:;;		.=>>r    c                 X    t        |       ryt        t        j                  d|             S )NFz(gcc|g\+\+|gnu-c\+\+))r  r   r   r*   r  s    r   _is_gccr    s&     		2LABBr    majorc                 x   t        |       sy	  t        j                  | ddgt        j                        j	                         j
                  t         }t        j                  d|      }|yt        |j                  d            t        t        |            k  S # t        t        j                  f$ r Y yw xY w)NFz-dumpfullversionz-dumpversionr\   z\d+(?:\.\d+)*r   )r  r;   r<   DEVNULLr   r  SUBPROCESS_DECODE_ARGSr>   r=   r   r*   r   groupr   )r   r  
output_msgversion_searchs       r   _is_gcc_version_less_thanr  
  s    < 
J##1>B!)) UWV+- 	 YY/<N,,Q/0<E
3KKK z99: s   AB B98B9c                 <   t         sy	 t        j                  | dgt        j                  t        j                  d      } |j
                  j                         j                  t         }|j                         }t        |      xr d|d   v S # t        $ r Y yw xY w)NFr[   rM   r]   r   	Microsoftr   )r   r;   r   rV   r^   rM   r   r  r  r   r   OSError)r   resultr  liness       r   r   r   "  s    7#??$$	
 2V]]((*113IJ
%%'E{6{eAh66 s   BB 	BBc                    dt         dd fd}	  t        j                  | dgt        j                        j	                         j
                  t         }d|j                         d   v }|rat        r!t        j                  d|       rt        d	      t        j                  d
|      }|"|j                  d      } |t        |             |S # t        $ r Y yt        j                  $ r Y yw xY w)Ncompiler_versionr   c                 R    t         rdnd}| t        |      k  rt        d| d      y)zw
        On Windows: early version icx has `-print-file-name` issue, and can't preload correctly for inductor.
        z2024.2.1z0.0.0z0Intel Compiler error: less than minimal version r}   N)r   r   r   )r#  min_versions     r   _check_minimal_versionz2_is_intel_compiler.<locals>._check_minimal_version:  s8     %0jWl;77B;-qQ  8r    r1   r\   Intelr   z((icx$)|(icx-cc$))z[Please use icx-cl, due to torch.compile only support MSVC-like CLI (compiler flags syntax).z(\d+[.]\d+[.]\d+[.]\d+)r)   F)r   r;   r<   r  r   r  r  r   r   r   r*   r   r  r>   r=   )r   r&  r  is_intel_compilericx_ver_searchicx_vers         r   _is_intel_compilerr+  8  s     $ J##{+J4F4F UWV+	- 	 $z'<'<'>q'AA992LA&u 
  YY'A:NN)(..q1&|G'<=   %% s   B?C 	C.C.-C.c                  (    t        t                     S r   )r  r   r   r    r   is_gccr-  e  s    #%&&r    c                  (    t        t                     S r   )r  r   r   r    r   is_clangr/  j  s    %'((r    c                  (    t        t                     S r   )r+  r   r   r    r   r(  r(  o  s    .011r    c                  (    t        t                     S r   )r  r   r   r    r   is_apple_clangr2  t  s    +-..r    c                  (    t        t                     S r   )r   r   r   r    r   
is_msvc_clr4  y  s    ')**r    c                    t         j                  j                         }d|d<   	  t        j                  | dgt        j
                  |      j                  t         }|j                  dd      }|j                  d	d      }|S # t        $ rN 	  t        j                  | dgt        j
                  |      j                  t         }n# t        $ r Y Y yw xY wY |w xY w)
NCLC_ALLr   )r]   envr1   r   r   
)
r5   rQ   copyr;   r<   r^   r  r  r   r(   )rY   r8  r  s      r   get_compiler_version_infor<  ~  s    
**//
CCM
00tZ%6%6C

&(* $++D#6N#++D#6N  	Z44;'
0A0Asf,.N  		 s5   9B 	C9CC	CCCCC	dest_listsrc_listc                 4    | j                  d |D               y )Nc              3   F   K   | ]  }t        j                  |        y wr   r;  deepcopy).0items     r   	<genexpr>z_append_list.<locals>.<genexpr>  s     >TT]]4(>   !)extend)r=  r>  s     r   _append_listrH    s    >X>>r    	orig_listc                 D    g }| D ]  }||vs|j                  |        |S r   )r   )rI  new_listrD  s      r   _remove_duplication_in_listrL    s1    H "xOOD!" Or    path_dirc                    t         j                  j                  |       s	 t        |       j	                  dd       y y # t
        $ r6}|j                  t        j                  k7  rt        d|        |Y d }~y d }~ww xY w)NT)parentsexist_okzFail to create path )	r5   r8   rN   r   mkdirr  errnoEEXISTr   )rM  r   s     r   _create_if_dir_not_existrT    sr    77>>(#	ON   = $  	OyyELL("%9(#DE3N )	Os   ? 	A>,A99A>c                    t         j                  j                  |       rt        j                  | d      D ]~  \  }}}|D ]7  }t         j                  j	                  ||      }t        j
                  |       9 |D ]7  }t         j                  j	                  ||      }t        j                  |       9  t        j                  |        y y )NF)topdown)r5   r8   rN   walkr9   removermdir)rM  rootdirsfilesnamerc   dir_paths          r   _remove_dirr_    s    	ww~~h!#5!A 	#D$ %GGLLt4			)$%  #77<<d3"#		# 	  r    cmd_linecwdc                    t        j                  |       }	 t        j                  ||dt        j                  t        j
                         y # t        j                  $ r_} |j                  j                  t         }d|v xs d|v }|rt        j                  dk(  rd}||z  }t        j                  ||      |d }~ww xY w)NT)ra  r   rM   r]   z'omp.h' file not foundlibompr&   a  

OpenMP support not found. Please try one of the following solutions:
(1) Set the `CXX` environment variable to a compiler other than Apple clang++/g++ that has builtin OpenMP support;
(2) install OpenMP via conda: `conda install llvm-openmp`;
(3) install libomp via brew: `brew install libomp`;
(4) manually setup OpenMP and set the `OMP_PREFIX` environment variable to point to a path with `include/omp.h` under it.)shlexr   r;   r   rV   r^   r   rM   r  r  r3   r4   r   CppCompileError)r`  ra  r   r_   outputopenmp_probleminstructions          r   _run_compile_cmdri    s    
++h
C6SZ__ZEVEV	
 (( 6 "891V;Qx6?Qcllh62  k!F!!#v.A56s   6A C !AB;;C c                 \    t        d      5  t        | |       d d d        y # 1 sw Y   y xY w)Ncompile_file)r	   ri  )r`  ra  s     r   run_compile_cmdrl    s)    	n	% (3'( ( (s   "+	orig_pathc                 R    t         r | j                  t        j                  d      S | S )N/)r   r(   r5   sep)rm  s    r   r   r     s"      --r    c                      e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 d$dedee   dz  dee   dz  dee   dz  dee   dz  dee   dz  d	ee   dz  d
ee   dz  dedededededdfdZd%dZd%dZ	d%dZ
defdZdee   fdZdee   fdZdee   fdZdee   fdZdee   fdZdee   fdZdee   fdZdefdZdefdZdefdZdefd Zdefd!Zd"eddfd#Zy)&BuildOptionsBasez
    This is the Base class for store cxx build options, as a template.
    Actually, to build a cxx shared library. We just need to select a compiler
    and maintains the suitable args.
    NrY   definitionsinclude_dirscflagsldflagslibraries_dirs	librariespassthrough_argsaot_moder   compile_onlyprecompilingpreprocessingr   c                     || _         |xs g | _        |xs g | _        |xs g | _        |xs g | _        |xs g | _        |xs g | _        |xs g | _        d | _        |	| _	        |
| _
        || _        || _        || _        y r   )	_compiler_definitions_include_dirs_cflags_ldflags_libraries_dirs
_libraries_passthrough_argsprecompiled_header	_aot_mode_use_relative_path_compile_only_precompiling_preprocessing)rj   rY   rs  rt  ru  rv  rw  rx  ry  rz  r   r{  r|  r}  s                 r   rk   zBuildOptionsBase.__init__  s      "'2'8b(4(:"(,B#*=b*8*>B%._",<,B /3'(9#/#/$1r    c                 x    | j                   s| j                  s| j                  rg | _        g | _        g | _        y y r   )r  r  r  r  r  r  r{   s    r   _process_compile_only_optionsz.BuildOptionsBase._process_compile_only_options  s7    !3!3t7J7J#%D  DODM 8Kr    c                 p   t        | j                        | _        t        | j                        | _        t        | j                        | _        t        | j                        | _        t        | j
                        | _        t        | j                        | _        t        | j                        | _        y r   )rL  r  r  r  r  r  r  r  r{   s    r   _remove_duplicate_optionsz*BuildOptionsBase._remove_duplicate_options  s~    78I8IJ89K9KL24<<@3DMMB:4;O;OP5dooF!<T=S=S!Tr    c                 D    | j                          | j                          y r   )r  r  r{   s    r   _finalize_optionsz"BuildOptionsBase._finalize_options  s    **,&&(r    c                     | j                   S r   )r  r{   s    r   get_compilerzBuildOptionsBase.get_compiler      ~~r    c                     | j                   S r   )r  r{   s    r   get_definitionsz BuildOptionsBase.get_definitions  s       r    c                     | j                   S r   )r  r{   s    r   get_include_dirsz!BuildOptionsBase.get_include_dirs      !!!r    c                     | j                   S r   )r  r{   s    r   
get_cflagszBuildOptionsBase.get_cflags  s    ||r    c                     | j                   S r   )r  r{   s    r   get_ldflagszBuildOptionsBase.get_ldflags!  s    }}r    c                     | j                   S r   )r  r{   s    r   get_libraries_dirsz#BuildOptionsBase.get_libraries_dirs$  s    ###r    c                     | j                   S r   )r  r{   s    r   get_librarieszBuildOptionsBase.get_libraries'  s    r    c                     | j                   S r   )r  r{   s    r   get_passthrough_argsz%BuildOptionsBase.get_passthrough_args*  s    %%%r    c                     | j                   S r   )r  r{   s    r   get_aot_modezBuildOptionsBase.get_aot_mode-  r  r    c                     | j                   S r   )r  r{   s    r   get_use_relative_pathz&BuildOptionsBase.get_use_relative_path0  s    &&&r    c                     | j                   S r   )r  r{   s    r   get_compile_onlyz!BuildOptionsBase.get_compile_only3  r  r    c                     | j                   S r   )r  r{   s    r   get_precompilingz!BuildOptionsBase.get_precompiling6  r  r    c                     | j                   S r   )r  r{   s    r   get_preprocessingz"BuildOptionsBase.get_preprocessing9  s    """r    filec                    | j                         | j                         | j                         | j                         | j	                         | j                         | j                         | j                         | j                         | j                         | j                         d}t        |d      5 }t        j                  ||       d d d        y # 1 sw Y   y xY w)N)rY   rs  rt  ru  rv  rw  rx  ry  rz  r   r{  r   )r  r  r  r  r  r  r  r  r  r  r  r   jsondump)rj   r  attrsr  s       r   save_flags_to_jsonz#BuildOptionsBase.save_flags_to_json<  s    ))+//1 113oo''')"557++- $ 9 9 ;))+!%!;!;!= 113
 $_ 	 IIeQ	  	  	 s   5CC)r   NNNNNNNFFFFFr   )r   r   r   __doc__r   r   r   rk   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r    r   rr  rr    s    (,)-#'$(+/&*-1"'""#"2"2 #Y%"2 3i$&	"2
 S	D "2 cT!"2 S	D("2 9t#"2 s)d*"2 "2  "2 "2 "2 "2 
"2HU)c !c !"$s) "DI T#Y $DI $tCy &d3i &d 't '"$ ""$ "#4 # s  t  r    rr  warning_allc                      t         s| rdgS g S g S )NWallr   )r  s    r   _get_warning_all_cflagr  O  s    &x.B.	r    std_numc                 ,    t         r		 d} d|  gS d|  gS )Nc++20zstd:zstd=r  )r  s    r   _get_cpp_std_cflagr  V  s1    	 wi !!wi !!r    c                     t         rg d}|S ddg}t        |       r/t        j                  j                  rdnd}|j                  |       t        |       r|j                  d       |S )N)wd4819wd4251wd4244wd4267wd4275wd4018wd4190wd4624wd4067wd4068EHsczZc:__cpluspluszpermissive-zWno-unused-variablezWno-unknown-pragmasz$Werror=ignored-optimization-argumentz!Wno-ignored-optimization-argumentpedantic)r   r  r
   r   #raise_error_on_ignored_optimizationr   r  )r   ru  ignored_optimization_arguments      r   _get_os_related_cpp_cflagsr  e  sp    
> M ()>?\" &&JJ 78 *
 MM78<  MM*%Mr    c                 8    g }t         r|j                  d       |S )NNOMINMAXr   r   )r   os_definitionss     r   _get_os_related_cpp_definitionsr    s      "N 	j)r    c                  J   t         rg } | S g d} | j                  d       t        j                  j                  s| j                  d       | j                  d       | j                  dt        j                  j
                          t               r| j                  d       | S )N)zfno-trapping-mathzfunsafe-math-optimizationszffinite-math-onlyzfno-signed-zeroszfno-finite-math-onlyzfno-unsafe-math-optimizationszfmath-errnozffp-contract=zfexcess-precision=fast)r   r   r
   r   enable_unsafe_math_opt_flag#enable_floating_point_contract_flagr-  )flagss    r   _get_ffast_math_flagsr    s    6 L'
 	+,zz55LL89 	]#}VZZ%S%S$TUV8LL12Lr    c                  X    g } g }t         rddg} g d}| |fS | j                  d       | |fS )z
    When we turn on generate debug symbol.
    On Windows, it should create a [module_name].pdb file. It helps debug by WinDBG.
    On Linux, it should create some debug sections in binary file.
    ZI_DEBUG)DEBUGzASSEMBLYDEBUG zOPT:REFzOPT:ICFgr  )ru  rv  s     r   !_get_inductor_debug_symbol_cflagsr    sD     FG!C 7? 	c7?r    c                      t               } t        j                         dvr| S t        j                  j	                  d      s| S t
        j                  j                         | j                  fddD               | S )Naarch64arm64r%   c              3   F   K   | ]  }j                  |d       r|  yw)FN)rR   )rC  
capabilitycapabilitiess     r   rE  z/_get_linux_aarch64_cpu_flags.<locals>.<genexpr>  s)      J. 	s   !bf16svesve2)	r   r4   machiner3   
startswithtorchcpuget_capabilitiesupdate)r  r  s    @r   _get_linux_aarch64_cpu_flagsr    sj    '\E!55<<""7+99--/L	LL 1  Lr    c                     t               }t        |       rFt        | d      r:t        g d      j	                  |      ryt        ddg      j	                  |      ryy)N   r  zmarch=armv8.6-a+sve+sve2+bf16r  r  zmarch=armv8.6-a+sve+bf16march=native)r  r  r  r   issubset)r   r  s     r   _get_linux_aarch64_arch_flagr    sP    (*E|!:<!L-.77>2vuo&//6-r    c                 B   t        j                         rg S t         j                  j                  }|dk(  rg S t        j
                  dk(  r|g S t        j                         }|+|dk(  rdgS |dk(  rdgS |dk(  rdgS |d	v rt        |       gS d
gS |dk(  rd| gS d| gS )Nr   r&   ppc64lezmcpu=nativeriscv64zmarch=rv64gcriscv32zmarch=rv32gcr  r  zmcpu=zmarch=)r
   r   r   marchr3   r4   r  r  )r   r  r  s      r   _get_cpu_arch_cflagsr    s    	JJE{	 ||xEM	 G}i!?"i"##i"##**0>??)w  UGr    min_optimizec                    g }g }t         j                  j                  xs# t        j                  j                  dd      dk(   }t         j                  j                  xsd t         j                  j                  xsH t        j                  j                  dd      dk(  xs# t        j                  j                  dd      dk(  }|r5t        r||rdndgz  }n8||rt         j                  j                  nddgz  }nt        r|g d	z  }n|d
gz  }|rt               \  }}||z  }||z  }t         j                  j                  r)t        r|j                  d       n|j                  d       t         j                  j                  r6|s4t        s.t        |       r|j                  d       n|j                  d       |t               z  }t        r	 ||fS t        j                   dk7  rt#        |       r|j                  d       |t%        |       z  }t         j                  j&                  rt        |       r|j                  d       ||fS )NTORCHINDUCTOR_DEBUG_COMPILE01TORCHINDUCTOR_DEBUG_SYMBOLO1O2O3DNDEBUG)OdOb0Oy-O0r  zfno-omit-frame-pointerzgline-tables-onlyg1r&   zfno-tree-loop-vectorize	flto=thin)r
   r   debug_compiler5   rQ   rR   debug_symbolsr   compile_wrapper_opt_levelr  enable_frame_pointerr   enable_line_tablesr  r  r3   r4   r  r  
enable_lto)r   r  ru  rv  should_use_optimized_flagsshould_add_debug_symbol_flagsdebug_cflagsdebug_ldflagss           r   _get_optimization_cflagsr    s    FG 	)) 	E::>>7=D"
 	)) 	D,,	D::>>7=D	D ::>>6<C	 " "|t66FAM##==SW F
 **FtfF$&G&I#m,= //MM% MM23--6S&12d#
#%%F 7? <<8#(=MM34&|44))i.EMM+&7?r    do_linkc                     t         r	 ddgS t        j                         dk(  rdt               v rg dS g }| r|j	                  d       |j	                  d       |S )NDLLMDDarwinclang)sharedfPICzundefined dynamic_lookupr  r  )r   r4   systemr   r   )r  r  s     r   _get_shared_cflagsr   D  s[    	 t}H$4D4F)F==EX	LLLr    extra_flagsc                 R   g }g }g }g }g }	g }
g }t        | |      \  }}|t        |      z   t        |      z   t               z   t	        |       z   }|t        |       z  }t        sGt        j                  j                  r-t        |       r"|j                  d       |j                  d       |j                  dj                  |             t        j                  j                  dk(  r6|j                  ddg       t        t               dk(  r|j                  d       |||||z   |	|
|fS )	Nfuse-ld=lldr  r   r   z-static-libstdc++z-static-libgccr   z'-Wl,-Bstatic -lwinpthread -Wl,-Bdynamic)r  r   r  r  r  r  r   r
   r   r  r  r   r9   r   rG  r   r   )r   r  r  r!  r  rs  rt  ru  rv  rw  rx  ry  
opt_cflagsopt_ldflagss                 r   get_cpp_optionsr&  V  s=     K LFG "NI"$6|\RJ 	
W
%	&
 
-	. 
	 %\
2		3  2<@@K6..99i>U}%{#CHH[1200I=!46F GH#I.'9##$MN 	+ r    c                   `     e Zd ZdZ	 	 	 	 	 	 	 	 ddededee   dedededed	ed
df fdZ xZS )
CppOptionsaH  
    This class is inherited from BuildOptionsBase, and as cxx build options.
    This option need contains basic cxx build option, which contains:
    1. OS related args.
    2. Toolchains related args.
    3. Cxx standard related args.
    Note:
    1. This Options is good for assist modules build, such as x86_isa_help.
    r{  r  r!  r   rY   r  r|  r}  r   Nc	                    t         |   ||||       |r|n	t               | _        t	        | j                  |xs |xs | |||      \  }	}
}}}}}t        | j                  |	       t        | j                  |
       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       | j                          y )N)r{  r   r|  r}  )r   r  r!  r  r  )superrk   r   r  r&  rH  r  r  r  r  r  r  r  r  )rj   r{  r  r!  r   rY   r  r|  r}  rs  rt  ru  rv  rw  rx  ry  	__class__s                   r   rk   zCppOptions.__init__  s     	%/%'	 	 	
 &.3C3E %FFG##%
	
 	T&&4T''6T\\6*T]]G,T))>:T__i0T++-=> r    )FTr   Fr   FFF)	r   r   r   r  r   r   r   rk   __classcell__r+  s   @r   r(  r(    s     # %'"'""#*!*! *! c]	*!
  *! *! *! *! *! 
*! *!r    r(  c                  P    ddg} t         j                  r| j                  d       | S )NTORCH_INDUCTOR_CPP_WRAPPERSTANDALONE_TORCH_HEADER!TORCH_INDUCTOR_PRECOMPILE_HEADERS)r
   cpp_cache_precompile_headersr   )defss    r   !_get_torch_cpp_wrapper_definitionr4    s(    (*CDD**78Kr    c                      dgS )Nz" C10_USING_CUSTOM_GENERATED_MACROSr   r   r    r   _use_custom_generated_macrosr6    s    011r    c                      t         s:t        j                         r$g d} t        j                         dk(  r| ddgz  } | S g S g S )N)C10_USE_GLOGC10_USE_MINIMAL_GLOG$C10_DISABLE_TENSORIMPL_EXTENSIBILITYx86_64zATEN_MKL_ENABLED_FBCODE=1zATEN_MKLDNN_ENABLED_FBCODE=1)r   r
   r   r4   r  )fb_internal_macross    r   _use_fb_internal_macrosr=    sT    "
 !X-"/2' " &%I	r    rz  c                 8   g }g }g }g }t         r||||fS t        j                         r|j                  d       |j                  t        j
                         |j                  t        j                         |j                  t        j                         |j                  t        j                         |j                  t        j                         |j                  t        j                         |j                  t        j                         |j                  t        j                         |j                  t        j                         |j                  d       |r	|st        }n#t        j                   j#                  t              }t%        |       rz|j                  d       |j                  dt        j&                  z          |j                  d       |j                  d|        |j                  dt        j&                  z          ||||fS )Nnostdincincludez --rtlib=compiler-rtz -Br#  zWl,--script=L)r   r
   r   r   r   sleef_includeopenmp_includepython_include
cc_includelibgcc_includelibgcc_arch_includelibgcc_backward_includeglibc_includelinux_kernel_include_LINKER_SCRIPTr5   r8   basenamer  	glibc_lib)r   rz  r   ru  rt  ry  rv  linker_scripts           r   _setup_standard_sys_libsrO    s   
 F L"$G|%5w>>j! 	K556K667K667K223K667K;;<K??@K556K<<=I&-*MGG,,^<M\"##$:;##EK,A,A$ABNN=)NN\-9:NN3!6!667<!17::r    vec_isac                 
   g }g }| t         k7  rs|j                  d | j                         D               | j                         g}t	        j
                         r(t        |       j                         }d| d| d| dg}||fS )Nc              3   F   K   | ]  }t        j                  |        y wr   rA  )rC  xs     r   rE  z0_get_build_args_of_chosen_isa.<locals>.<genexpr>  s     F1dmmA&FrF  zCPU_CAPABILITY=CPU_CAPABILITY_HAVE__CPU_DEFINITION)r   rG  build_macrobuild_arch_flagsr
   r   r   upper)rP  macrosbuild_flagscaps       r   _get_build_args_of_chosen_isar]  	  s    FK/!F0C0C0EFF//12g,$$&C!#'!#'uO,F ;r    include_pytorchc                 <   ddl m}m} g } |       }t        j                  j
                  rh|g}t        j                  dk7  rt        j                         s|j                  ddg       t        r|j                  d       |s|j                  d       ng }t        j                  j                  dk(  rht        j                  j                  }|sJ d	       t        |t              r|j                  |       n#t        |t               sJ |j                  |       t        j                  j                  dk(  rJt        j                  j"                  sJ d
       |j                  t        j                  j"                         t        r|j                  d       |||fS )Nr   )include_pathsTORCH_LIB_PATHr&   r  	torch_cpuc10torch_pythonr   z^'config.aot_inductor.aoti_shim_library' must be set when 'cross_target_platform' is 'windows'.)z]'config.aot_inductor.aoti_shim_library_path' must be set to the path of the AOTI shim libraryz+ when 'cross_target_platform' is 'windows'.sleef)torch.utils.cpp_extensionr`  ra  r
   r   link_libtorchr3   r4   r   rG  r   r   r   aoti_shim_libraryr   r   r   aoti_shim_library_path)r^  rz  r`  ra  rx  rt  rw  rh  s           r   _get_torch_related_argsrj    s`    HI ?L((()<<8#F,<,<,>g{34  '  044	A & 3 3 E E$ p$ +S1  !23!"3T:::  !2300I=""99 	
 <
 	
9 	f11HHI!22r    c                     t        t        j                  d            } | j                         s\t	        j
                         dk(  rEt        t        j                  d            }|j                  j                  dz  j                         } | dz  j                         s!t        j                  dt        |               t        |       gS )Nr@  r  stdlibHeaderszPython.hzCan't find Python.h in )r   	sysconfigget_pathrN   r4   r  parentabsolutewarningswarnr   )include_dirstd_libs     r   _get_python_include_dirsrv  H  s    y)))45K HOO$5$Ay))(34~~,,y8BBD*$,,./K0@/ABCr    c                     t               } t        j                  dt        rdnd      }|| j	                  |       t        rFt        t        t        j                  dd            j                  dz  j                               g}nt        j                  d      g}t        j                         r| j	                  t        j                         | |fS )Nr@  ntposix_prefix)schemelibsLIBDIR)rv  rn  ro  r   r   r   r   rp  rq  get_config_varr
   r   r   rD  )python_include_dirspython_include_pathpython_lib_paths      r   _get_python_related_argsr  U  s    24#,,+$> &""#67++IdCDKKfT(*
 %33H=>"";#=#=>//r    c                      	 d} t        j                  | j                               j                  d      }t	        t        j                  |            dkD  S # t         j                  t        f$ r Y yw xY w)Nzconda list llvm-openmp --jsonr
  r   F)	r;   r<   r   r  lenr  loadsr=   r>   )commandrf  s     r   is_conda_llvm_openmp_installedr  n  sd    1((9@@H4::f%&**&&(9: s   AA A32A3c                     	 t        j                  d      yt        j                  g d      j	                  d      j                         } t        j                  j                  |       }|| fS # t        j                  $ r Y yw xY w)Nbrewr   )r  z--prefixrc  r
  )
rS   rT   r;   r<   r  r   r5   r8   rN   r=   )libomp_pathomp_availables     r   homebrew_libompr  x  sv    <<'
 ##$BCVF^UW 	 {3k))%% s   A/ AA/ /BBomp_namec                 p   	 t        j                  | dg      j                  d      }t        j                  j                  |j                         |      }t        j                  j                  |      r)dt        j                  d<   t        j                  |       y y # t         j                  $ r Y y w xY w)Nz-print-file-name=binr
  TRUEKMP_DUPLICATE_LIB_OK)r;   r<   r  r5   r8   r9   rstripisfilerQ   r   LoadLibraryr=   )r   r  rf  omp_paths       r   perload_clang_libomp_winr    s    	((,8N)OPWW
 77<<:77>>(#17BJJ-.X& $ %% s   BB B54B5c                 Z    dt         dt         dt        fd}	 g d}|D ]  } || |        y )Nr   lib_namer   c                 `   	  t        j                  | d| gt         j                        j                  t         }|j                         }t        j                  j                  |      r)dt        j                  d<   t        j                  |       y	 y# t         j                  $ r Y yw xY w)Nz-print-file-name=r\   r  r  TF)r;   r<   r  r  r  r  r5   r8   r  rQ   r   r  r=   )r   r  rf  r  s       r   _load_icx_built_in_lib_by_namez>perload_icx_libomp_win.<locals>._load_icx_built_in_lib_by_name  s    	Z,,!28*=>!)) f,.F }}Hww~~h'5;

12  * (  )) 		s   BB B-,B-)zlibiomp5md.dllzsvml_dispmd.dllz
libmmd.dll)r   r   )r   r  preload_listr  s       r   perload_icx_libomp_winr    sC    S C D L ! ?&|X>?r    c                    g }g }g }g }g }g }t         j                  j                  dk(  r||||||fS t        r{|j	                  d       |j	                  d       t        |        }t        j                  d      }|t        j                  j                  |dd      }	t        j                  j                  |	      }
|
r_|j	                  t        j                  j                  |d             |j	                  t        j                  j                  |d             nt        j                  d       |xs |
}|s|j	                  d	       t        j                  d
      }|s|t               }|rt        j                  j                  |d      }|j	                  t        j                  j                  |d             |j	                  |       t        j                         j                  dk(  rNt        j                  j                  t        j                  j                  |d            r|j	                  d       |st!               \  }}|r|j	                  t        j                  j                  |d             |j	                  t        j                  j                  |d             nt"        r	 t%        |       r0|j	                  d       |j	                  d       t'        | d       n\t)        |       r/|j	                  d       |j	                  d       t+        |        n"|j	                  d       |j	                  d       nt        j,                         r~|j	                  t.        j0                         |j	                  d       |j	                  t        j                  j3                  t.        j4                               |j	                  d	       nmt%        |       r#|j	                  d       |j	                  d       n?t)        |       r|j	                  d       n"|j	                  d       |j	                  d       ||||||fS )Nr   Xclangfopenmp
OMP_PREFIXr@  zomp.hlibz-environment variable `OMP_PREFIX` is invalid.ompCONDA_PREFIXr;  zlibiomp5.dylibiomp5openmprc  z
libomp.dllQiopenmp
libiomp5mdzopenmp:experimentalz-Wp,-fopenmpgompfiopenmp)r
   r   r   	_IS_MACOSr   r  r5   r6   r8   r9   rN   rr  rs  r  unamer  r  r   r  r  r+  r  r   r   rC  dirnameopenmp_lib_so)r   ru  rv  include_dir_pathslib_dir_pathsr{  ry  r  
omp_prefixheader_path	valid_envconda_prefixconda_lib_pathr  s                 r   _get_openmp_argsr    sB    FG#%!MD"$00I=w 1=$HXXXhi  ,L99 YY|,
!'',,z9gFK{3I!((j))LM$$RWW\\*e%DEMN)6YMKK yy0!9:<M!#lE!B!((lI)NO$$^488:%%1bggnnGGLL1AB7 KK( )8):&M;!((k9)MN$$RWW\\+u%EF 
	 \"MM(#KK!$\<@-MM*%KK%"<0
 MM(#MM/0$$[%?%?@##N3  1J1J!KLKK&i(F##L1j)i(F#7-}dDTTTr    c                      g } g }t        j                         r't        j                  d      g} |j	                  d       | |fS )z
    For fbcode cpu case, we should link stdc++ instead assuming the binary where dlopen is executed is built with dynamic stdc++.
    r|  zstdc++)r
   r   rn  r}  r   )r  r{  s     r   _get_libstdcxx_argsr  '  sD      "MD"11(;<H$r    use_mmap_weightsuse_mmap_weights_externalc                 x    g }| r|rt        d      | r|j                  d       |S |r|j                  d       |S )NzIOnly one of use_mmap_weights and use_mmap_weights_external should be truez USE_MMAP_SELFz USE_MMAP_EXTERNAL)r   r   )r  r  rZ  s      r   get_mmap_self_macror  4  sO     F5W
 	
 &' M 
#*+Mr    c                  d    ddl m}  g }| j                  j                  r|j	                  d       |S )Nr   )r
   z# AOT_INDUCTOR_USE_CACHING_ALLOCATOR)torch._inductorr
   r   weight_use_caching_allocatorr   )r
   rZ  s     r   get_caching_allocator_macror  D  s+    &F77;<Mr    c                    g }g }g }	g }
g }g }g }t               }t               }t        | ||      \  }}}}t        |      \  }}t	        ||      \  }}}t               \  }}t        |       \  }}}}}} t               }!t        ||      }"t               }#||z   |z   |!z   |"z   |#z   }||z   |z   |z   }||z   }	||z   }
||z   |z   }||z   }||z   | z   }|||	|
|||fS )a3  
    This function is used to get the build args of torch related build options.
    1. Torch include_directories, libraries, libraries_directories.
    2. Python include_directories, libraries, libraries_directories.
    3. OpenMP related.
    4. Torch MACROs.
    5. MISC
    6. Return the build args
    )r^  rz  )
r4  r6  rO  r]  rj  r  r  r=  r  r  )$r   rP  r^  rz  r   r  r  rs  rt  ru  rv  rw  rx  ry  torch_cpp_wrapper_definitions'use_custom_generated_macros_definitionssys_libs_cflagssys_libs_include_dirssys_libs_passthrough_argssys_libs_ldflags
isa_macrosisa_ps_args_build_flagstorch_include_dirstorch_libraries_dirstorch_librariesr~  python_libraries_dirs
omp_cflagsomp_ldflagsomp_include_dir_pathsomp_lib_dir_pathsomp_libomp_passthrough_argsfb_macro_passthrough_argsmmap_self_macroscaching_allocator_macross$                                       r   get_cpp_torch_optionsr  M  s   $  K LFG "NI"$$E$G!.J.L+ 	!x9JK! +H*P'J' 	 (S	 2J1K.. 	& !8 9*+;=VW:< 	&
1	2
	 $	$ 		
 #	#  	
	
	  	   z)F,G*-AADUUN')I!$;;>RR 
 	 r    c                        e Zd ZdZedddddddddddddfdededed	ed
edededededee   dededededdf fdZ	 xZ
S )CppTorchOptionsaf  
    This class is inherited from CppTorchOptions, which automatic contains
    base cxx build options. And then it will maintains torch related build
    args.
    1. Torch include_directories, libraries, libraries_directories.
    2. Python include_directories, libraries, libraries_directories.
    3. OpenMP related.
    4. Torch MACROs.
    5. MISC
    FTr   r   rP  r^  r  rz  r{  r   r  r  r  r!  rY   r  r|  r}  r   Nc           
         t         |   |||
|||||       || _        t        | j                  ||||||      \  }}}}}}}t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       | j                          y )N)r{  r  r!  r   rY   r  r|  r}  )r   rP  r^  rz  r   r  r  )r*  rk   r  r  r  rH  r  r  r  r  r  r  r  r  )rj   rP  r^  r  rz  r{  r   r  r  r  r!  rY   r  r|  r}  torch_definitionsr  torch_cflagstorch_ldflagsr  r  torch_passthrough_argsr+  s                         r   rk   zCppTorchOptions.__init__  s    " 	%##/%%' 	 		
 " "+/-&?
	
 " 	T&&(9:T'');<T\\<0T]]M2T))+?@T__o6T++-CD r    )r   r   r   r  r   r   r   r   r   rk   r,  r-  s   @r   r  r    s    	 * % ""'!&*/%'""#7!7! 7! 	7!
 7! 7!  7! 7! $(7! 7! c]7! 7! 7! 7! 7!  
!7! 7!r    r  c                      t        j                         rct        j                  j                  Hdt
        j                  vr5dt
        j                  vr"t        j                  t
        j                  d<   y y y y y )N	CUDA_HOME	CUDA_PATH)	r
   r   r  versionhipr5   rQ   r   sdk_homer   r    r   _set_gpu_runtime_envr    s^    MM%rzz)rzz)"-"6"6

; * * & 	r       r8   c                     t        t        |       j                  d            }|r|d   j                         j                  S d|  }t
        j                  |       y )Nzlibcudart_static.ar   z%"libcudart_static.a" not found under )r   r   rglobresolverp  rO   rP   )r8   lib_dirslog_msgs      r   _find_libcudart_staticr    sS    DJ$$%9:;H{""$+++5dV<GHHWr    dll_pathdef_pathimport_lib_pathc           	      `   t         j                  j                  |       }t        |d      5 }t	        j
                  dd| g|t        j                  d       ddd       t	        j
                  dd|d	|d
|gt        j                  d       t        j                  d||       y# 1 sw Y   NxY w)zIGenerate a MinGW import library (.a) from a DLL using gendef and dlltool.r   gendef-Tr  Nzx86_64-w64-mingw32-dlltoolz-d-lz-Dr]   r   z)Generated MinGW import library %s from %s)	r5   r8   rL  r   r;   r   rV   rO   rP   )r  r  r  dll_namedef_files        r   _gen_mingw_import_libr    s    ww)H	h	 
sH%??		

 NN(	
  HH8/8T+
 
s   +B$$B-z#include <stdint.h>
uint64_t __security_cookie = 0x00002B992DDFA232ULL;
void __security_check_cookie(uint64_t cookie) { (void)cookie; }
void __GSHandlerCheck(void) {}
c                    t         j                  j                  | d      }t         j                  j                  |      ryd}d}	 t         j                  j                  | d      }t         j                  j                  | d      }t	        |d      5 }|j                  t               ddd       t        j                  dd	      }t        j                  |d
|d|gt        j                  d       t        j                  dd      }t        j                  |d||gt        j                  d       t        j                  d|       	 ||fD ]:  }|st         j                  j                  |      s&t        j                  |       < y# 1 sw Y   xY w# t        t        j                   f$ r t        j#                  dd       t         j                  j                  |      rt        j                  |       Y ||fD ]:  }|st         j                  j                  |      s&t        j                  |       < yw xY w# ||fD ]:  }|st         j                  j                  |      s&t        j                  |       < w xY w)z
    Create a static library with MSVC GS security symbol stubs for MinGW.

    Returns the library name (without lib prefix / .a suffix) if successful,
    or None on failure.
    zlibmsvc_gs_stubs.amsvc_gs_stubsr   z_msvc_gs_stubs.cz_msvc_gs_stubs.or   NrH   rF   r   r   Tr  arrcsz!Created MSVC GS stubs library: %sz'Failed to create MSVC GS stubs library.exc_info)r5   r8   r9   rN   r   r  _MSVC_GS_STUBS_SOURCEr   r(   r;   r   rV   rO   rP   rX  r>   r   warning)r   	stubs_libsrc_pathr  r  	mingw_gccmingw_ars          r   _create_msvc_gs_stubs_libr  .  s     Z)=>I	ww~~i HH77<<
,>?77<<
,>?(C  	+AGG)*	+ %%eU3	hh7??	

 $$UD1ui2??	

 	4i@ H% 	ARWW^^A&		!	5	+ 	+" z<<= 5 	 	
 77>>)$IIi H% 	ARWW^^A&		!	 H% 	ARWW^^A&		!	sK   AF F
(BF 
FF A$H>:I =H>>I 
JJ,Jrw  c                    ddl }t        j                  j                  d      }|st        j                  d       g S | D ]Y  }t        j                  j                  t        j                  j                  |d            sAt        j                  d|       g c S  t        j                  j                  |dd      }t        j                  j                  |      s t        j                  j                  |d      }|j                  t        j                  j                  |d	            }d}| D ]  }t        j                  j                  |      s#t        j                  |t        j                        sHt        j                  j                  t        j                  j                  |d
            s|} n |s*t        j                  d|       |t        |      }|r|gS g S |t        j                  d|        g S |d   }t        j                  j                  |      }	t        j                  j                  ||	j                  dd            }
t        j                  j                  |d      }	 t!        ||
|       g S # t"        t$        j&                  f$ rl t        j                  dd       |
|fD ]7  }t        j                  j                  |      s#t        j(                  |       9 t        |      }|r|gcY S g cY S w xY w)a  
    Auto-generate a MinGW-compatible import library (libcudart.a)
    from the CUDA runtime DLL. This avoids linking against the hybrid cudart.lib
    which contains MSVC-compiled static objects with /GS security symbols that
    MinGW cannot resolve.

    Falls back to creating MSVC GS security stubs if the DLL is unavailable,
    and falls back gracefully to the original cudart.lib if that also fails.

    Returns a list of extra library names to link (e.g. ["msvc_gs_stubs"]).
    r   NWINDOWS_CUDA_HOMEzFWINDOWS_CUDA_HOME not set, skipping MinGW cudart import lib generationzlibcudart.az5libcudart.a already exists in %s, skipping generationrG   r   zcudart64_*.dllz
cudart.libztNo cudart64_*.dll found in %s. Cannot generate MinGW import library. Will create MSVC GS security stubs as fallback.zNo writable directory containing cudart.lib found. Cannot generate MinGW import library. If linking fails with undefined references to __security_cookie, ensure cudart.lib is present in one of: %sz.dllz.defzNFailed to generate MinGW cudart import library. Falling back to MSVC GS stubs.Tr  )globr5   rQ   rR   rO   debugr8   rN   r9   r   accessW_OKr  r  rL  r(   r  r>   r;   r   rX  )rw  r  windows_cuda_homelib_dirbin_dirdll_candidatesr   stub_libr  r  r  r  r  s                r   _ensure_mingw_cudart_import_libr  ]  sw    

':;		T	
 	! 77>>"'',,w>?IIMwWI ggll,eU;G77==!'',,0%8YYrww||G5EFGN J! 77==!bii&Aww~~bggll7LAB$
	 >	
 !0<H z!	9 	
 	a Hww)Hww||J(8(8(HIHggll:}=Oh/B	z<<= - 	 	

 O, 	Aww~~a 		!	 -Z8:	s   4J AL'LLLlpathsc                    t        |       D ]  \  }}dt        j                  v s|j                  t        j                  d         s<t	        |      }|Jt        |      | |<   |dz  }|j                         sn| j                  t        |              t        j                         rVt        t        j                        dz  }|j                         r)t        |      | vr| j                  t        |             y y y y )Nr  stubs)	enumerater5   rQ   r  r  r   rN   r   r
   r   r   r   sdk_libis_dir)r  r   r8   r	  stub_dirs        r   _transform_cuda_pathsr    s     V$ -4"**$K9P)Q#9$#?GGF1I(H c(m,- ++,w6??Xf!<MM#h-( "= r    c                     t        j                         rGt        j                  }t        j
                  j                  |      r|| vr| j                  |       y y y y r   )r
   r   r   r  r5   r8   r   r   )r  r  s     r   _transform_rocm_pathsr    sI    %%77==!gV&;MM'" '<! r    device_typer{  c                    g }g }g }g }g }g }g }	t        j                         rEdt        j                  vr3dt        j                  vr!t        j
                  t        j                  d<   t                ddlm}
 |
j                  | t         j                  j                  du       }t         j                  j                  }|
j                  | |t         j                  j                        }| dk(  r|j                  t        j                   j"                  rdnd	       t        j                   j"                  @t        j                         s|s|d
gz  }n|dgz  }|j                  d       t%        |       n`t        j                         s|s|dgz  }n|ddgz  }t         j                  j                  dk(  rt'        |      }|dg|z   z  }t)        |       | dk(  r|j                  d       d}t*        rkt        j,                  d      }|t/        |      |t        j0                  j3                  |d      gz  }|t        j0                  j3                  |d      gz  }n|dgz  }t5        d      st/        |      |ddgz  }|r|dgz  }| dk(  r|j                  d       t        j                         ra|j                  t        j6                         |r$| dk(  rt        j                   j"                  |sdg}	| dk(  rt9               \  }}||z  }||z  }t         j                  j:                  r|t         j                  j:                  z  }|||||||	fS )z
    This function is used to get the build args of device related build options.
    1. Device include_directories, libraries, libraries_directories.
    2. Device MACROs.
    3. MISC
    4. Return the build args
    r  r  r   )cpp_extensionN)r  r   cudaz	 USE_ROCMz	 USE_CUDAamdhip64	torch_hipz __HIP_PLATFORM_AMD__
torch_cudar   cudartxpuz USE_XPUzIntel GPU driver is not properly installed, please follow the instruction in https://github.com/pytorch/pytorch?tab=readme-ov-file#intel-gpu-support.LEVEL_ZERO_V1_SDK_PATHr@  r  zWno-comment	ze_loadersycl	torch_xpumpsz USE_MPSz*-Wl,-Bstatic -lcudart_static -Wl,-Bdynamicr  )r
   r   r5   rQ   r   r  r  torch.utilsr  r`  r   rg  library_pathsr   r   r  r  r  r  r  r  r   r6   r  r8   r9   r   sdk_includer  custom_op_libs)r  rz  r{  rs  rt  ru  rv  rw  rx  ry  r  rg  
extra_libsxpu_error_stringze_rootstdcxx_lib_dir_pathsstdcxx_libss                    r   get_cpp_torch_device_optionsr/    s/     K LFG "NI"$rzz)rzz)"-"6"6

;) ..V((66$>L ''55M"00($11GG 1 N
 f%--*;*;;M==(!j\)	k]*	67!.1!fX%	fl33	""88IE<^L
hZ*44	!.1e:&Z 	 ii 89G.//RWW\\'9=>>Lrww||GU;<<N }o%F,.//k6**	+&Ie:&K334v-}}  (#(T'U$% $%$22N$I))V((777	 	 r    c                        e Zd ZdZedddddddddddddfdeded	ed
ededededededee   dededededdf fdZ	d fdZ
 xZS )CppTorchDeviceOptionsz
    This class is inherited from CppTorchOptions, which automatic contains
    base cxx build options and torch common build options. And then it will
    maintains cuda/xpu device related build args.
    Fr  Tr   r   rP  r^  r  rz  r{  r   r  r  r  r!  r  r|  r}  rY   r   Nc                    t         |   ||||||||
||||       g }g }g }g }g }g }g }t        |||      \  }}}}}}}t        | j                  |       t        | j
                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       t        | j                  |       | j                          y )N)rP  r^  rz  r{  r   r  r  r!  r  r|  r}  rY   )r  rz  r{  )r*  rk   r/  rH  r  r  r  r  r  r  r  r  )rj   rP  r^  r  rz  r{  r   r  r  r  r!  r  r|  r}  rY   device_definitionsdevice_include_dirsdevice_cflagsdevice_ldflagsdevice_libraries_dirsdevice_librariesdevice_passthrough_argsr+  s                         r   rk   zCppTorchDeviceOptions.__init__K  s   " 	+%/-&?#%%' 	 	
 )+)+#%$&+-&(-/ )#%
	
!# 	T&&(:;T'')<=T\\=1T]]N3T))+@AT__&67T++-DE r    c                 2   t         |           t        j                         rtt	               \  }}t        |      dk(  s
J d|        |d   | j                  v r=| j                  j                  |d          | j                  j                  |d          y y y )Nr)   zPython lib dirs: r   )	r*  r  r
   r   r  r  r  rX  r   )rj   r   python_lib_dirsr+  s      r   r  z'CppTorchDeviceOptions._finalize_options  s    !# ":!;A'1,S0A/AR.SS,q!T%9%99$$++OA,>?$$++OA,>? : r    r   )r   r   r   r  r   r   r   r   r   rk   r  r,  r-  s   @r   r1  r1  D  s     * %!""'!&*/%'""#<!<! <! 	<!
 <! <!  <! <! $(<! <! c]<! <! <! <! <!  
!<!|	@ 	@r    r1  rc   c                     t         j                  j                  |       }t         j                  j                  |      \  }}t         j                  j	                  |       }||fS )a  
    This function help prepare parameters to new cpp_builder.
    Example:
        input_code: /tmp/tmpof1n5g7t/5c/c5crkkcdvhdxpktrmjxbqkqyq5hmxpqsfza4pxcf3mwk42lphygc.cpp
        name, dir = get_name_and_dir_from_output_file_path(input_code)
    Run result:
        name = c5crkkcdvhdxpktrmjxbqkqyq5hmxpqsfza4pxcf3mwk42lphygc
        dir = /tmp/tmpof1n5g7t/5c/

    put 'name' and 'dir' to CppBuilder's 'name' and 'output_dir'.
    CppBuilder --> get_target_file_path will format output path according OS:
    Linux: /tmp/tmppu87g3mm/zh/czhwiz4z7ca7ep3qkxenxerfjxy42kehw6h5cjk6ven4qu4hql4i.so
    Windows: [Windows temp path]/tmppu87g3mm/zh/czhwiz4z7ca7ep3qkxenxerfjxy42kehw6h5cjk6ven4qu4hql4i.dll
    )r5   r8   rL  splitextr  )rc   name_and_extr]  _extdirs        r   &get_name_and_dir_from_output_file_pathrA    sL    " 77##I.L!!,/JD$
''//)
$C9r    c                   V   e Zd ZdZedeeef   fd       Zedeeef   fd       Zedeeef   fd       Z	edeeef   fd       Z
	 ddedeee   z  d	ed
eddf
dZdefdZdefdZdee   dee   fdZ	 	 ddZddZdededdfdZdededdfdZdedee   ddfdZdeddfdZy)
CppBuildera  
    CppBuilder is a cpp jit builder, and it supports both Windows, Linux and MacOS.
    Args:
        name:
            1. Build target name, the final target file will append extension type automatically.
            2. Due to the CppBuilder is supports multiple OS, it will maintains ext for OS difference.
        sources:
            Source code file list to be built.
        BuildOption:
            Build options to the builder.
        output_dir:
            1. The output_dir the target file will output to.
            2. The default value is empty string, and then the use current dir as output dir.
            3. Final target file: output_dir/name.ext
    r   c                  2    t         rdnd} t         rdnd}| |fS )Nz.pyd.soz/Fer   r  	extensionoutput_flagss     r   __get_python_module_flagsz$CppBuilder.__get_python_module_flags  s    )Fu	 +u,&&r    c                  2    t         rdnd} t         rdnd}| |fS )Nz.objr   z/c /Foz-c -or  rF  s     r   __get_object_flagszCppBuilder.__get_object_flags  s    )Ft	#.xG,&&r    c                  F    t         s
t               sdnd} t         rdnd}| |fS )N.pch.gchz/Fpr   )r   r-  rF  s     r   __get_precompiled_header_flagsz)CppBuilder.__get_precompiled_header_flags  s#    )Fv	 +u,&&r    c                  "    d} t         rdnd}| |fS )Nz.iz/EP /Pz-E -P -or  rF  s     r   __get_preprocessor_output_flagsz*CppBuilder.__get_preprocessor_output_flags  s    	#.xJ,&&r    r]  sourcesBuildOptionr   Nc                 ^   d| _         d| _        d| _        d| _        d| _        d| _        d| _        d| _        g | _        d| _	        d| _
        d| _        d| _        || _        t        j                  j                   xs d| _        || _        |j'                         | _         |j)                         | _        |j+                         | _        || _	        |j-                         | _        |j1                         | _        |j5                         | _        t9        | j.                  | j2                  | j6                  f      dk  sJ | j.                  xs | j2                  xs | j6                   | _        t<        r| j2                  rJ d       | j.                  r| j?                         \  }}nS| j2                  r| jA                         \  }}n3| j6                  r| jC                         \  }}n| jE                         \  }}tF        jH                  jK                  | j                  | j                   |       | _
        | j                  r)tF        jH                  jM                  | j                        n| j                  }t<        r | j6                  r|| _'        n| | | _'        n| d| | _'        tQ        |tR              r|g}t        jT                         rH| j                  r<tW        |      | _        |D cg c]!  }tF        jH                  jM                  |      # }}| j2                  rXtY        |      dk(  sJ d|d    | _-        | j                  rEt]        |j'                               r,| xj                  d	z  c_        ndjK                  |      | _-        |j_                         D ];  }	t<        r| xj                  d
|	 dz  c_        #| xj                  d|	 dz  c_        = |ja                         D ];  }
t<        r| xj                  d|
 dz  c_        #| xj                  d|
 dz  c_        = |jb                  x}rbt<        rtd        jg                  d|       nEd| d| _        | j                  r.t]        |j'                               r| xj                  dz  c_        |ji                         D ]N  }t<        r| xj                  d| dz  c_        #| xj                  dtk        jl                  |       dz  c_        P |jo                         D ];  }t<        r| xj                  d
| dz  c_        #| xj                  d| dz  c_        = |jq                         D ];  }t<        r| xj
                  d| dz  c_        #| xj
                  d| dz  c_        = |js                         D ];  }t<        r| xj                  d| dz  c_        #| xj                  d| dz  c_        = | ju                  |jw                               D ]  }| xj                  | dz  c_         y c c}w )Nr   F
aoti_modelr)   z/Cannot currently precompile headers on Windows!r   z-x c++-header r   z- -relocatable-pch -Xclang -fno-pch-timestamp ro  r  z/D z-D zIPrecompiled header support for MSVC is currently unavailable; ignoring %sz	-include z -Xclang -fno-validate-pch z/I "z" z-Iz
/LIBPATH:"z-Lr   z.lib" r  )<r  _cflags_args_definitions_args_include_dirs_args_ldflags_args_libraries_dirs_args_libraries_args_passthrough_parameters_args_orig_source_paths_output_dir_target_filer  r  _namer
   r   model_name_for_generated_files_target_name_build_optionr  r  r  r  r  r  r  r  r  sum_do_linkr   _CppBuilder__get_object_flags)_CppBuilder__get_precompiled_header_flags*_CppBuilder__get_preprocessor_output_flags$_CppBuilder__get_python_module_flagsr5   r8   r9   rL  _outputr   r   r   r   r  _sources_argsr  r  r  r  rO   r  r  rd  quoter  r  r  _stage_passthrough_pathsr  )rj   r]  rR  rS  r   file_extrH  relative_target_filer   cflag
definitionr  inc_dirldflagr	  r  passthrough_args                    r   rk   zCppBuilder.__init__  s    !#"$$&!!,.) #%(-$
>>N, 	
 )$113"-"C"C"E$113%(99;(99;);;=D&&(:(:D<O<OPQUVVVVK$"4"4K8K8K
 d&8&8 	
=	
8 %)%<%<%>"Hl%)%H%H%J"Hl  %)%I%I%K"Hl%)%C%C%E"HlGGLL)9)9djj\(;TU && GGT../"" 	
 ""+".0D/EF*^1-A,BCDLgs#iG $"9"9 '+7mD#4;<qrww''*<G<w<1$$$#1'!*!>D&&9[5M5M5O+P !!%TT!!$'!2D ++- 	2E!!qq\1!!!qq\1!		2 &557 	>J&&C
|1*==&&&C
|1*==&		> "-!?!???_&
 -66H5I*K'**y9Q9Q9S/T %%)FF%"335 	HG''T'"+=='''RG0D/EQ+GG'		H "--/ 	4F""&m3"""&m3"		4 #557 	=G))z'"-EE)))r'!_<)		= ,,. 	4C$$!C57$$$"SE3$		4  $<<,,. 
 	GO --O3DA1FF-	GE =s   4&X*c                     dt         dt         dt         dt         dt         dt         dt         dt         d	t         d
t         dt         f fd} | j                   j                   j                   j                   j
                   j                   j                   j                   j                   j                  
      }|S )NrY   rR  include_dirs_argsdefinitions_argscflags_argsldflags_argslibraries_argslibraries_dirs_argsry  rf  r   c
                     t         r=|  d| d| d| d| d| d|	 }
j                  r|
d| d| d| z  }
t        |
      }
|
S |  d| d| d| d| d| d|	 }
j                  r|
d| d| d| z  }
|
S )Nr   z /LD /link )r   re  r   )rY   rR  rv  rw  rx  ry  rz  r{  ry  rf  r   rj   s              r   format_build_commandz9CppBuilder.get_command_line.<locals>.format_build_commands	  s       j"3!4A6F5GqUViq!1 2!F8=  ==[)<(=Q~>NaP\~^^C.s3 J  j'!,<+=Q{m1()+;*<AfXG  ==Q|nAn-=Q?R>STTCJr    )
rY   rR  rv  rw  rx  ry  rz  r{  ry  rf  )r   r  rk  rX  rW  rV  rY  r[  rZ  r\  rj  )rj   r}  command_lines   `  r   get_command_linezCppBuilder.get_command_liner	  s    			  #	 "		
 	 	  	 "%	 "	 	 	> ,^^&&"55!33))++// $ 9 9!>><<
 r    c                 ,    t        | j                        S r   )r   r_  r{   s    r   get_target_file_pathzCppBuilder.get_target_file_path	  s    '(9(9::r    r   c                    t        j                         r| j                  s|S g }|D ]  }t        j                  |      }g }|D ]  }t
        j                  j                  |      rit
        j                  j                  |      rJ| j                  j                  |       |j                  t
        j                  j                  |             |j                  |        |j                  dj                  d |D                      |S )a  For fbcode remote builds, treat any absolute file path that appears
        as a passthrough arg (e.g. precompiled .so kernels passed in via
        ``extra_flags``) the same way as a source: stage the file into the
        remote build sandbox and rewrite the command to reference it by
        basename. Without this the linker is handed a path that only exists on
        the submitting host and the remote build fails to find the file.r   c              3   F   K   | ]  }t        j                  |        y wr   )rd  rl  )rC  ts     r   rE  z6CppBuilder._stage_passthrough_paths.<locals>.<genexpr>	  s     %Iekk!n%IrF  )r
   r   r  rd  r   r5   r8   isabsr  r]  r   rL  r9   )rj   r   	rewrittenargtokens
new_tokenstoks          r   rm  z#CppBuilder._stage_passthrough_paths	  s       "t'>'>K	 		KC[[%FJ +77==%"''..*=++2237%%bgg&6&6s&;<%%c*+ SXX%Ij%IIJ		K r    c                    t        d      5  t        j                  | j                               }	 | j                  }t
        j                  j                  t        d      }t        j                         5 }t        j                  t        t
        j                  j                  |d             | j                  D ]S  }t        j                  |t
        j                  j                  |t
        j                  j                  |                   U t
        j                  j                  |d      }t        j                   ||       | j"                  j$                  }|rt
        j                  j'                  |      rt(        s
t+               sdnd}||z   }	t
        j                  j                  |      }
t        j                  |t
        j                  j                  ||
             t
        j                  j'                  |	      r7t        j                  |	t
        j                  j                  ||
|z                |D cg c]  }||k(  r|
n| }}| j,                  s!|r&t
        j                  j'                  |      rddg|dd t/        ||t
        j                  j                  |      t0        	      }t
        j                  j3                  |      rt        j4                  |       t        j                  ||       |j7                  d
      rt        j8                  |d       n'|j7                  d      rt        j8                  |d       d d d        d d d        y c c}w # 1 sw Y   xY w# t:        j<                  $ r5}t?        j@                  ||jB                  jE                  d            |d }~ww xY w# 1 sw Y   y xY w)Nrk  r@  z	script.ldrM  rN  z	-isysrootr}   r)   )exception_classr   i  rE  i  r   )#r	   rd  r   r  r_  r5   r8   r9   _TORCH_PATHtempfileTemporaryDirectoryrS   r;  rK  r]  rL  copytreerc  r  r  r   r-  r  r   r   rN   rX  endswithchmodr;   r   r   re  rf  r  )rj   r  output_pathtorch_includes_pathtmp_dirsrcdest_include_path
pch_headerpch_extpch_compiledpch_basenamer  tmp_output_pathr_   s                 r   build_fbcode_rezCppBuilder.build_fbcode_re	  s    .) >	Tkk$"7"7"9:G<T"// ')ggll;	&J#002 45gKKWk0RS#66 WCgrww?O?OPS?T)UVW(*Wi(H%OO$79JK
 "&!3!3!F!FJ!bggnnZ&@,7vx&V'1G';')ww'7'7
'CJWl0ST77>>,7"KK , "WlW6L M (/# # -0:,=L3F# # ))"rww~~j'A(3S'9!
 '9((5(4	'O ww~~k2		+.KK="++D1e4$--e4e4i45>	T >	T<#-45 45j 00 T))'188??73KLRSST{>	T >	TsU   $N?AM45GM(M#C?M(M4#M((M1	-M44N<0N77N<<N??Oc                 F   | j                   r| j                         S t        | j                         t        j
                  j                  | j                  | j                   dt               }t        |       | j                         }t        ||       t        |       y)z
        It is must need a temporary directory to store object files in Windows.
        After build completed, delete the temporary directory to save disk space.
        r   ra  N)r  r  rT  r^  r5   r8   r9   r`  _BUILD_TEMP_DIRr  rl  r_  )rj   _build_tmp_dir	build_cmds      r   buildzCppBuilder.build	  s    
 ""'')) !1!12Ao->?
 	!0))+		~6N#r    
cmake_pathr  c                 B   dj                  | j                  j                               }t        j                  j
                  sdnd}t        j                  d| j                   d| j                   d| d      }t        j                  j                  st        j                  j                  rv|t        j                  d      z  }|t        j                  d| j                   d	| d
| j                   d	| j                   d| j                   d	| j                   d      z  }n3|t        j                  d| j                   d| j                   d      z  }|dk(  rtt        j                  j                   Zddlm}  |       }|t        j                  d| j                   d| j                   d| j                   d| d| d| d| d      z  }n|dk(  r|t        j                  d      z  }t'        |d      5 }|j)                  |       ddd       y# 1 sw Y   yxY w)z
        Save global cmake settings here, e.g. compiler options.
        If targeting CUDA, also emit a custom function to embed CUDA kernels.
        r   STATICSHAREDzR
            cmake_minimum_required(VERSION 3.27 FATAL_ERROR)
            project(zs LANGUAGES CXX)
            set(CMAKE_CXX_STANDARD 20)

            # Set a library target
            add_library(z)

            z
                # May need to point CMAKE_PREFIX_PATH to the right torch location
                find_package(Torch REQUIRED)

                zT
                # Add macro definitions
                target_compile_definitions(	 PRIVATE zN)

                # Add compile flags
                target_compile_options(zS)

                # Backend-specific flags
                target_compile_options(z -c)

                z
                find_package(TorchStandalone REQUIRED)
                # Set up include directories to find headers at the correct paths
                target_include_directories(zU PRIVATE ${TorchStandalone_INCLUDE_DIRS})
                target_include_directories(zF PRIVATE ${TorchStandalone_INCLUDE_DIRS}/standalone)

                r  Nr   )_nvcc_arch_as_compile_optionz
                enable_language(CUDA)
                set(CMAKE_CUDA_STANDARD 17)
                find_package(CUDAToolkit REQUIRED)
                target_include_directories(zQ PRIVATE ${CUDAToolkit_INCLUDE_DIRS})
                target_compile_definitions(z9 PRIVATE USE_CUDA)
                target_link_libraries(ab   PRIVATE cuda CUDA::cudart_static)

                find_program(OBJCOPY_EXECUTABLE objcopy)
                if(NOT OBJCOPY_EXECUTABLE)
                    message(FATAL_ERROR "objcopy not found. Cannot embed fatbin as object file")
                endif()

                set(KERNEL_TARGETS "")
                set(KERNEL_OBJECT_FILES "")
                # Function to embed a single kernel
                function(embed_gpu_kernel KERNEL_NAME PTX_FILE)
                    set(FATBIN_BASENAME ${KERNEL_NAME}.fatbin)
                    set(FATBIN_FILE ${CMAKE_CURRENT_BINARY_DIR}/${FATBIN_BASENAME})
                    set(OBJECT_BASENAME ${KERNEL_NAME}.fatbin.o)
                    set(OBJECT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${OBJECT_BASENAME})

                    # --- Define UNIQUE C symbol names ---
                    set(SYMBOL_START __${KERNEL_NAME}_start)
                    set(SYMBOL_END __${KERNEL_NAME}_end)
                    set(SYMBOL_SIZE __${KERNEL_NAME}_size)
                    string(REGEX REPLACE "[^a-zA-Z0-9]" "_" MANGLED_BASENAME ${FATBIN_FILE})
                    set(OBJCOPY_START_SYM _binary_${MANGLED_BASENAME}_start)
                    set(OBJCOPY_END_SYM _binary_${MANGLED_BASENAME}_end)
                    set(OBJCOPY_SIZE_SYM _binary_${MANGLED_BASENAME}_size)

                    # --- PTX to FATBIN Command & Target ---
                    add_custom_command(
                        OUTPUT ${FATBIN_FILE}
                        COMMAND ${CUDAToolkit_NVCC_EXECUTABLE} --fatbin ${PTX_FILE} -o ${FATBIN_FILE} ${NVCC_GENCODE_FLAGS}
                                -gencode arch=compute_z,code=compute_z7
                                -gencode arch=compute_z	,code=sm_a'  
                        DEPENDS ${PTX_FILE}
                    )

                    # --- FATBIN to Object File (.o) Command ---
                    add_custom_command(
                        OUTPUT ${OBJECT_FILE}
                        COMMAND ${CMAKE_LINKER} -r -b binary -z noexecstack -o ${OBJECT_FILE} ${FATBIN_FILE}
                        COMMAND ${OBJCOPY_EXECUTABLE} --rename-section .data=.rodata,alloc,load,readonly,data,contents
                                ${OBJECT_FILE}
                        COMMAND ${OBJCOPY_EXECUTABLE}
                                --redefine-sym ${OBJCOPY_START_SYM}=${SYMBOL_START}
                                --redefine-sym ${OBJCOPY_END_SYM}=${SYMBOL_END}
                                --redefine-sym ${OBJCOPY_SIZE_SYM}=${SYMBOL_SIZE}
                                ${OBJECT_FILE}
                        DEPENDS ${FATBIN_FILE}
                    )
                    add_custom_target(build_kernel_object_${KERNEL_NAME} DEPENDS ${OBJECT_FILE})

                    # --- Add to a list for linking later ---
                    set(KERNEL_TARGETS ${KERNEL_TARGETS} build_kernel_object_${KERNEL_NAME} PARENT_SCOPE)
                    set(KERNEL_OBJECT_FILES ${KERNEL_OBJECT_FILES} ${OBJECT_FILE} PARENT_SCOPE)
                endfunction()

                r   a=	  
                find_program(OBJCOPY_EXECUTABLE objcopy)
                if(NOT OBJCOPY_EXECUTABLE)
                    message(FATAL_ERROR "objcopy not found. Cannot embed spv as object file")
                endif()

                set(KERNEL_TARGETS "")
                set(KERNEL_OBJECT_FILES "")
                # Function to embed a single kernel
                function(embed_gpu_kernel KERNEL_NAME SPV_FILE)
                    set(OBJECT_BASENAME ${KERNEL_NAME}.spv.o)
                    set(OBJECT_FILE ${CMAKE_CURRENT_BINARY_DIR}/${OBJECT_BASENAME})

                    # --- Define UNIQUE C symbol names ---
                    set(SYMBOL_START __${KERNEL_NAME}_start)
                    set(SYMBOL_END __${KERNEL_NAME}_end)
                    set(SYMBOL_SIZE __${KERNEL_NAME}_size)
                    string(REGEX REPLACE "[^a-zA-Z0-9]" "_" MANGLED_BASENAME ${SPV_FILE})
                    set(OBJCOPY_START_SYM _binary_${MANGLED_BASENAME}_start)
                    set(OBJCOPY_END_SYM _binary_${MANGLED_BASENAME}_end)
                    set(OBJCOPY_SIZE_SYM _binary_${MANGLED_BASENAME}_size)

                    # --- SPV_FILE to Object File (.o) Command ---
                    add_custom_command(
                        OUTPUT ${OBJECT_FILE}
                        COMMAND ${CMAKE_LINKER} -r -b binary -z noexecstack -o ${OBJECT_FILE} ${SPV_FILE}
                        COMMAND ${OBJCOPY_EXECUTABLE} --rename-section .data=.rodata,alloc,load,readonly,data,contents
                                ${OBJECT_FILE}
                        COMMAND ${OBJCOPY_EXECUTABLE}
                                --redefine-sym ${OBJCOPY_START_SYM}=${SYMBOL_START}
                                --redefine-sym ${OBJCOPY_END_SYM}=${SYMBOL_END}
                                --redefine-sym ${OBJCOPY_SIZE_SYM}=${SYMBOL_SIZE}
                                ${OBJECT_FILE}
                        DEPENDS ${SPV_FILE}
                    )
                    add_custom_target(build_kernel_object_${KERNEL_NAME} DEPENDS ${OBJECT_FILE})

                    # --- Add to a list for linking later ---
                    set(KERNEL_TARGETS ${KERNEL_TARGETS} build_kernel_object_${KERNEL_NAME} PARENT_SCOPE)
                    set(KERNEL_OBJECT_FILES ${KERNEL_OBJECT_FILES} ${OBJECT_FILE} PARENT_SCOPE)
                endfunction()

                r   )r9   rc  r  r
   r   dynamic_linkagetextwrapdedentrb  rg  test_configsuse_libtorchrV  r\  r  r  r  *torch._inductor.codegen.cuda.compile_utilsr  r   r  )	rj   r  r  rs  target_library_typecontentsr  current_archr  s	            r   save_compile_cmd_to_cmakez$CppBuilder.save_compile_cmd_to_cmake
  st    hht11AACD"//??HX 	 ??&&' ( **+1-@,A B

 ,,0C0C0P0P  H ,,0,=,=+>i} U( )-(9(9':)DDUDUCV W( )-(9(9':)DDeDeCf g
 H , -1,=,=+> ?,,0,=,=+> ?	 H & U]]%6%6%> 89L, -1,=,=+> ?,,0,=,=+> ?''+'8'8&9 :7: 8DnNS_R` a77CnIl^ \I<> >H~ E!*, ,H\ *c" 	aGGH	 	 	s   :HHr  c                     dt        |      j                  z   }t        |d      5 }|j                  d| j                   d| d       d d d        y # 1 sw Y   y xY w)N${CMAKE_CURRENT_SOURCE_DIR}/aztarget_sources(r  z)
)r   r]  r   r  rb  )rj   r  r  r  s       r   save_src_to_cmakezCppBuilder.save_src_to_cmake
  s]    1DN4G4GG*c" 	QaGGod&7&7%8	(3OP	Q 	Q 	Qs   #AA	asm_filesc           	         t        |d      5 }|D ]n  }t        |      j                  j                  d      d   }dt        |      j                   }t	        j
                  d| d| d      }|j                  |       p |r>|j                  d| j                   d	       |j                  d
| j                   d       d d d        y # 1 sw Y   y xY w)Nr  r}   r   r  z&
                    embed_gpu_kernel(r   z)
                    zadd_dependencies(z ${KERNEL_TARGETS})
ztarget_link_libraries(z! PRIVATE ${KERNEL_OBJECT_FILES})
)r   r   r]  r   r  r  r  rb  )rj   r  r  r  asm_filer   r  s          r   save_kernel_asm_to_cmakez#CppBuilder.save_kernel_asm_to_cmake
  s    *c" 	a% ""8n1177<Q?;DN<O<O;PQ#??&&1]!H: >
 !" +D,=,=+>>UVW,T->->,??cd	 	 	s   B4C

Cc                    dj                  | j                  j                               }dj                  | j                  j                               }t	        j
                  d| j                   d| d| j                   d| d	      }t        j                  j                  |      sJ d| d       t        |d      5 }|j                  |       d d d        y # 1 sw Y   y xY w)	Nr   z@
            # Add linker flags
            target_link_options(r  zA)

            # Add libraries
            target_link_libraries(z)
         z#save_link_cmd_to_cmakefile expects z to already existr  )r9   rc  r  r  r  r  rb  r5   r8   rN   r   r  )rj   r  lflagsr{  r  r  s         r   save_link_cmd_to_cmakez!CppBuilder.save_link_cmd_to_cmake
  s    $,,88:;xx**88:;??!!%!2!2 39VH E# $(#4#4"5Ytf E

 ww~~j) 	
1*=NO	
) *c" 	aGGH	 	 	s   ?CC#)r   r   )r   r   r   r  staticmethodr   r   ri  rf  rg  rh  r   rr  rk   r  r  rm  r  r  r  r  r  r  r   r    r   rC  rC    s     'uS#X ' '
 'c3h ' '
 'E#s(O ' '
 'U38_ ' ' ZGZG tCyZG &	ZG
 ZG 
ZGx,# ,\;c ;T#Y 49 ,AT	ATF$$ww w 
	wrQC Q3 Q4 Q3 49 QU $  r    rC  r  targetc                     dt         fd}dt         dt         dt         dt         fd} |       } ||t        |       t        |            }t        |t        |             y )	Nr   c                  H    t         rd} | S t               } t        |       rd} | S )Nml64rF   )r   r   r+  )ASM_CCs    r   get_asm_compilerz.run_asm_build_object.<locals>.get_asm_compiler
  s-    F 	 &'F!&)r    asm_ccr  r  c                 >    t         r|  d| d| }|S |  d| d| }|S )Nr   z /c /Fo z -c z -o r  )r  r  r  r   s       r   r  z.run_asm_build_object.<locals>.get_command_line
  sA     HAcU(6(3C 
 HDT&2C
r    )r  r  r  r  )r   r   rl  )r  r  ra  r  r  r  r   s          r   run_asm_build_objectr  
  sh    c  3    F
$S)'/C
 C5c:;r    )rF   )T)r  )F)Tr   Fr   )FF)r;  re   rR  	functoolsr  localeloggingr5   r4   r   rd  rS   r;   r3   rn  r  r  rr  collections.abcr   r   r   ctypes.utilr   pathlibr   typingr   r  torch._dynamo.utilsr	   r  r
   r   torch._inductor.cpu_vec_isar   r   %torch._inductor.runtime.runtime_utilsr   torch.torch_versionr   torch.utils._ordered_setr   r   triton.fb.buildr   r   torch._inductor.fb.utilsr   r   r   r   r   r  r8   r  __file___HEREr  r  r9   rK  r  	_IS_LINUXr  r   r   getpreferredencodingr  	getLoggerr   rO   	lru_cacher   rD   r:   cacher`   rb   r   r   r   r   r   r   r   r  r  r  r  r   r  r   r+  r-  r/  r(  r2  r4  r<  rH  rL  rT  r_  ri  rl  r   rr  r  r  r  r  r  r  r  r  r  r  r   r&  r(  r4  r6  r=  rO  r]  rj  rv  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r/  r1  rA  rC  r  r   r    r   <module>r     sz          	  	    
     $ ! $    , ' ? ; , / 6? s c d c S T S C D d 
 
!ggoobggooe45k+@A LL##G,	LL##H-	llg%$	 3> V  "I.2  g! Q! ! ! !8s 4 
3 
4 
 
J JZ l
 l
 l
 l
^ s s  ># 6$ 5c? " 	 	
 	< /sCx!// / 		/d 5# 5$ 5 5
 ?C ?D ? ? C# C$ C C LC L L L L. c d  * )S )T ) )X ' ' ' )$ ) ) 24 2 2 / / / +D + +    *?DI ?c ?t ?49 c Os Ot O	# 	$ 	6s 6 6 6.(c ( ( (
  u  u p S	 " "$s) "!S !T#Y !H# $s) tCy @5cDI1E+F $ jo  & 
s 
s 
 
s tCy > -2==%)=
49d3i =@ c * !#... . #	.
 . 49d3icDItCy$s)TRUYVW.b5!! 5!p49 2d3i 2c ((;(;(; (; 49d3icDI56	(;V6 eDItCy<P6Q ((3(3%)(3
49d3ic*+(3V
$s) 
0%S	49(<"= 02    tSy)  ( 
3 
# 
$ 
 
 ? ? ? ?<jUjU
49d3icDItCy$s)KLjUZ
U49d3i#78 
7;	#Y T#Y ZZZ Z 	Z
 Z Z  $Z 49d3icDItCy$s)TRUYVWZzC!j C!L7 Q   UC U3 U UQU UD ,# ,#* ,^UDI U$s) Up)$s) ) )*#$s) # # ooo o 49d3icDItCy$s)TRUYVW	odN@O N@b
38_0C	 C	L<c <3 <S <T <r    