U
    ,dv                     @   s  d Z ddlZddlZddlZddlZddlmZmZmZm	Z	m
Z
mZ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mZ ddlmZmZ eeZdZdZd	Zd
Z dZ!eZ"eZ#d$ Z%e&e%D ]\Z'Z(e)ej*e e(e' qdd Z+e, Z-G dd de.Z/G dd de.Z0dZ1da2dd Z3dd Z4dd Z5dZ6G dd de.Z7dZ8dZ9dZ:d Z;d!Z<d"Z=d#Z>d$d% Z?d&d' Z@d(d) ZAd*d+ ZBd,d- ZCd.d/ ZDd0d1 ZEd2d3 ZFeGd4ZHeGd5ZIeGd6ZJd7ZKeGeKLd8d9ZMeGd:ZNd;d<d=d>d?d@dAdBdCdDdEdFhZOeGdGZPeGdHZQeGdIZReGdJZSeGdKZTeGdLZUeGdMZVeGdNZWeGdOZXdPdQdRZYdSdT ZZdUdV Z[dWdX Z\dYdZ Z]d[d\ Z^d]d^ Z_d_d` Z`dS )az(
This is a direct translation of nvvm.h
    N)c_void_pc_intPOINTERc_char_pc_size_tbyrefc_char)ir   )	NvvmErrorNvvmSupportError)get_libdeviceopen_libdeviceopen_cudalib)cgutilsconfig         a  
NVVM_SUCCESS
NVVM_ERROR_OUT_OF_MEMORY
NVVM_ERROR_PROGRAM_CREATION_FAILURE
NVVM_ERROR_IR_VERSION_MISMATCH
NVVM_ERROR_INVALID_INPUT
NVVM_ERROR_INVALID_PROGRAM
NVVM_ERROR_INVALID_IR
NVVM_ERROR_INVALID_OPTION
NVVM_ERROR_NO_MODULE_IN_PROGRAM
NVVM_ERROR_COMPILATION
c                   C   s*   z
t   W n tk
r    Y dS X dS dS )z(
    Return if libNVVM is available
    FTN)NVVMr    r   r   ;/tmp/pip-unpacked-wheel-eu7e0c37/numba/cuda/cudadrv/nvvm.pyis_available3   s
    
r   c                   @   s   e Zd ZdZeeeeefeeefeeefeeee	efeeee	efeeeeefeeee	feeefeeee	feeefeeeeeeeeefdZ
dZdd Zdd Zedd	 Zd
d Zdd ZdddZdS )r   zProcess-wide singleton.
    )nvvmVersionnvvmCreateProgramnvvmDestroyProgramnvvmAddModuleToProgramnvvmLazyAddModuleToProgramnvvmCompileProgramnvvmGetCompiledResultSizenvvmGetCompiledResultnvvmGetProgramLogSizenvvmGetProgramLognvvmIRVersionNc                 C   s   t  | jd krt|  | _}ztd|_W n8 tk
rf } zd | _d}t|| W 5 d }~X Y nX |j	 D ]8\}}t
|j|}|d |_|dd  |_t||| qrW 5 Q R X | jS )NZnvvmz;libNVVM cannot be found. Do `conda install cudatoolkit`:
%sr   r
   )
_nvvm_lock_NVVM__INSTANCEobject__new__r   driverOSErrorr   _PROTOTYPESitemsgetattrrestypeargtypessetattr)clsinsteerrmsgnameprotofuncr   r   r   r'   y   s    

zNVVM.__new__c                 C   s4   |   }|d | _|d | _|d | _|d | _d S )Nr   r
      r   )get_ir_version_majorIR_minorIRZ	_majorDbgZ	_minorDbg)selfir_versionsr   r   r   __init__   s
    


zNVVM.__init__c                 C   s   | j | jfdkS )N)r
      )r9   r:   r;   r   r   r   	is_nvvm70   s    zNVVM.is_nvvm70c                 C   s8   t  }t  }| t|t|}| |d |j|jfS )NzFailed to get version.)r   r   r   check_errorvalue)r;   majorminorerrr   r   r   get_version   s
    zNVVM.get_versionc                 C   sX   t  }t  }t  }t  }| t|t|t|t|}| |d |j|j|j|jfS )NzFailed to get IR version.)r   r#   r   rA   rB   )r;   ZmajorIRZminorIRZmajorDbgZminorDbgrE   r   r   r   r8      s     zNVVM.get_ir_versionFc                 C   s2   |r.t |t| }|r*t| td n|d S )Nr
   )r   RESULT_CODE_NAMESprintsysexit)r;   errormsgrJ   excr   r   r   rA      s    zNVVM.check_error)F)__name__
