B
    Ꮚ\)                 @   s*  d dl mZmZ d dlmZmZmZmZmZm	Z	m
Z
mZmZmZmZmZ d dlZddlmZmZmZ ejj dd Zdd	 ZG d
d dejZG dd dejZejejeegejj_ej ejj_!ej ejeegejj"_eejj"_!ej ejgejj#_ej ej$egejj%_ej gejj&_ej gejj'_ej(ejj'_!g ejj)_eejj)_!ej egejj*_e	ejj*_!ej egejj+_e	ejj+_!ej ej,gejj-_G dd deZ.edeee.Z/edeee.Z0e/ej1Z2e0ej3Z4e/e0egejj5_ej6ejj5_!ej6gejj7_ej ej6gejj8_eejj9_!ee
gejj9_dS )    )print_functionabsolute_import)POINTERc_char_pc_boolc_void_pc_intc_uint64c_size_t	CFUNCTYPE	string_atcast	py_object	StructureN   )ffitargetsobject_filec          	   C   sF   t  &}t j| ||}|s*tt|W dQ R X d|_t|| dS )zZ
    Create a MCJIT ExecutionEngine from the given *module* and
    *target_machine*.
    NT)module)r   OutputStringlibLLVMPY_CreateMCJITCompilerRuntimeErrorstr_ownedExecutionEngine)r   Ztarget_machineouterrZengine r   ?lib/python3.7/site-packages/llvmlite/binding/executionengine.pycreate_mcjit_compiler   s    

r   c              C   s    t j } | dkrt| ddS )zp
    Check the system allows execution of in-memory JITted functions.
    An exception is raised otherwise.
    r   zcannot allocate executable memory. This may be due to security restrictions on your system, such as SELinux or similar mechanisms.N)r   r   "LLVMPY_TryAllocateExecutableMemoryOSError)errnor   r   r   check_jit_execution   s    
r#   c               @   s   e Zd Zd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d Zdd Zedd Zdd Zdd Zdd Zd%ddZdd  Zd!d" Zd#d$ ZdS )&r   zAn ExecutionEngine owns all Modules associated with it.
    Deleting the engine will remove all associated modules.
    It is an error to delete the associated modules.
    Nc             C   s*   t |g| _d| _d|_tj| | dS )z;
        Module ownership is transferred to the EE
        NT)set_modules_tdr   r   	ObjectRef__init__)selfptrr   r   r   r   r(   3   s    zExecutionEngine.__init__c             C   s   t j| |dS )z
        Return the address of the function named *name* as an integer.

        It's a fatal error in LLVM if the symbol of *name* doesn't exist.
        ascii)r   r   LLVMPY_GetFunctionAddressencode)r)   namer   r   r   get_function_address<   s    z$ExecutionEngine.get_function_addressc             C   s   t j| |dS )z
        Return the address of the global value named *name* as an integer.

        It's a fatal error in LLVM if the symbol of *name* doesn't exist.
        r+   )r   r   LLVMPY_GetGlobalValueAddressr-   )r)   r.   r   r   r   get_global_value_addressD   s    z(ExecutionEngine.get_global_value_addressc             C   s   t j| || d S )N)r   r   LLVMPY_AddGlobalMapping)r)   ZgvZaddrr   r   r   add_global_mappingL   s    z"ExecutionEngine.add_global_mappingc             C   s6   || j krtdtj| | d|_| j | dS )zL
        Ownership of module is transferred to the execution engine
        z#module already added to this engineTN)r%   KeyErrorr   r   LLVMPY_AddModuler   add)r)   r   r   r   r   
add_moduleP   s
    
zExecutionEngine.add_modulec             C   s   t j|  dS )z}
        Make sure all modules owned by the execution engine are fully processed
        and "usable" for execution.
        N)r   r   LLVMPY_FinalizeObject)r)   r   r   r   finalize_objectZ   s    zExecutionEngine.finalize_objectc             C   s   t j|  dS )zERun static constructors which initialize module-level static objects.N)r   r   ZLLVMPY_RunStaticConstructors)r)   r   r   r   run_static_constructorsa   s    z'ExecutionEngine.run_static_constructorsc             C   s   t j|  dS )zNRun static destructors which perform module-level cleanup of static resources.N)r   r   ZLLVMPY_RunStaticDestructors)r)   r   r   r   run_static_destructorse   s    z&ExecutionEngine.run_static_destructorsc          	   C   sF   t  "}t j| ||r&tt|W dQ R X | j| d|_dS )z1
        Ownership of module is returned
        NF)	r   r   r   LLVMPY_RemoveModuler   r   r%   remover   )r)   r   r   r   r   r   remove_modulei   s
    
