B
     \s&                 @   sJ  d dl mZmZ d dlZd dlZd dlmZ d dlm	  m
Z d dlmZm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 d d	lmZmZmZmZmZmZ dd
l m!Z! d dl"m#Z# d dl$m%Z% ddl&m'Z' G dd dej(Z)G dd dej(Z*G dd deZ+G dd de,Z-G dd de!Z.dd Z/dd Z0dd Z1dS )    )print_functionabsolute_importN)_dynfuncconfig)PyCallWrapper   )BaseContextPYOBJECT)utilscgutilstypes)cached_property)callconvcodegen	externals
intrinsicslistobjsetobj)TargetOptions)rtsys)global_compiler_lock)fastmathpassc               @   s   e Zd ZdejfgZdS )ClosureBodyenvN)__name__
__module____qualname__r   pyobject_fields r   r   0lib/python3.7/site-packages/numba/targets/cpu.pyr      s   r   c               @   s    e Zd ZdejfdejfgZdS )EnvBodyglobalsZconstsN)r   r   r   r   r   r   r   r   r   r    r!      s   r!   c               @   s   e Zd ZdZdZdd Zedd Zdd Ze	d	d
 Z
dd Zdd Zedd Zdd Zdd Zdd Zdd Zdd Zdd Zd%ddZd d! Zd"d# Zd$S )&
CPUContextz0
    Changes BaseContext calling convention
    Tc             C   s   | j |S )N)_internal_codegenZ_create_empty_module)selfnamer   r   r    create_module)   s    zCPUContext.create_modulec             C   sV   t jdk| _td| _t dkr.t	d t
j|  t|  t jrRdd l}d S )N    z
numba.execZarmv7lzlibgcc_s.so.1r   )r
   ZMACHINE_BITSis32bitr   ZJITCPUCodegenr$   platformmachinellZload_library_permanentlyr   Zc_math_functionsZinstallr   Z
initializeZPY3Znumba.unicode)r%   numbar   r   r    init,   s    

zCPUContext.initc             C   sx   ddl m}m}m}m}m}m} | |j | |j | |j | |j | |j | |j | |j d S )Nr   )cffiimpl	cmathimplmathimplnpyimpl	printimpl
randomimpl)	 r/   r0   r1   r2   r3   r4   Zinstall_registryregistry)r%   r/   r0   r1   r2   r3   r4   r   r   r    load_additional_registries?   s     z%CPUContext.load_additional_registriesc             C   s   | j jS )N)r$   target_data)r%   r   r   r    r8   K   s    zCPUContext.target_datac             K   s   t j|f|}| j|ddS )NT)r$   Zaot_mode)r   ZAOTCPUCodegenZ	subtarget)r%   r&   Zaot_optionsZaot_codegenr   r   r    with_aot_codegenO   s    zCPUContext.with_aot_codegenc             C   s   | j S )N)r$   )r%   r   r   r    r   T   s    zCPUContext.codegenc             C   s
   t | S )N)r   ZCPUCallConv)r%   r   r   r    	call_convW   s    zCPUContext.call_convc             C   s$   t ||tjd }t| ||ddS )z
        From the given *envptr* (a pointer to a _dynfunc.Environment object),
        get a EnvBody allowing structured access to environment fields.
        Zoffsetof_env_bodyT)refZcast_ref)r   pointer_addr   
_impl_infor!   )r%   builderZenvptrZbody_ptrr   r   r    get_env_body[   s    zCPUContext.get_env_bodyc             C   sP   |  |j| | j}||}| |}|| | ||}|| j	||S )N)
Zdeclare_env_globalmoduleget_env_namefndescloadZget_python_apiZemit_environment_sentryr?   get_env_managerZenvironment)r%   r>   ZenvgvZenvargZpyapiZenv_bodyr   r   r    rD   d   s    


zCPUContext.get_env_managerc             C   s   t j||tjd |dS )z~
        From the given *genptr* (a pointer to a _dynfunc.Generator object),
        get a pointer to its state area.
        Zoffsetof_generator_state)return_type)r   r<   r   r=   )r%   r>   ZgenptrrE   r   r   r    get_generator_statem   s    zCPUContext.get_generator_statec             C   s   t | |||S )zR
        Build a list from the Numba *list_type* and its initial *items*.
        )r   
build_list)r%   r>   Z	list_typeitemsr   r   r    rG   v   s    zCPUContext.build_listc             C   s   t | |||S )zP
        Build a set from the Numba *set_type* and its initial *items*.
        )r   	build_set)r%   r>   Zset_typerH   r   r   r    rI   |   s    zCPUContext.build_setc             C   s0   | j rt| | jr t| |tj d S )N)	Zenable_fastmathr   Zrewrite_moduler)   r   Z