__module____qualname____doc__nvvm_resultr   r   nvvm_programr   r   r*   r%   r'   r=   propertyr@   rF   r8   rA   r   r   r   r   r   B   sR   

              2

r   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )CompilationUnitc                 C   s4   t  | _t | _| jt| j}| j|d d S )NzFailed to create CU)r   r(   rS   _handler   r   rA   )r;   rE   r   r   r   r=      s    zCompilationUnit.__init__c                 C   s*   t  }|t| j}|j|ddd d S )NzFailed to destroy CUT)rJ   )r   r   r   rV   rA   )r;   r(   rE   r   r   r   __del__   s    zCompilationUnit.__del__c                 C   s*   | j | j|t|d}| j |d dS )z
         Add a module level NVVM IR to a compilation unit.
         - The buffer should contain an NVVM module IR either in the bitcode
           representation (LLVM3.0) or in the text representation.
        NFailed to add module)r(   r   rV   lenrA   r;   bufferrE   r   r   r   
add_module   s
     zCompilationUnit.add_modulec                 C   s*   | j | j|t|d}| j |d dS )z
        Lazily add an NVVM IR module to a compilation unit.
        The buffer should contain NVVM module IR either in the bitcode
        representation or in the text representation.
        NrX   )r(   r   rV   rY   rA   rZ   r   r   r   lazy_add_module   s
     zCompilationUnit.lazy_add_modulec                 K   sx  g }d|kr | dr |d | ddr6|d d|krR|d| d  |drp|d	| d  d
}|D ]8}||krxtt| |}|d|dd|f  qx|rdtt|	 }t
d|tt| dd |D  }| j| jt||}| |d t }	| j| jt|	}| |d t|	j  }
| j| j|
}| |d |  | _|
dd S )aF  Perform Compilation

        The valid compiler options are

         *   - -g (enable generation of debugging information)
         *   - -opt=
         *     - 0 (disable optimizations)
         *     - 3 (default, enable optimizations)
         *   - -arch=
         *     - compute_20 (default)
         *     - compute_30
         *     - compute_35
         *   - -ftz=
         *     - 0 (default, preserve denormal values, when performing
         *          single-precision floating-point operations)
         *     - 1 (flush denormal values to zero, when performing
         *          single-precision floating-point operations)
         *   - -prec-sqrt=
         *     - 0 (use a faster approximation for single-precision
         *          floating-point square root)
         *     - 1 (default, use IEEE round-to-nearest mode for
         *          single-precision floating-point square root)
         *   - -prec-div=
         *     - 0 (use a faster approximation for single-precision
         *          floating-point division and reciprocals)
         *     - 1 (default, use IEEE round-to-nearest mode for
         *          single-precision floating-point division and reciprocals)
         *   - -fma=
         *     - 0 (disable FMA contraction)
         *     - 1 (default, enable FMA contraction)
         *
         debugz-gZlineinfoFz-generate-line-infooptz-opt=%darchz-arch=%s)ftz	prec_sqrtprec_divfmaz-%s=%d_-, zunsupported option {0}c                 S   s   g | ]}t |d qS )utf8)r   encode).0xr   r   r   
<listcomp>  s   z+CompilationUnit.compile.<locals>.<listcomp>zFailed to compile
z&Failed to get size of compiled result.zFailed to get compiled result.N)popappendgetintboolreplacejoinmapreprkeysr   formatr   rY   r(   r   rV   
_try_errorr   r   r   r   rB   r    get_loglog)r;   optionsoptsZother_optionskvZoptstrZc_optsrE   reslenZptxbufr   r   r   compile   s>    #




zCompilationUnit.compilec                 C   s   | j |d||  f  d S )Nz%s
%s)r(   rA   ry   )r;   rE   rL   r   r   r   rx   .  s    zCompilationUnit._try_errorc                 C   sl   t  }| j| jt|}| j|d |jdkrht|j  }| j| j|}| j|d |j	dS dS )Nz#Failed to get compilation log size.r
   zFailed to get compilation log.rh    )
