o
    1&iM                     @   s  d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ	 d dl
mZ d dlmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ e eZdgZee	jdZee	j d Z!ee	j dZ"ee	j dZ#dd Z$G dd de%Z&G dd de%Z'G dd de'Z(dS )    N)ir)Linkage)
llvm_types)create_constant_array)compile_extraFlags)global_compiler_lock)
cpu_target)	nrtdynmod)cgutils)lookup_environmentZCompiler      c                  C   s$   dd l } dd l}|dt| d S )Nr   a      #include <stdint.h>

    #ifndef HAVE_LONGDOUBLE
        #define HAVE_LONGDOUBLE %d
    #endif

    typedef struct {
        float real;
        float imag;
    } complex64;

    typedef struct {
        double real;
        double imag;
    } complex128;

    #if HAVE_LONGDOUBLE
    typedef struct {
        long double real;
        long double imag;
    } complex256;
    #endif

    typedef float float32;
    typedef double float64;
    #if HAVE_LONGDOUBLE
    typedef long double float128;
    #endif
    Z
complex256)numpytextwrapdedenthasattr)r   r    r   >C:\wamp64\www\opt\env\Lib\site-packages\numba/pycc/compiler.py
get_header   s
   r   c                   @   s    e Zd ZdZdd Zdd ZdS )ExportEntryz0
    A simple record for exporting symbols.
    c                 C   s   || _ || _|| _d S N)symbol	signaturefunction)selfr   r   r   r   r   r   __init__H   s   
zExportEntry.__init__c                 C   s   d| j | jf S )NzExportEntry(%r, %r))r   r   r   r   r   r   __repr__M   s   zExportEntry.__repr__N)__name__
__module____qualname____doc__r   r   r   r   r   r   r   C   s    r   c                   @   s   e Zd ZdZeejejej	ejfZ
ee
Zeejej	ejejej	fZeeZdddZdd Zdd Zed	d
 ZdddZdddZdd Zdd Zdd Zdd Zdd Zdd ZdS )_ModuleCompilerzA base class to compile Python modules to a single shared library or
    extension module.

    :param export_entries: a list of ExportEntry instances.
    :param module_name: the name of the exported module.
    Fc                 K   sH   || _ d| _g | _|| _d | _|| _tj| _tjj	| j fi || _
d S )NF)module_nameexport_python_wrapdll_exportsexport_entriesexternal_init_functionuse_nrtr	   typing_contexttarget_contextZwith_aot_codegencontext)r   r'   r$   r)   Zaot_optionsr   r   r   r   q   s   z_ModuleCompiler.__init__c                 C   s
   d|f S )Nz._pycc_method_%sr   )r   	func_namer   r   r   _mangle_method_symbol   s   
z%_ModuleCompiler._mangle_method_symbolc                 C   s   t )zAEmit generated Python wrapper and extension module code.
        )NotImplementedError)r   llvm_moduler   r   r   _emit_python_wrapper   s   z$_ModuleCompiler._emit_python_wrapperc                 C   s"  i | _ i | _i | _i | _| j }|| j}t }d|_	| j
s&d|_d|_| jr9d|_t| j\}}|| | jD ]}t| j| j|j|jj|jj|i |d}|j}|jD ]}	|	jdrbd|	_qW|jj}
|j !|
}| j
rd|_|jj"}|j !|}| #|j$|_d|_|j%j&'|jj(|jj)}|| j |< |j*| j|< |jj+| j|< |j,D ]$}|j}|j-D ]}	|	j}|drt.|}|dur|/ r|| j|< qqq<|j$|_| j01|j$ q<| j
r|2d	}| 3| || |4  |5 D ]}|j| j0vr|jt6j7t6j8hv rd
|_9qd|_9q|S )zRead all the exported functions/modules in the translator
        environment, and join them into a single LLVM module.
        T)localslibraryZ__excinfo_unwrap_argsZlinkonce_odrinternalexternalZ_ZN08NumbaEnvNwrapperdefaultZhidden):exported_function_typesfunction_environmentsenvironment_gvsextra_environmentsr,   codegenZcreate_libraryr$   r   Z
no_compiler%   Zno_cpython_wrapperZno_cfunc_wrapperr)   Znrtr
   Zcreate_nrt_moduleZadd_ir_moduler'   r   r*   r   r   argsreturn_typeZ_final_moduleZ	functionsname