fix_divmodZadd_linking_libraryr   library)r%   modrJ   r   r   r    post_lowering   s
    

zCPUContext.post_loweringFc       
   	   C   sV   |  d}| j|j|j}|||j}t| ||||||d}	|	  |	| d S )Nwrapper)call_helperrelease_gil)
r'   r:   Zget_function_typeZrestypeZargtypesZadd_functionllvm_func_namer   ZbuildZadd_ir_module)
r%   rJ   rB   r   rN   rO   Zwrapper_moduleZfntyZwrapper_calleer>   r   r   r    create_cpython_wrapper   s    
z!CPUContext.create_cpython_wrapperc             C   sb   | |j}| |j}d|jf }t| |jdd ||||f}|j	| 
|| |S )z
        Returns
        -------
        (cfunc, fnptr)

        - cfunc
            callable function (Can be None)
        - fnptr
            callable function address
        - env
            an execution environment (from _dynfunc)
        zcompiled wrapper for %r.)Zget_pointer_to_functionrP   Zllvm_cpython_wrapper_namequalnamer   Zmake_functionZlookup_modulesplitr   Zset_envrA   )r%   rJ   rB   r   ZbaseptrZfnptrdocZcfuncr   r   r    get_executable   s    
zCPUContext.get_executablec             C   s    t t j|d}| | |S )zI
        Calculate the size of an array struct on the CPU target
        A)r   ZArrayZint32Zget_abi_sizeofZget_value_type)r%   ndimZarytyr   r   r    calc_array_sizeof   s    zCPUContext.calc_array_sizeofN)F)r   r   r   __doc__Zallow_dynamic_globalsr'   r   r.   r7   propertyr8   r9   r   r   r:   r?   rD   rF   rG   rI   rL   rQ   rW   rZ   r   r   r   r    r#   "   s$   			

r#   c               @   s   e Zd ZdZdd ZdS )ParallelOptionsz7
    Options for controlling auto parallelization.
    c             C   s   t |tr<|| _|| _|| _|| _|| _|| _|| _|| _	nt |t
rd| _|dd| _|dd| _|dd| _|dd| _|dd| _|dd| _|dd| _	|rtd	|  ntd
d S )NTcomprehension	reductionsetitemnumpystencilfusionprangez!Unrecognized parallel options: %sz4Expect parallel option to be either a bool or a dict)
isinstanceboolZenabledr^   r_   r`   ra   rb   rc   rd   dictpop	NameErrorkeys
ValueError)r%   valuer   r   r    __init__   s*    

zParallelOptions.__init__N)r   r   r   r[   rm   r   r   r   r    r]      s   r]   c               @   s*   e Zd ZeeeeeeeeeeeedZdS )CPUTargetOptions)ZnopythonZnogilZforceobjZloopliftZ
boundcheckdebugZ_nrtZno_rewritesZno_cpython_wrapperZfastmathZerror_modelZparallelN)r   r   r   rf   strr]   ZOPTIONSr   r   r   r    rn      s   rn   c             C   s$   x| j D ]}t| t| qW dS )zD
    Remove redundant incref/decref within on a per block basis
    N)Zbasic_blocksremove_null_refct_callremove_refct_pairs)funcbbr   r   r    remove_refct_calls   s    ru   c             C   s   dS )z0
    Remove refct api calls to NULL pointer
    Nr   )rt   r   r   r    rq      s    rq   c             C   s   d}x|rd}i }i }xX| j D ]N}t|tjr|jj}|dkrR|jd }|||< q|dkr|jd }|||< qW x4| D ](}||krz||   ||   d}qzW qW dS )z9
    Remove incref decref pairs on the same variable
    TFZ	Py_IncRefr   Z	Py_DecRefN)	Zinstructionsre   lcZCallOrInvokeInstructionZcalled_functionr&   Zoperandsrj   Zerase_from_parent)rt   ZdidsomethingZincrefsZdecrefsZinstfnameargvalr   r   r    rr   
  s&    


rr   )2Z
__future__r   r   sysr*   Zllvmlite.bindingZbindingr,   Zllvmlite.llvmpy.coreZllvmpyZcorerv   r-   r   r   Znumba.callwrapperr   baser   r	   r
   r   r   Znumba.utilsr   Znumba.targetsr   r   r   r   r   r   Zoptionsr   Znumba.runtimer   Znumba.compiler_lockr   r5   r   Z	Structurer   r!   r#   objectr]   rn   ru   rq   rr   r   r   r   r    <module>   s.      	