r   r(   r!   rV   r   rA   rB   r   r"   decode)r;   r   rE   Zlogbufr   r   r   ry   1  s    
zCompilationUnit.get_logN)
rN   rO   rP   r=   rW   r\   r]   r   rx   ry   r   r   r   r   rU      s   

WrU   ze-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-n16:32:64c                  C   s   t rt S zddlm}  |  }W n   d}Y nX |d  d|d  }d| dd }|dkrfd	a nF|d
krtda n8|dkrda n*|dkrda n|dkrda nd	a t| t S )Nr   )runtime)r   r   .r
   zCUDA Toolkit z is unsupported by Numba - z%10.2 is the minimum required version.r   )
   r7   )r   r   r      r   r   r   r7   r   r   r>   r   r>   r
   r>   r7   r   r   r   r7   r   r   )   r   )r   r   r   r   r   r   r   r   r   r   r      r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r>   )r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   )_supported_ccZnumba.cuda.cudadrv.runtimer   rF   warningswarn)r   Zcudart_versionZctk_verZunsupported_verr   r   r   get_supported_ccsI  s0    


r   c                 C   sv   t  }|sd}t|t|D ]N\}}|| kr6|  S || kr|dkr\d| |  }t|q||d    S q|d S )z
    Given a compute capability, return the closest compute capability supported
    by the CUDA toolkit.

    :param mycc: Compute capability as a tuple ``(MAJOR, MINOR)``
    :return: Closest supported CC as a tuple ``(MAJOR, MINOR)``
    zmNo supported GPU compute capabilities found. Please check your cudatoolkit version matches your CUDA version.r   z?GPU compute capability %d.%d is not supported(requires >=%d.%d)r
   )r   r   	enumerate)ZmyccZsupported_ccrL   iccr   r   r   find_closest_arch{  s    
r   c                 C   s"   t jrt j}nt| |f}d| S )z1Matches with the closest architecture option
    zcompute_%d%d)r   ZFORCE_CUDA_CCr   )rC   rD   r`   r   r   r   get_arch_option  s    r   z~Missing libdevice file.
Please ensure you have package cudatoolkit >= 10.2
Install package by:

    conda install cudatoolkit
c                   @   s    e Zd ZdZdd Zdd ZdS )	LibDeviceNc                 C   s0   | j d kr$t d krttt | _ | j | _d S N)_cache_r   RuntimeErrorMISSING_LIBDEVICE_FILE_MSGr   bcr?   r   r   r   r=     s
    

zLibDevice.__init__c                 C   s   | j S r   )r   r?   r   r   r   ro     s    zLibDevice.get)rN   rO   rP   r   r=   ro   r   r   r   r   r     s   r   z
define internal {T} @___numba_atomic_{T}_cas_hack({T}* %ptr, {T} %cmp, {T} %val) alwaysinline {{
    %out = cmpxchg volatile {T}* %ptr, {T} %cmp, {T} %val monotonic
    ret {T} %out
}}
z
    %cas_success = cmpxchg volatile {Ti}* %iptr, {Ti} %old, {Ti} %new monotonic monotonic
    %cas = extractvalue {{ {Ti}, i1 }} %cas_success, 0
zI
    %cas = cmpxchg volatile {Ti}* %iptr, {Ti} %old, {Ti} %new monotonic
a  
define internal {T} @___numba_atomic_{T}_{FUNC}({T}* %ptr, {T} %val) alwaysinline {{
entry:
    %iptr = bitcast {T}* %ptr to {Ti}*
    %old2 = load volatile {Ti}, {Ti}* %iptr
    br label %attempt

attempt:
    %old = phi {Ti} [ %old2, %entry ], [ %cas, %attempt ]
    %dold = bitcast {Ti} %old to {T}
    %dnew = {OP} {T} %dold, %val
    %new = bitcast {T} %dnew to {Ti}
    {CAS}
    %repeat = icmp ne {Ti} %cas, %old
    br i1 %repeat, label %attempt, label %done

done:
    %result = bitcast {Ti} %old to {T}
    ret {T} %result
}}
a  
define internal {T} @___numba_atomic_{Tu}_inc({T}* %iptr, {T} %val) alwaysinline {{
entry:
    %old2 = load volatile {T}, {T}* %iptr
    br label %attempt

attempt:
    %old = phi {T} [ %old2, %entry ], [ %cas, %attempt ]
    %bndchk = icmp ult {T} %old, %val
    %inc = add {T} %old, 1
    %new = select i1 %bndchk, {T} %inc, {T} 0
    {CAS}
    %repeat = icmp ne {T} %cas, %old
    br i1 %repeat, label %attempt, label %done

done:
    ret {T} %old
}}
a  
define internal {T} @___numba_atomic_{Tu}_dec({T}* %iptr, {T} %val) alwaysinline {{
entry:
    %old2 = load volatile {T}, {T}* %iptr
    br label %attempt

attempt:
    %old = phi {T} [ %old2, %entry ], [ %cas, %attempt ]
    %dec = add {T} %old, -1
    %bndchk = icmp ult {T} %dec, %val
    %new = select i1 %bndchk, {T} %dec, {T} %val
    {CAS}
    %repeat = icmp ne {T} %cas, %old
    br i1 %repeat, label %attempt, label %done

done:
    ret {T} %old
}}
a  
define internal {T} @___numba_atomic_{T}_{NAN}{FUNC}({T}* %ptr, {T} %val) alwaysinline {{
entry:
    %ptrval = load volatile {T}, {T}* %ptr
    ; Return early when:
    ; - For nanmin / nanmax when val is a NaN
    ; - For min / max when val or ptr is a NaN
    %early_return = fcmp uno {T} %val, %{PTR_OR_VAL}val
    br i1 %early_return, label %done, label %lt_check

lt_check:
    %dold = phi {T} [ %ptrval, %entry ], [ %dcas, %attempt ]
    ; Continue attempts if dold less or greater than val (depending on whether min or max)
    ; or if dold is NaN (for nanmin / nanmax)
    %cmp = fcmp {OP} {T} %dold, %val
    br i1 %cmp, label %attempt, label %done

attempt:
    ; Attempt to swap in the value
    %old = bitcast {T} %dold to {Ti}
    %iptr = bitcast {T}* %ptr to {Ti}*
    %new = bitcast {T} %val to {Ti}
    {CAS}
    %dcas = bitcast {Ti} %cas to {T}
    br label %lt_check

done:
    ret {T} %ptrval
}}
c                 C   s$   t  jrtj| dS tj| dS d S )NTi)r   r@   
cas_nvvm70rw   
cas_nvvm34r   r   r   r   ir_cas/  s    r   c                 C   s"   t | |||t|d}tjf |S )N)Tr   OPFUNCCAS)dictr   ir_numba_atomic_binary_templaterw   )r   r   r   r   paramsr   r   r   ir_numba_atomic_binary6  s    r   c              	   C   s&   t | |||||t|d}tjf |S )N)r   r   NANr   
PTR_OR_VALr   r   )r   r   ir_numba_atomic_minmax_templaterw   )r   r   r   r   r   r   r   r   r   r   ir_numba_atomic_minmax;  s
     r   c                 C   s   t j| |t| dS N)r   Tur   )ir_numba_atomic_inc_templaterw   r   r   r   r   r   r   ir_numba_atomic_incB  s    r   c                 C   s   t j| |t| dS r   )ir_numba_atomic_dec_templaterw   r   r   r   r   r   ir_numba_atomic_decF  s    r   c                 C   sD   |   }t|D ](\}}|drd}|t||<  q:qd|S )z@
    Find the line containing the datalayout and replace it
    ztarget datalayoutztarget datalayout = "{0}"
)
splitlinesr   
startswithrw   data_layoutrs   )llvmirlinesr   lntmpr   r   r   _replace_datalayoutJ  s    
r   c                 C   s  dt dddddfdt dd	d
ddfdt ddd
ddfdtdddfdtdddfdtdd	dddddfdtdddddddfdtdd	dddddfdtdddddddfdtdd	dddddfdtdddddddfd tdd	dd!dddfd"tdddd!dddfd#g}t js>|d$tjd	d%fd&tjdd%fg7 }t| } |D ]\}}| 	||} qB| 	d'd(} t jrzt
| } nt| } | S ))NzIdeclare double @"___numba_atomic_double_add"(double* %".1", double %".2")doubleZi64Zfaddadd)r   r   r   r   zEdeclare float @"___numba_atomic_float_sub"(float* %".1", float %".2")floati32ZfsubsubzIdeclare double @"___numba_atomic_double_sub"(double* %".1", double %".2")z=declare i64 @"___numba_atomic_u64_inc"(i64* %".1", i64 %".2")Zu64r   z=declare i64 @"___numba_atomic_u64_dec"(i64* %".1", i64 %".2")zEdeclare float @"___numba_atomic_float_max"(float* %".1", float %".2")r   znnan oltptrmax)r   r   r   r   r   r   zIdeclare double @"___numba_atomic_double_max"(double* %".1", double %".2")zEdeclare float @"___numba_atomic_float_min"(float* %".1", float %".2")znnan ogtminzIdeclare double @"___numba_atomic_double_min"(double* %".1", double %".2")zHdeclare float @"___numba_atomic_float_nanmax"(float* %".1", float %".2")nanZultzLdeclare double @"___numba_atomic_double_nanmax"(double* %".1", double %".2")zHdeclare float @"___numba_atomic_float_nanmin"(float* %".1", float %".2")ZugtzLdeclare double @"___numba_atomic_double_nanmin"(double* %".1", double %".2"))Zimmargr   zMdeclare i32 @"___numba_atomic_i32_cas_hack"(i32* %".1", i32 %".2", i32 %".3"))r   zMdeclare i64 @"___numba_atomic_i64_cas_hack"(i64* %".1", i64 %".2", i64 %".3")zllvm.numba_nvvm.atomiczllvm.nvvm.atomic)r   r   r   r   r   r@   ir_numba_cas_hackrw   r   rr   llvm100_to_70_irllvm100_to_34_ir)r   replacementsdeclfnr   r   r   llvm_replaceW  s    


 
 
 
 
 
 
 
 &




r   c                 K   sx   t | tr| g} |ddr0|ddddd t }t }| D ]}t|}||d q@|	|
  |jf |S )NZfastmathFT)ra   rd   rc   rb   rh   )
isinstancestrrm   updaterU   r   r   r\   ri   r]   ro   r   )r   r|   ZcuZ	libdevicemodr   r   r   llvm_to_ptx  s     
r   z	\!\d+\s*=zmetadata\s*\![{'\"0-9]z\!\d+z,\!{i32 \d, \!\"Debug Info Version\", i32 \d} z\s+z"^attributes #\d+ = \{ ([\w\s]+)\ }ZalwaysinlineZcoldZ
inlinehintZminsizeZnoduplicateZnoinlineZnoreturnZnounwindZoptnoneZoptiszeZreadnonereadonlyz"\bgetelementptr\s(?:inbounds )?\(?z=\s*\bload\s(?:\bvolatile\s)?z(call\s[^@]+\))(\s@)z\s*!range\s+!\d+z
[,{}()[\]]z\bnonnull\bz"\b(local_unnamed_addr|writeonly)\bz\((.*)\)zspFlags: (.*),ZisDefinitionZisOptimized)ZDISPFlagDefinitionZDISPFlagOptimizedc                 C   sn   g }|   D ]V}|drXt|}|d }ddd |D }||d|}|| qd|S )z,
    Convert LLVM 10.0 IR for LLVM 7.0.
    attributes #r
   r   c                 s   s   | ]}|d kr|V  qdS )Z
willreturnNr   rj   ar   r   r   	<genexpr>  s      z#llvm100_to_70_ir.<locals>.<genexpr>r   )	r   r   re_attributes_defmatchgroupsplitrs   rr   rn   )r	   buflinemattrsr   r   r   r     s    

r   c                 C   sN  dd }g }|   D ],}|dr0|dd}| drRd|krR|dd}t|rdt|kr|d	d
}|dd}|d}|d|d  ||d d  }}dd }d	|t
||f}|drqt|dk	rtdd |}|dr@t|}|d }	d	dd |	D }	||d|	}d|krt|}|dkrltd|f | }
|d|
 |||
d  }d|krt|}|r| }
|d|
 |||
d  }d|krtd|}td|d}d|krtt|}d |kr,d|kr,tt|}td|}|| qd!	|S )"z,
    Convert LLVM 10.0 IR for LLVM 3.4.
    c                 S   s   d}d}t | |}|d kr,td| f qv| }|d}|dkrR|dkrtqvq|dkrd|d7 }q|dkr|d8 }q| |d   S )Nr   zfailed parsing leading type: %s,z{[(r
   z)]})re_type_toksearchr   endr   lstrip)sZ	par_levelposr   tokr   r   r   parse_out_leading_type  s     


z0llvm100_to_34_ir.<locals>.parse_out_leading_typez!numba.llvm.dbg.cuz!llvm.dbg.cuz%tail call void asm sideeffect "// dbgz
!numba.dbgz!dbgNz!{zmetadata !{z!"zmetadata !"=r
   c                 S   s   d|  d S )Nz	metadata r   )r   r   r   r   r   fix_metadata_ref  s    z*llvm100_to_34_ir.<locals>.fix_metadata_refr   zsource_filename =c                 S   s   dS )Nr   r   r   r   r   r   <lambda>       z"llvm100_to_34_ir.<locals>.<lambda>r   c                 s   s   | ]}|t kr|V  qd S r   )supported_attributesr   r   r   r   r   &  s      z#llvm100_to_34_ir.<locals>.<genexpr>zgetelementptr z failed parsing getelementptr: %szload zcall z\1*\2r   r   z@llvm.memsetZdeclarer   )r   r   rr   r   re_metadata_defr   re_metadata_correct_usager   findrs   re_metadata_refr   re_unsupported_keywordsr   r   r   re_getelementptrr   r   re_loadre_callre_rangerstripre_parenthesized_list_replace_llvm_memset_usage _replace_llvm_memset_declarationre_annotationsrn   )r	   r   r   r   Zassigposlhsrhsr   r   r   r   r   r   r   r     sp    


"











r   c                 C   sb   t | dd}td|d }|s2tdn
|d}|dd| d|}d	|S )
zNReplace `llvm.memset` usage for llvm7+.

    Used as functor for `re.sub.
    r
   r   zalign (\d+)r   z+No alignment attribute found on memset destr   zi32 {}rg   ({}))	listr   r   rer   
