a
    DfJ                     @   s@  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 d dlZd dlmZ d dlmZ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jZG dd dejZG dd dej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G dd deZ G dd deZ!G dd deZ"G d d! d!eZ#ej$eegej%j&_'ej$gej%j(_'ej)ej%j(_*ej$gej%j+_'eej%j+_*ej$egej%j,_'ej$gej%j-_'ej.ej%j-_*ej.gej%j/_'eej%j/_*ej$gej%j0_'eej%j0_*ej$egej%j1_'ej$gej%j2_'eej%j2_*ej$egej%j3_'ej$gej%j4_'eej%j4_*ej$egej%j5_'eegej%j6_'eej%j6_*ej$egej%j7_'ej$gej%j8_'eej%j8_*ej$gej%j9_'ej:ej%j9_*ej$gej%j;_'ej:ej%j;_*ej$gej%j<_'ej:ej%j<_*ej$gej%j=_'ej>ej%j=_*ej$gej%j?_'ej>ej%j?_*ej$gej%j@_'ejAej%j@_*ej$gej%jB_'ejCej%jB_*ej$gej%jD_'ejEej%jD_*ej$gej%jF_'ejGej%jF_*ej$gej%jH_'ejIej%jH_*ej:gej%jJ_'ej>gej%jK_'ejAgej%jL_'ejEgej%jM_'ejGgej%jN_'ejIgej%jO_'ej:gej%jP_'eej%jP_*ej>gej%jQ_'eej%jQ_*ejAgej%jR_'ej$ej%jR_*ejCgej%jS_'ej$ej%jS_*ejEgej%jT_'ej$ej%jT_*ejGgej%jU_'ej$ej%jU_*ejIgej%jV_'ej$ej%jV_*ej$gej%jW_'eej%jW_*ej$gej%jX_'e
ej%jX_*ej$gej%jY_'eej%jY_*ej$ee
gej%jZ_'ee	ej%jZ_*ej$gej%j[_'eej%j[_*ej$ee
gej%j\_'eej%j\_*dS )"    )POINTERbyrefcastc_char_pc_doublec_intc_size_tc_uintc_uint64c_boolc_void_pN)ffi)_decode_string_encode_string)TypeRefc                   @   sP   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdS )Linkager                           	   
                     N)__name__
__module____qualname__ZexternalZavailable_externallyZlinkonce_anyZlinkonce_odrZlinkonce_odr_autohideZweak_anyZweak_odrZ	appendingZinternalprivate	dllimport	dllexportZexternal_weakZghostcommonZlinker_privateZlinker_private_weak r)   r)   c/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/llvmlite/binding/value.pyr   
   s"   r   c                   @   s   e Zd ZdZdZdZdS )
Visibilityr   r   r   N)r"   r#   r$   defaulthiddenZ	protectedr)   r)   r)   r*   r+       s   r+   c                   @   s   e Zd ZdZdZdZdS )StorageClassr   r   r   N)r"   r#   r$   r,   r&   r'   r)   r)   r)   r*   r.   (   s   r.   c                   @   st   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdS )	ValueKindr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!                              N)r"   r#   r$   argumentZbasic_blockZ
memory_useZ
memory_defZ
memory_phifunctionZglobal_aliasZglobal_ifuncZglobal_variableZblock_addressZconstant_exprZconstant_arrayZconstant_structZconstant_vectorZundef_valueZconstant_aggregate_zeroZconstant_data_arrayZconstant_data_vectorconstant_intconstant_fpZconstant_pointer_nullZconstant_token_noneZmetadata_as_valueZ
inline_asminstructionZpoison_valuer)   r)   r)   r*   r/   0   s4   r/   c                   @   s  e Zd ZdZdd Zdd Zedd Zedd	 Zed
d Z	edd Z
edd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zedd Zejd d Zed!d" Zejd#d" Zed$d% Zejd&d% Zed'd( Zejd)d( Zd*d+ Zed,d- Zed.d/ Zed0d1 Zed2d3 Zed4d5 Zed6d7 Zed8d9 Zed:d; Z ed<d= Z!dBd?d@Z"dAS )CValueRefz&A weak reference to a LLVM value.
    c                 C   s   || _ || _tj| | d S N)_kind_parentsr   	ObjectRef__init__)selfptrkindparentsr)   r)   r*   rC   W   s    zValueRef.__init__c                 C   sB   t  &}t j| | t|W  d    S 1 s40    Y  d S r?   )r   OutputStringlibLLVMPY_PrintValueToStringstr)rD   Zoutstrr)   r)   r*   __str__\   s    