startswithlinkageZfndescllvm_func_namer3   Zget_functionZllvm_cpython_wrapper_namer.   r   r+   Z	call_convZget_function_typerestypeargtypesenvironmentenv_nameZ_linking_librariesZglobal_variablesr   Z	can_cacher&   appendZcreate_ir_moduler1   finalizeZget_defined_functionsr   privater4   Z
visibility)r   r<   r3   flagsZ
nrt_module_entryZcresmodulegvr-   Z	llvm_funcZwrappernamer6   fntyZ	linkedlibZ	linkedmodZgvnenvZwrapper_modulefnr   r   r   _cull_exports   s   












z_ModuleCompiler._cull_exportsc                 K   L   || _ |  }t|d}||  W d    d S 1 sw   Y  d S Nwb)r%   rR   openwriteZemit_bitcoder   outputwrapkwsr3   foutr   r   r   write_llvm_bitcode   
   "z"_ModuleCompiler.write_llvm_bitcodec                 K   rS   rT   )r%   rR   rV   rW   Zemit_native_objectrX   r   r   r   write_native_object   r^   z#_ModuleCompiler.write_native_objectc                 C   s&   t |}d|v r|dr|d7 }|S )Nint)8Z163264Z_t)strendswith)r   ZtyobjZret_valr   r   r   	emit_type   s
   
z_ModuleCompiler.emit_typec           	         s   t j|\}}t|d d<}|t  |d  jD ]$}|j} |j	j
}d fdd|j	jD }|d|||f  qW d    d S 1 sNw   Y  d S )Nz.hwz
/* Prototypes */
z, c                 3   s    | ]}  |V  qd S r   )rf   ).0Zargtyper   r   r   	<genexpr>   s    z._ModuleCompiler.emit_header.<locals>.<genexpr>zextern %s %s(%s);
)ospathsplitextrV   rW   r   r'   r   rf   r   r>   joinr=   )	r   rY   fnameextr\   Zexport_entryr?   rC   r=   r   r   r   emit_header   s   

"z_ModuleCompiler.emit_headerc                 C   s   g }| j D ]2}|j}| |}| j| }t|||}| j||}tj	|tj
|tjttf}	||	 qtj	ttttg}
||
 t| j|}t||jd}||_d|_tj|ttg}|S )z
        Collect exported methods and emit a PyMethodDef array.

        :returns: a pointer to the PyMethodDef array.
        z.module_methodsr4   )r'   r   r.   r8   r   Functionr,   insert_const_stringConstantliteral_structbitcastlt
_void_starMETH_VARARGS_AND_KEYWORDSNULLrG   ZEROr   method_def_tyr   add_global_variabletypeinitializerrA   gep)r   r0   Zmethod_defsrL   r?   rB   rO   Zlfuncmethod_nameZmethod_def_constsentinelZmethod_array_initmethod_arrayZmethod_array_ptrr   r   r   _emit_method_array   s4   



z"_ModuleCompiler._emit_method_arrayc           
         sx   g }| j D ]}| j| } |j}|| q| fdd| j D  t| j	|}| j
|d|}	|	ttgS )z
        Emit an array of env_def_t structures (see modulemixin.c)
        storing the pickled environment constants for each of the
        exported functions.
        c                    s   g | ]}  |jqS r   )serialize_uncachedconsts)rh   rP   pyapir   r   
<listcomp>'  s    
z;_ModuleCompiler._emit_environment_array.<locals>.<listcomp>z.module_environments)r'   r9   r   r   rG   extendr;   valuesr   
env_def_tyr,   insert_unique_constr   rz   )
r   r0   builderr   Zenv_defsrL   rP   Zenv_defZenv_defs_initrN   r   r   r   _emit_environment_array  s   

z'_ModuleCompiler._emit_environment_arrayc           
         s   g }j D ]}j| }j |}|tj}|| q| fddj	D  |td t
tj|}	j d|	}|ttgS )zj
        Emit an array of Environment pointers that needs to be filled at
        initialization.
        c                    s"   g | ]}j  |tjqS r   )r,   declare_env_globalru   rv   rw   )rh   
