U
    ºmœd+  ã                
   @   s4  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„ ZedƒZedƒZedƒZed	ƒZed
ƒZedƒZedƒZedƒZedƒZedƒZedƒZedƒZedƒZedƒZedƒZedƒZedƒZedƒZedƒZedƒZedƒZ edƒZ!edƒZ"edƒZ#G dd„ dƒZ$G d d!„ d!e%ƒZ&G d"d#„ d#e%ƒZ'd$d%„ Z(e j)dd&… d'k�rVe(nej*Z+e
ƒ Z,d( -e. /d(¡d d)… ¡Z0z e+e0e,ƒZ1e 2e3e1 4¡ ƒ¡Z5W n< e6k
�rÖ Z7 zd*e,› d+e7› �Z8e6e8ƒ‚W 5 dZ7[7X Y nX e&e5ƒZ5d,d-„ Z9d.d/„ Z:G d0d1„ d1e%ƒZ;G d2d3„ d3e%ƒZ<d4d5„ Z=d6d7„ Z>G d8d9„ d9e%ƒZ?dS ):é    N)Ú_decode_stringÚ_is_shutting_down)Úget_library_namec                 C   s   t | tjfi ƒ}t |¡S ©N)ÚtypeÚctypesZ	StructureZPOINTER)ÚnameZnewcls© r	   úM/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/llvmlite/binding/ffi.pyÚ_make_opaque_ref
   s    r   ZLLVMContextZ
LLVMModuleZ	LLVMValueZLLVMTypeZLLVMExecutionEngineZLLVMPassManagerBuilderZLLVMPassManagerZLLVMTargetDataZLLVMTargetLibraryInfoZ
LLVMTargetZLLVMTargetMachineZLLVMMemoryBufferÚLLVMAttributeListIteratorÚLLVMAttributeSetIteratorÚLLVMGlobalsIteratorÚLLVMFunctionsIteratorÚLLVMBlocksIteratorÚLLVMArgumentsIteratorÚLLVMInstructionsIteratorÚLLVMOperandsIteratorÚLLVMTypesIteratorZLLVMObjectCacheZLLVMObjectFileZLLVMSectionIteratorc                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )Ú	_LLVMLocka6  A Lock to guarantee thread-safety for the LLVM C-API.

    This class implements __enter__ and __exit__ for acquiring and releasing
    the lock as a context manager.

    Also, callbacks can be attached so that every time the lock is acquired
    and released the corresponding callbacks will be invoked.
    c                 C   s   t  ¡ | _g | _d S r   )Ú	threadingÚRLockÚ_lockÚ_cblist©Úselfr	   r	   r
   Ú__init__2   s    
z_LLVMLock.__init__c                 C   s   | j  ||f¡ dS )z®Register callbacks that are invoked immediately after the lock is
        acquired (``acq_fn()``) and immediately before the lock is released
        (``rel_fn()``).
        N)r   Úappend©r   Úacq_fnÚrel_fnr	   r	   r
   Úregister8   s    z_LLVMLock.registerc                 C   s   | j  ||f¡ dS )z)Remove the registered callbacks.
        N)r   Úremover   r	   r	   r
   Ú
unregister?   s    z_LLVMLock.unregisterc                 C   s$   | j  ¡  | jD ]\}}|ƒ  qd S r   )r   Úacquirer   r   r	   r	   r
   Ú	__enter__D   s    
z_LLVMLock.__enter__c                 G   s$   | j D ]\}}|ƒ  q| j ¡  d S r   )r   r   Úrelease)r   Úexc_detailsr   r    r	   r	   r
   Ú__exit__J   s    z_LLVMLock.__exit__N)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r!   r#   r%   r(   r	   r	   r	   r
   r   )   s   r   c                   @   sB   e Zd ZdZdddgZdd„ Zdd„ Zed	d
„ ƒZedd„ ƒZ	dS )Ú_lib_wrapperz{Wrap libllvmlite with a lock such that only one thread may access it at
    a time.

    This class duck-types a CDLL.
    Ú_libÚ_fntabr   c                 C   s   || _ i | _tƒ | _d S r   )r.   r/   r   r   )r   Úlibr	   r	   r
   r   Y   s    z_lib_wrapper.__init__c                 C   sL   z| j | W S  tk
rF   t| j|ƒ}t| j|ƒ}|| j |< | Y S X d S r   )r/   ÚKeyErrorÚgetattrr.   Ú_lib_fn_wrapperr   )r   r   ÚcfnÚwrappedr	   r	   r
   Ú__getattr__^   s    
z_lib_wrapper.__getattr__c                 C   s   | j jS )zgThe name of the library passed in the CDLL constructor.

        For duck-typing a ctypes.CDLL
        )r.   Ú_namer   r	   r	   r
   r7   h   s    z_lib_wrapper._namec                 C   s   | j jS )z]The system handle used to access the library.

        For duck-typing a ctypes.CDLL
        )r.   Ú_handler   r	   r	   r
   r8   p   s    z_lib_wrapper._handleN)