zValueRef.__str__c                 C   s   | j dS )zV
        The module this function or global variable value was obtained from.
        modulerA   getrD   r)   r)   r*   rM   a   s    zValueRef.modulec                 C   s   | j dS )zT
        The function this argument or basic block value was obtained from.
        r:   rN   rP   r)   r)   r*   r:   h   s    zValueRef.functionc                 C   s   | j dS )zE
        The block this instruction value was obtained from.
        blockrN   rP   r)   r)   r*   rQ   o   s    zValueRef.blockc                 C   s   | j dS )zG
        The instruction this operand value was obtained from.
        r=   rN   rP   r)   r)   r*   r=   v   s    zValueRef.instructionc                 C   s
   | j dkS )Nglobalr@   rP   r)   r)   r*   	is_global}   s    zValueRef.is_globalc                 C   s
   | j dkS )Nr:   rS   rP   r)   r)   r*   is_function   s    zValueRef.is_functionc                 C   s
   | j dkS )NrQ   rS   rP   r)   r)   r*   is_block   s    zValueRef.is_blockc                 C   s
   | j dkS )Nr9   rS   rP   r)   r)   r*   is_argument   s    zValueRef.is_argumentc                 C   s
   | j dkS )Nr=   rS   rP   r)   r)   r*   is_instruction   s    zValueRef.is_instructionc                 C   s
   | j dkS )NoperandrS   rP   r)   r)   r*   
is_operand   s    zValueRef.is_operandc                 C   s   t tj| S r?   )boolr   rI   LLVMPY_IsConstantrP   r)   r)   r*   is_constant   s    zValueRef.is_constantc                 C   s   t tj| S r?   )r/   r   rI   LLVMPY_GetValueKindrP   r)   r)   r*   
value_kind   s    zValueRef.value_kindc                 C   s   t tj| S r?   )r   r   rI   LLVMPY_GetValueNamerP   r)   r)   r*   name   s    zValueRef.namec                 C   s   t j| t| d S r?   )r   rI   LLVMPY_SetValueNamer   )rD   valr)   r)   r*   ra      s    c                 C   s   t tj| S r?   )r   r   rI   LLVMPY_GetLinkagerP   r)   r)   r*   linkage   s    zValueRef.linkagec                 C   s$   t |tst| }tj| | d S r?   )
isinstancer   r   rI   LLVMPY_SetLinkagerD   valuer)   r)   r*   re      s    
c                 C   s   t tj| S r?   )r+   r   rI   LLVMPY_GetVisibilityrP   r)   r)   r*   
visibility   s    zValueRef.visibilityc                 C   s$   t |tst| }tj| | d S r?   )rf   r+   r   rI   LLVMPY_SetVisibilityrh   r)   r)   r*   rk      s    
c                 C   s   t tj| S r?   )r.   r   rI   LLVMPY_GetDLLStorageClassrP   r)   r)   r*   storage_class   s    zValueRef.storage_classc                 C   s$   t |tst| }tj| | d S r?   )rf   r.   r   rI   LLVMPY_SetDLLStorageClassrh   r)   r)   r*   rn      s    
c                 C   s\   | j std| jf t|}tjt|t|}|dkrJtd	|tj
| | dS )z{Only works on function value

        Parameters
        -----------
        attr : str
            attribute name
        expected function value, got %sr   zno such attribute {!r}N)rU   
ValueErrorr@   rK   r   rI   "LLVMPY_GetEnumAttributeKindForNamer   lenformatLLVMPY_AddFunctionAttr)rD   attrattrnameZattrvalr)   r)   r*   add_function_attribute   s    zValueRef.add_function_attributec                 C   s   t tj| S )z)
        This value's LLVM type.
        )r   r   rI   LLVMPY_TypeOfrP   r)   r)   r*   type   s    zValueRef.typec                 C   s(   | j s| jstd| jf tj| S )zb
        Whether this value (presumably global) is defined in the current
        module.
        z)expected global or function value, got %s)rT   rU   rq   r@   r   rI   LLVMPY_IsDeclarationrP   r)   r)   r*   is_declaration   s
    zValueRef.is_declarationc                 C   s   t d}| jr$tj| }t|}n|| jrj| jdkrJtj| }t|}q| jdkrtj	| }t|}n6| j
rtj| }t|}n| jrtj| }t|}|S )z
        Return an iterator over this value's attributes.
        The iterator will yield a string for each attribute.
        r)   callZinvoke)iterrU   r   rI   LLVMPY_FunctionAttributesIter_AttributeListIteratorrX   opcodeLLVMPY_CallInstAttributesIterLLVMPY_InvokeInstAttributesIterrT   LLVMPY_GlobalAttributesIter_AttributeSetIteratorrW   LLVMPY_ArgumentAttributesIter)rD   itritr)   r)   r*   