ValueErrorinsertrw   rs   )r   r   Z
align_attrZalignoutr   r   r   r  S  s    


r  c                 C   s4   t | dd}|dd d|}d|S )zTReplace `llvm.memset` declaration for llvm7+.

    Used as functor for `re.sub.
    r
   r   r   r   rg   r	  )r
  r   r   r  rs   rw   )r   r   r  r   r   r   r  c  s    
r  c                 C   sN   | j }t|d}ttdd}|| ||f}t|d}|| d S )Nkernel    r
   znvvm.annotations)	moduler	   ZMetaDataStringConstantIntTypeadd_metadatar   Zget_or_insert_named_metadatar   )Zlfuncr   ZmdstrZmdvalueZmdZnmdr   r   r   set_cuda_kerneln  s    r  c                 C   sf   t d}t jr0|d|d|d|dg}n|d|d|d|dg}| |}| d| dS )	zAdd NVVM IR version to moduler  r
   r>   r   r   r7   znvvmir.versionN)r	   r  r   r@   r  Zadd_named_metadata)r   r   r<   Zmd_verr   r   r   add_ir_versiony  s    

r  c                 C   s
   t | _ d S r   )r   )r  r   r   r   fix_data_layout  s    r  )arQ   loggingr  rI   r   ctypesr   r   r   r   r   r   r   	threadingZllvmliter	   rK   r   r   Zlibsr   r   r   Z
numba.corer   r   	getLoggerrN   loggerZADDRSPACE_GENERICZADDRSPACE_GLOBALZADDRSPACE_SHAREDZADDRSPACE_CONSTANTZADDRSPACE_LOCALrS   rR   r   rG   r   r   r}   r/   modulesr   Lockr$   r&   r   rU   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zdebuginfo_patternrr   Zre_metadata_debuginfor   r   r   r   r   r  r   r  r   r  Z
re_spflagsZ	spflagmapr   r   r  r  r  r  r  r   r   r   r   <module>   s   $
u 2"
 E



      








k