r)   r*   r+   r,   Ú	__slots__r   r6   Úpropertyr7   r8   r	   r	   r	   r
   r-   Q   s   


r-   c                   @   s\   e Zd ZdZddgZdd„ Zedd„ ƒZejdd„ ƒZed	d
„ ƒZ	e	jdd
„ ƒZ	dd„ Z
dS )r3   zîWraps and duck-types a ctypes.CFUNCTYPE to provide
    automatic locking when the wrapped function is called.

    TODO: we can add methods to mark the function as threadsafe
          and remove the locking-step on call when marked.
    r   Ú_cfnc                 C   s   || _ || _d S r   ©r   r;   )r   Úlockr4   r	   r	   r
   r   ‚   s    z_lib_fn_wrapper.__init__c                 C   s   | j jS r   ©r;   Úargtypesr   r	   r	   r
   r?   †   s    z_lib_fn_wrapper.argtypesc                 C   s   || j _d S r   r>   )r   r?   r	   r	   r
   r?   Š   s    c                 C   s   | j jS r   ©r;   Úrestyper   r	   r	   r
   rA   Ž   s    z_lib_fn_wrapper.restypec                 C   s   || j _d S r   r@   )r   rA   r	   r	   r
   rA   ’   s    c              
   O   s*   | j � | j||ŽW  5 Q R £ S Q R X d S r   r<   )r   ÚargsÚkwargsr	   r	   r
   Ú__call__–   s    z_lib_fn_wrapper.__call__N)r)   r*   r+   r,   r9   r   r:   r?   ÚsetterrA   rD   r	   r	   r	   r
   r3   y   s   



r3   c                 C   s   t  t  | ¡| ¡S )a  Replacement implementation of `import.resources.path` to avoid
    deprecation warning following code at importlib_resources/_legacy.py
    as suggested by https://importlib-resources.readthedocs.io/en/latest/using.html#migrating-from-legacy

    Notes on differences from importlib.resources implementation:

    The `_common.normalize_path(resource)` call is skipped because it is an
    internal API and it is unnecessary for the use here. What it does is
    ensuring `resource` is a str and that it does not contain path separators.
    )Ú_impresZas_fileÚfiles)ÚpackageÚresourcer	   r	   r
   Ú_importlib_resources_path_repl›   s    rJ   é   )é   é	   Ú.éÿÿÿÿz(Could not find/load shared object file: z
 Error was: c                 C   s   t j | |¡ dS )z~Register callback functions for lock acquire and release.
    *acq_fn* and *rel_fn* are callables that take no arguments.
    N)r0   r   r!   ©r   r    r	   r	   r
   Úregister_lock_callbackÁ   s    rQ   c                 C   s   t j | |¡ dS )z‘Remove the registered callback functions for lock acquire and release.
    The arguments are the same as used in `register_lock_callback()`.
    N)r0   r   r#   rP   r	   r	   r
   Úunregister_lock_callbackÈ   s    rR   c                   @   s   e Zd ZdZdS )Ú_DeadPointerz:
    Dummy class to make error messages more helpful.
    N)r)   r*   r+   r,   r	   r	   r	   r
   rS   Ï   s   rS   c                   @   sp   e Zd ZdZeƒ Zedd„ ƒZddd„Zdd	„ Z	d
d„ Z
dd„ Zefdd„Zdd„ Zdd„ ZeZedd„ ƒZdS )ÚOutputStringz<
    Object for managing the char* output of LLVM APIs.
    c                 C   s   | t  |t j¡d�S )a%  Constructing from a pointer returned from the C-API.
        The pointer must be allocated with LLVMPY_CreateString.

        Note
        ----
        Because ctypes auto-converts *restype* of *c_char_p* into a python
        string, we must use *c_void_p* to obtain the raw pointer.
        )Úinit)r   ÚcastÚc_char_p)ÚclsÚptrr	   r	   r
   Úfrom_returnÛ   s    