attributes   s$    





zValueRef.attributesc                 C   sB   | j std| jf tj| }| j }|j| d t	||S )z|
        Return an iterator over this function's blocks.
        The iterator will yield a ValueRef for each block.
        rp   r:   )
rU   rq   r@   r   rI   LLVMPY_FunctionBlocksIterrA   copyupdate_BlocksIteratorrD   r   rG   r)   r)   r*   blocks   s    
zValueRef.blocksc                 C   sB   | j std| jf tj| }| j }|j| d t	||S )z
        Return an iterator over this function's arguments.
        The iterator will yield a ValueRef for each argument.
        rp   r   )
rU   rq   r@   r   rI   LLVMPY_FunctionArgumentsIterrA   r   r   _ArgumentsIteratorr   r)   r)   r*   	arguments  s    
zValueRef.argumentsc                 C   sB   | j std| jf tj| }| j }|j| d t	||S )z
        Return an iterator over this block's instructions.
        The iterator will yield a ValueRef for each instruction.
        zexpected block value, got %s)rQ   )
rV   rq   r@   r   rI   LLVMPY_BlockInstructionsIterrA   r   r   _InstructionsIteratorr   r)   r)   r*   instructions  s    
zValueRef.instructionsc                 C   sB   | j std| jf tj| }| j }|j| d t	||S )z
        Return an iterator over this instruction's operands.
        The iterator will yield a ValueRef for each operand.
        "expected instruction value, got %sr=   )
rX   rq   r@   r   rI   LLVMPY_InstructionOperandsIterrA   r   r   _OperandsIteratorr   r)   r)   r*   operands'  s    
zValueRef.operandsc                 C   s(   | j std| jf ttj| S )Nr   )rX   rq   r@   r   Z
ret_stringrI   LLVMPY_GetOpcodeNamerP   r)   r)   r*   r   5  s
    zValueRef.opcodec                 C   sL   | j r| jdkr td| jf tj| }| j }|j	| d t
||S )z
        Return an iterator over this phi instruction's incoming blocks.
        The iterator will yield a ValueRef for each block.
        phiz&expected phi instruction value, got %sr   )rX   r   rq   r@   r   rI   LLVMPY_PhiIncomingBlocksIterrA   r   r   _IncomingBlocksIteratorr   r)   r)   r*   incoming_blocks<  s    
zValueRef.incoming_blocksFc           	      C   s   | j std| jf | jtjkrztd}tj	| }tj
| t|}tt|tt| j}tj||jrpdnd|dS | jtjkrtd}tj| t|}|jr|stdt|  |S t| S )a  
        Return the constant value, either as a literal (when supported)
        or as a string.

        Parameters
        -----------
        signed_int : bool
            if True and the constant is an integer, returns a signed version
        round_fp : bool
            if True and the constant is a floating point value, rounds the
            result upon accuracy loss (e.g., when querying an fp128 value).
            By default, raises an exception on accuracy loss
        zexpected constant value, got %sFlittlebig)signedz:Accuracy loss encountered in conversion of constant value )r]   rq   r@   r_   r/   r;   r   r   rI   LLVMPY_GetConstantIntNumWordsLLVMPY_GetConstantIntRawValuer   bytesr   r   r
   contentsint
from_bytesri   r<   LLVMPY_GetConstantFPValuerK   )	rD   Z
signed_intZround_fpZlittle_endianwordsrE   ZasbytesZaccuracy_lossri   r)   r)   r*   get_constant_valueJ  s:    
zValueRef.get_constant_valueN)FF)#r"   r#   r$   __doc__rC   rL   propertyrM   r:   rQ   r=   rT   rU   rV   rW   rX   rZ   r]   r_   ra   setterre   rk   rn   rx   rz   r|   r   r   r   r   r   r   r   r   r)   r)   r)   r*   r>   S   s~   





























r>   c                   @   s,   e Zd ZdZdd Zdd ZeZdd ZdS )_ValueIteratorNc                 C   s6   t j| | || _| jd u r2tdt| jf d S )Nz%s must specify kind attribute)r   rB   rC   rA   rF   NotImplementedErrorrz   r"   )rD   rE   rG   r)   r)   r*   rC   }  s    