envgv_namer0   r   r   r   r   =  s    z6_ModuleCompiler._emit_envgvs_array.<locals>.<listcomp>Nz.module_envgvs)r'   r:   r,   r   ru   rv   rw   rG   r   r;   r   r   r   rz   )
r   r0   r   r   Zenv_settersrL   r   rN   ZenvgvZenv_setters_initr   r   r   _emit_envgvs_array1  s    

z"_ModuleCompiler._emit_envgvs_arrayc           	      C   sL   | j r$ttj|j| j| j|jg}t||| j }|	|||||gS dS )z@
        Emit call to "external" init function, if any.
        N)
r(   r   FunctionTyperv   _int32r}   method_def_ptrenv_def_ptrrq   call)	r   r0   r   Zmodobjr   	env_arrayenvgv_arrayrO   rQ   r   r   r   _emit_module_init_codeM  s   z&_ModuleCompiler._emit_module_init_codeN)F)r   r    r!   r"   r   LiteralStructTyperv   
_int8_starrw   r   r{   PointerTyper   r   r   r   r.   r1   r   rR   r]   r_   rf   rp   r   r   r   r   r   r   r   r   r#   Q   s8    




S
 r#   c                   @   s   e Zd Zdd ZeejejZeejejZeejejeej	Z
eejej	ZeejZejZeejeejejfZeeeeejejee
eef	Zedd Zedd Zdd Zd	S )
ModuleCompilerc                 G   s   t t | |S r   )r   r   r   )retr=   r   r   r   <lambda>_  s    zModuleCompiler.<lambda>c                 C   s6   t tjt | jtjf}d}tjr|d7 }||fS )zn
        Return the signature and name of the Python C API function to
        initialize the module.
        ZPyModule_Create2Z	TraceRefs)r   r   rv   _pyobject_head_pr   module_def_tyr   Z_trace_refs_)r   r   r?   r   r   r   module_create_definition  s   
z'ModuleCompiler.module_create_definitionc                 C   s   t tjd}|d| j fS )zX
        Return the name and signature of the module's initialization function.
        r   ZPyInit_)r   r   rv   r   r$   )r   r   r   r   r   module_init_definition  s   z%ModuleCompiler.module_init_definitionc                 C   s0  t j|g| jR  }d|_| j|| j}t jt	j
t | jd t t	jd t t	jd f}t||jd}||_d|_| |}t j||t | jd t t	jd|t | jd t | jd t | jd t | jd f	}t||jd}||_d|_t j|g| jR  }	|	d}
t |
}| j|}|||t t	jtjf}|t || |!t"#|	jj$j% W d    n1 sw   Y  | &|||}| '|||}| (||||||}|d ur
|t)|| |!t |jd  W d    n	1 sw   Y  |!| | j*+|	j, d S )Nr5   z.module_def_baser4   z.module_defZEntry)-r   rq   r   rA   r,   rr   r$   rs   rt   rv   Z_pyobject_head_init	m_init_ty_llvm_py_ssize_tr   r   r|   r}   r~   r   
_char_star
inquiry_tytraverseproc_tyfreefunc_tyr   Zappend_basic_blockZ	IRBuilderZget_python_apir   r   sysapi_versionZif_thenZis_nullr   ry   ru   Zpointeer>   r   r   r   Zis_not_nullr&   rG   r?   )r   r0   Zcreate_module_fnZmod_name_constZmod_def_base_initZmod_def_baser   Zmod_def_initZmod_defZmod_init_fnrL   r   r   modr   r   r   r   r   r   r1     sv   






z#ModuleCompiler._emit_python_wrapperN)r   r    r!   Z_ptr_funrv   Z_int8r   Zvisitproc_tyr   rw   r   r   r   r   r   r   r   Z_pyobject_headr   Zmodule_def_base_tyr#   r   r   propertyr   r   r1   r   r   r   r   r   ]  sT    


r   ))loggingrj   r   Zllvmliter   Zllvmlite.bindingr   Z
numba.pyccr   rv   Znumba.core.cgutilsr   Znumba.core.compilerr   r   Znumba.core.compiler_lockr   Znumba.core.registryr	   Znumba.core.runtimer
   Z
numba.corer   Znumba.core.environmentr   	getLoggerr   logger__all__rs   rw   ry   r   rz   ZONErx   r   objectr   r#   r   r   r   r   r   <module>   s2   
$  