zOutputString.from_returnTNc                 C   s0   |d k	r|nt  d ¡| _t  | j¡| _|| _d S r   )r   rW   Ú_ptrZbyrefÚ_as_parameter_Ú_owned)r   ZownedrU   r	   r	   r
   r   ç   s    zOutputString.__init__c                 C   s*   | j d k	r&| jrt | j ¡ d | _ | `d S r   )r[   r]   r0   ZLLVMPY_DisposeStringr\   r   r	   r	   r
   Úcloseì   s
    
zOutputString.closec                 C   s   | S r   r	   r   r	   r	   r
   r%   ó   s    zOutputString.__enter__c                 C   s   |   ¡  d S r   ©r^   ©r   Úexc_typeÚexc_valÚexc_tbr	   r	   r
   r(   ö   s    zOutputString.__exit__c                 C   s   |ƒ s| j d k	r|   ¡  d S r   r_   ©r   r   r	   r	   r
   Ú__del__ù   s    
zOutputString.__del__c                 C   s*   | j d krdS | j j}|d k	s"t‚t|ƒS )Nz<dead OutputString>)r[   ÚvalueÚAssertionErrorr   )r   Úsr	   r	   r
   Ú__str__   s
    
zOutputString.__str__c                 C   s
   t | jƒS r   ©Úboolr[   r   r	   r	   r
   Ú__bool__  s    zOutputString.__bool__c                 C   s   | j jS )z:Get the raw bytes of content of the char pointer.
        )r[   rf   r   r	   r	   r
   Úbytes  s    zOutputString.bytes)TN)r)   r*   r+   r,   rS   r\   ÚclassmethodrZ   r   r^   r%   r(   r   re   ri   rl   Ú__nonzero__r:   rm   r	   r	   r	   r
   rT   Õ   s   

rT   c                 C   s   | dk	rt t | ¡ƒS dS )z,To wrap string return-value from C-API.
    N)ÚstrrT   rZ   ©rY   r	   r	   r
   Ú
ret_string  s    rr   c                 C   s   | dk	rt  | ¡jS dS )z+To wrap bytes return-value from C-API.
    N)rT   rZ   rm   rq   r	   r	   r
   Ú	ret_bytes  s    rs   c                   @   s‚   e Zd ZdZdZeƒ ZdZdd„ Zdd„ Z	dd„ Z
d	d
„ Zedd„ ƒZdd„ Zdd„ Zefdd„Zdd„ Zdd„ ZeZdd„ ZdS )Ú	ObjectRefzJ
    A wrapper around a ctypes pointer to a LLVM object ("resource").
    Fc                 C   s&   |d krt dƒ‚|| _|| _t| _d S )NzNULL pointer)Ú
ValueErrorr[   r\   r0   Z_capi)r   rY   r	   r	   r
   r   *  s
    zObjectRef.__init__c                 C   s(   z| js| js|  ¡  W 5 |   ¡  X dS )zI
        Close this object and do any required clean-up actions.
        N)ÚdetachÚ_closedr]   Ú_disposer   r	   r	   r
   r^   1  s    zObjectRef.closec                 C   s   | j s| `d| _ d| _dS )zN
        Detach the underlying LLVM resource without disposing of it.
        TN)rw   r\   r[   r   r	   r	   r
   rv   ;  s    zObjectRef.detachc                 C   s   dS )zÒ
        Dispose of the underlying LLVM resource.  Should be overriden
        by subclasses.  Automatically called by close(), __del__() and
        __exit__() (unless the resource has been detached).
        Nr	   r   r	   r	   r
   rx   D  s    zObjectRef._disposec                 C   s   | j S )zf
        Whether this object has been closed.  A closed object can't
        be used anymore.
        )rw   r   r	   r	   r
   ÚclosedK  s    zObjectRef.closedc                 C   s(   t | dƒst‚| jr$td| jf ƒ‚| S )Nr^   z%s instance already closed)Úhasattrrg   rw   ÚRuntimeErrorÚ	__class__r   r	   r	   r
   r%   S  s    zObjectRef.__enter__c                 C   s   |   ¡  d S r   r_   r`   r	   r	   r
   r(   Y  s    zObjectRef.__exit__c                 C   s   |ƒ s| j d k	r|   ¡  d S r   r_   rd   r	   r	   r
   re   \  s    
zObjectRef.__del__c                 C   s
   t | jƒS r   rj   r   r	   r	   r
   rl   a  s    zObjectRef.__bool__c                 C   s.   t |dƒsdS t | jd ¡t |jd ¡kS )Nr[   Fr   )rz   r   Z	addressofr[   )r   Úotherr	   r	   r
   Ú__eq__d  s
    
ÿzObjectRef.__eq__c                 C   s   t t | jtj¡jƒS r   )Úhashr   rV   r[   Zc_void_prf   r   r	   r	   r
   Ú__hash__m  s    zObjectRef.__hash__N)r)   r*   r+   r,   rw   rS   r\   r]   r   r^   rv   rx   r:   ry   r%   r(   r   re   rl   r~   ro   r€   r	   r	   r	   r
   rt   !  s"   
	
rt   )@Úsysr   r   Úimportlib.resourcesÚ	resourcesrF   Zllvmlite.binding.commonr   r   Zllvmlite.utilsr   r   ZLLVMContextRefZLLVMModuleRefZLLVMValueRefZLLVMTypeRefZLLVMExecutionEngineRefZLLVMPassManagerBuilderRefZLLVMPassManagerRefZLLVMTargetDataRefZLLVMTargetLibraryInfoRefZLLVMTargetRefZLLVMTargetMachineRefZLLVMMemoryBufferRefr   r   r   r   r   r   r   r   r   ZLLVMObjectCacheRefZLLVMObjectFileRefZLLVMSectionIteratorRefr   Úobjectr-   r3   rJ   Úversion_infoÚpathZ_importlib_resources_pathZ	_lib_nameÚjoinr)   ÚsplitÚpkgnameZ_lib_handleÚCDLLrp   r%   r0   ÚOSErrorÚeÚmsgrQ   rR   rS   rT   rr   rs   rt   r	   r	   r	   r
   Ú<module>   sp   (("ÿþ
ÿ>