z_ValueIterator.__init__c                 C   s$   |   }|rt|| j| jS td S r?   )_nextr>   rF   rA   StopIterationrD   Zvpr)   r)   r*   __next__  s    z_ValueIterator.__next__c                 C   s   | S r?   r)   rP   r)   r)   r*   __iter__  s    z_ValueIterator.__iter__)r"   r#   r$   rF   rC   r   nextr   r)   r)   r)   r*   r   x  s
   r   c                   @   s    e Zd Zdd ZeZdd ZdS )_AttributeIteratorc                 C   s   |   }|r|S td S r?   )r   r   r   r)   r)   r*   r     s    z_AttributeIterator.__next__c                 C   s   | S r?   r)   rP   r)   r)   r*   r     s    z_AttributeIterator.__iter__N)r"   r#   r$   r   r   r   r)   r)   r)   r*   r     s   r   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s   | j |  d S r?   )_capiLLVMPY_DisposeAttributeListIterrP   r)   r)   r*   _dispose  s    z_AttributeListIterator._disposec                 C   s   t t j| S r?   )r   	ret_bytesrI   LLVMPY_AttributeListIterNextrP   r)   r)   r*   r     s    z_AttributeListIterator._nextNr"   r#   r$   r   r   r)   r)   r)   r*   r     s   r   c                   @   s   e Zd Zdd Zdd ZdS )r   c                 C   s   | j |  d S r?   )r   LLVMPY_DisposeAttributeSetIterrP   r)   r)   r*   r     s    z_AttributeSetIterator._disposec                 C   s   t t j| S r?   )r   r   rI   LLVMPY_AttributeSetIterNextrP   r)   r)   r*   r     s    z_AttributeSetIterator._nextNr   r)   r)   r)   r*   r     s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )r   rQ   c                 C   s   | j |  d S r?   )r   LLVMPY_DisposeBlocksIterrP   r)   r)   r*   r     s    z_BlocksIterator._disposec                 C   s   t j| S r?   )r   rI   LLVMPY_BlocksIterNextrP   r)   r)   r*   r     s    z_BlocksIterator._nextNr"   r#   r$   rF   r   r   r)   r)   r)   r*   r     s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )r   r9   c                 C   s   | j |  d S r?   )r   ZLLVMPY_DisposeArgumentsIterrP   r)   r)   r*   r     s    z_ArgumentsIterator._disposec                 C   s   t j| S r?   )r   rI   LLVMPY_ArgumentsIterNextrP   r)   r)   r*   r     s    z_ArgumentsIterator._nextNr   r)   r)   r)   r*   r     s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )r   r=   c                 C   s   | j |  d S r?   )r   LLVMPY_DisposeInstructionsIterrP   r)   r)   r*   r     s    z_InstructionsIterator._disposec                 C   s   t j| S r?   )r   rI   LLVMPY_InstructionsIterNextrP   r)   r)   r*   r     s    z_InstructionsIterator._nextNr   r)   r)   r)   r*   r     s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )r   rY   c                 C   s   | j |  d S r?   )r   LLVMPY_DisposeOperandsIterrP   r)   r)   r*   r     s    z_OperandsIterator._disposec                 C   s   t j| S r?   )r   rI   LLVMPY_OperandsIterNextrP   r)   r)   r*   r     s    z_OperandsIterator._nextNr   r)   r)   r)   r*   r     s   r   c                   @   s    e Zd ZdZdd Zdd ZdS )r   rQ   c                 C   s   | j |  d S r?   )r    LLVMPY_DisposeIncomingBlocksIterrP   r)   r)   r*   r     s    z _IncomingBlocksIterator._disposec                 C   s   t j| S r?   )r   rI   LLVMPY_IncomingBlocksIterNextrP   r)   r)   r*   r     s    z_IncomingBlocksIterator._nextNr   r)   r)   r)   r*   r     s   r   )]ctypesr   r   r   r   r   r   r   r	   r
   r   r   enumZllvmlite.bindingr   Zllvmlite.binding.commonr   r   Zllvmlite.binding.typerefr   IntEnumr   r+   r.   r/   rB   r>   r   r   r   r   r   r   r   r   r   ZLLVMValueRefrI   rJ   argtypesZLLVMPY_GetGlobalParentZLLVMModuleRefrestyper`   rb   ry   ZLLVMTypeRefZLLVMPY_GetTypeNamerd   rg   rj   rl   rm   ro   rr   ru   r{   r   ZLLVMAttributeListIteratorr   r   r   ZLLVMAttributeSetIteratorr   r   ZLLVMBlocksIteratorr   ZLLVMArgumentsIteratorr   ZLLVMInstructionsIteratorr   ZLLVMOperandsIteratorr   ZLLVMIncomingBlocksIteratorr   r   r   r   r   r   r   r   r   r   r   r   r   r   r\   r^   r   r   r   r)   r)   r)   r*   <module>   s   4#  '		


