zExecutionEngine.remove_modulec             C   s6   | j dk	r| j S tj| }t|| _ d| j _| j S )z;
        The TargetData for this execution engine.
        NT)r&   r   r   #LLVMPY_GetExecutionEngineTargetDatar   Z
TargetDatar   )r)   r*   r   r   r   target_datas   s    
zExecutionEngine.target_datac             C   s   t j| }|S )z
        Enable JIT events for profiling of generated code.
        Return value indicates whether connection to profiling tool
        was successful.
        )r   r   ZLLVMPY_EnableJITEvents)r)   Zretr   r   r   enable_jit_events   s    z!ExecutionEngine.enable_jit_eventsc             C   s6   t |tj}x$| jD ]}t |jtj|kr|S qW dS )zH
        Find the ModuleRef corresponding to the given pointer.
        N)r   r   valuer%   Z_ptr)r)   
module_ptrr*   r   r   r   r   _find_module_ptr   s
    z ExecutionEngine._find_module_ptrc             C   s(   t |trtj|}tj| | dS )z
        Add object file to the jit. object_file can be instance of
        :class:ObjectFile or a string representing file system path
        N)
isinstancer   r   ZObjectFileRefZ	from_pathr   r   LLVMPY_MCJITAddObjectFile)r)   Zobj_filer   r   r   add_object_file   s    
zExecutionEngine.add_object_filec             C   s*   || _ || _t| | _tj| | j dS )z~
        Set the object cache "notifyObjectCompiled" and "getBuffer"
        callbacks to the given Python functions.
        N)_object_cache_notify_object_cache_getbuffer_ObjectCacheRef_object_cacher   r   LLVMPY_SetObjectCache)r)   Znotify_funcZgetbuffer_funcr   r   r   set_object_cache   s    
z ExecutionEngine.set_object_cachec             C   s`   | j dkrdS |jj}|jj}|jj}t||}| |}|dkrPtd|f |  || dS )z(
        Low-level notify hook.
        Nz5object compilation notification for unknown module %s)rH   contentsrC   buf_ptrbuf_lenr   rD   r   )r)   datarC   rO   rP   bufr   r   r   r   _raw_object_cache_notify   s    



z(ExecutionEngine._raw_object_cache_notifyc             C   sr   | j dkrdS |jj}| |}|dkr6td|f |  |}|dk	rntj|t||d _	t||d _
dS )z+
        Low-level getbuffer hook.
        Nz5object compilation notification for unknown module %sr   )rI   rN   rC   rD   r   r   r   LLVMPY_CreateByteStringlenrO   rP   )r)   rQ   rC   r   rR   r   r   r   _raw_object_cache_getbuffer   s    



z+ExecutionEngine._raw_object_cache_getbufferc             C   sL   x| j D ]}|  qW | jd k	r,| j  | j   d | _| j|  d S )N)r%   detachr&   clearrK   _capiZLLVMPY_DisposeExecutionEngine)r)   modr   r   r   _dispose   s    


zExecutionEngine._dispose)NN)__name__
__module____qualname____doc__rK   r(   r/   r1   r3   r7   r9   r:   r;   r>   propertyr@   rA   rD   rG   rM   rS   rV   r[   r   r   r   r   r   ,   s&   	

	

r   c               @   s    e Zd ZdZdd Zdd ZdS )rJ   zN
    Internal: an ObjectCache instance for use within an ExecutionEngine.
    c             C   s"   t jtt|}t j| | d S )N)r   r   LLVMPY_CreateObjectCache_notify_c_hook_getbuffer_c_hookr'   r(   )r)   objr*   r   r   r   r(      s    z_ObjectCacheRef.__init__c             C   s   | j |  d S )N)rY   LLVMPY_DisposeObjectCache)r)   r   r   r   r[      s    z_ObjectCacheRef._disposeN)r\   r]   r^   r_   r(   r[   r   r   r   r   rJ      s   rJ   c               @   s$   e Zd ZdejfdefdefgZdS )_ObjectCacheDatarC   rO   rP   N)r\   r]   r^   r   LLVMModuleRefr   r
   Z_fields_r   r   r   r   rf      s   rf   ):Z
__future__r   r   Zctypesr   r   r   r   r   r	   r
   r   r   r   r   r   warnings r   r   r   r   ZLLVMPY_LinkInMCJITr   r#   r'   r   rJ   rg   ZLLVMTargetMachineRefr   ZargtypesZLLVMExecutionEngineRefZrestyper<   r5   ZLLVMValueRefr2   r8   r?   ZLLVMTargetDataRefr    r,   r0   ZLLVMObjectFileRefrF   rf   Z_ObjectCacheNotifyFuncZ_ObjectCacheGetBufferFuncrS   rb   rV   rc   ra   ZLLVMObjectCacheRefre   rL   rT   r   r   r   r   <module>   sf   8 0









