U
    ºmœdÍ‡  ã                   @   s@  d Z ddlZddlZddlZddlmZ ddlmZmZmZ ddl	m
Z
mZmZ eeeejƒƒeeeejƒƒB eeedƒƒB Ze d¡Zdd	d
ddddœZi fdd„Zdd„ Zdd„ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZeƒ ZG dd„ de
eeeƒZG dd„ deƒZG dd „ d e
eeƒZ G d!d"„ d"e ƒZ!G d#d$„ d$e
eeƒZ"G d%d&„ d&eƒZ#G d'd(„ d(e ƒZ$G d)d*„ d*ƒZ%G d+d,„ d,e ƒZ&G d-d.„ d.e eeƒZ'G d/d0„ d0e'ƒZ(G d1d2„ d2e)ƒZ*G d3d4„ d4e*ƒZ+G d5d6„ d6e'ƒZ,G d7d8„ d8e*ƒZ-G d9d:„ d:e ƒZ.G d;d<„ d<e.ƒZ/G d=d>„ d>e.ƒZ0G d?d@„ d@e ƒZ1G dAdB„ dBeƒZ2dS )Cz_
Classes that are LLVM values: Value, Constant...
Instructions are in the instructions module.
é    N)ÚMappingProxyType)ÚvaluesÚtypesÚ_utils)Ú_StrCachingÚ_StringReferenceCachingÚ_HasMetadataz !#$%&'()*+,-./:;<=>?@[]^_`{|}~z[-a-zA-Z$._][-a-zA-Z$._0-9]*$ÚgtÚltÚeqÚneÚgeÚle)ú>ú<ú==ú!=z>=z<=c                    st   t | tƒr|  ¡ } t | ttfƒs$t‚ˆ sXtdƒD ]&}|tkrJt|ƒˆ |< q0d| ˆ |< q0‡ fdd„| D ƒ}d 	|¡S )z�
    Escape the given bytestring for safe use as a LLVM array constant.
    Any unicode string input is first encoded with utf8 into bytes.
    é   z\%02xc                    s   g | ]}ˆ | ‘qS © r   )Ú.0Úch©Ú_mapr   úK/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/llvmlite/ir/values.pyÚ
<listcomp>/   s     z"_escape_string.<locals>.<listcomp>Ú )
Ú
isinstanceÚstrÚencodeÚbytesÚ	bytearrayÚAssertionErrorÚrangeÚ_VALID_CHARSÚchrÚjoin)Útextr   r   Úbufr   r   r   Ú_escape_string   s    
r(   c                    s   ‡ fdd„}|S )Nc                    s   t  | ¡‡ fdd„ƒ}|S )Nc                    sJ   | j |j kr td| j |j f ƒ‚d ˆ | j |  ¡ |j | ¡ ¡}t| j |ƒS )Nú,Operands must be the same type, got (%s, %s)z{0} ({1} {2}, {3} {4}))ÚtypeÚ
ValueErrorÚformatÚget_referenceÚFormattedConstant)ÚlhsÚrhsÚfmt©Úopnamer   r   Úwrapped5   s    
ÿ  þz%_binop.<locals>.wrap.<locals>.wrapped©Ú	functoolsÚwraps©Úfnr4   r2   r   r   Úwrap4   s    
z_binop.<locals>.wrapr   ©r3   r:   r   r2   r   Ú_binop3   s    r<   c                    s   ‡ fdd„}|S )Nc                    s   t  ˆ ¡‡ ‡fdd„ƒ}|S )Nc                    s8   ˆ | |ƒ || j kr| S d ˆ| j |  ¡ |¡}t||ƒS )Nz{0} ({1} {2} to {3}))r*   r,   r-   r.   )ÚselfÚtypÚop)r9   r3   r   r   r4   F   s    


 ÿz&_castop.<locals>.wrap.<locals>.wrappedr5   r8   r2   )r9   r   r:   E   s    	z_castop.<locals>.wrapr   r;   r   r2   r   Ú_castopD   s    r@   c                   @   s8  e Zd ZdZedƒdd„ ƒZedƒdd„ ƒZedƒd	d
„ ƒZedƒdd„ ƒZedƒdd„ ƒZ	edƒdd„ ƒZ
edƒdd„ ƒZedƒdd„ ƒZedƒdd„ ƒZedƒdd„ ƒZed ƒd!d"„ ƒZed#ƒd$d%„ ƒZed&ƒd'd(„ ƒZed)ƒd*d+„ ƒZed,ƒd-d.„ ƒZed/ƒd0d1„ ƒZed2ƒd3d4„ ƒZed5ƒd6d7„ ƒZd8d9„ Zd:d;„ Zd<d=„ Zd>d?„ Zd@dA„ ZdBdC„ ZdDdE„ ZdFdG„ ZedHƒdIdJ„ ƒZ edKƒdLdM„ ƒZ!edNƒdOdP„ ƒZ"edQƒdRdS„ ƒZ#edTƒdUdV„ ƒZ$edWƒdXdY„ ƒZ%edZƒd[d\„ ƒZ&ed]ƒd^d_„ ƒZ'ed`ƒdadb„ ƒZ(edcƒddde„ ƒZ)edfƒdgdh„ ƒZ*ediƒdjdk„ ƒZ+dldm„ Z,dnS )oÚ_ConstOpMixinzQ
    A mixin defining constant operations, for use in constant-like classes.
    Úshlc                 C   s   dS )z<
        Left integer shift:
            lhs << rhs
        Nr   ©r=   Úotherr   r   r   rB   ]   s    z_ConstOpMixin.shlÚlshrc                 C   s   dS )zP
        Logical (unsigned) right integer shift:
            lhs >> rhs
        Nr   rC   r   r   r   rE   d   s    z_ConstOpMixin.lshrÚashrc                 C   s   dS )zQ
        Arithmetic (signed) right integer shift:
            lhs >> rhs
        Nr   rC   r   r   r   rF   k   s    z_ConstOpMixin.ashrÚaddc                 C   s   dS )z9
        Integer addition:
            lhs + rhs
        Nr   rC   r   r   r   rG   r   s    z_ConstOpMixin.addÚfaddc                 C   s   dS )z@
        Floating-point addition:
            lhs + rhs
        Nr   rC   r   r   r   rH   y   s    z_ConstOpMixin.faddÚsubc                 C   s   dS )z<
        Integer subtraction:
            lhs - rhs
        Nr   rC   r   r   r   rI   €   s    z_ConstOpMixin.subÚfsubc                 C   s   dS )zC
        Floating-point subtraction:
            lhs - rhs
        Nr   rC   r   r   r   rJ   ‡   s    z_ConstOpMixin.fsubÚmulc                 C   s   dS )z?
        Integer multiplication:
            lhs * rhs
        Nr   rC   r   r   r   rK   Ž   s    z_ConstOpMixin.mulÚfmulc                 C   s   dS )zF
        Floating-point multiplication:
            lhs * rhs
        Nr   rC   r   r   r   rL   •   s    z_ConstOpMixin.fmulÚudivc                 C   s   dS )zB
        Unsigned integer division:
            lhs / rhs
        Nr   rC   r   r   r   rM   œ   s    z_ConstOpMixin.udivÚsdivc                 C   s   dS )z@
        Signed integer division:
            lhs / rhs
        Nr   rC   r   r   r   rN   £   s    z_ConstOpMixin.sdivÚfdivc                 C   s   dS )z@
        Floating-point division:
            lhs / rhs
        Nr   rC   r   r   r   rO   ª   s    z_ConstOpMixin.fdivÚuremc                 C   s   dS )zC
        Unsigned integer remainder:
            lhs % rhs
        Nr   rC   r   r   r   rP   ±   s    z_ConstOpMixin.uremÚsremc                 C   s   dS )zA
        Signed integer remainder:
            lhs % rhs
        Nr   rC   r   r   r   rQ   ¸   s    z_ConstOpMixin.sremÚfremc                 C   s   dS )zA
        Floating-point remainder:
            lhs % rhs
        Nr   rC   r   r   r   rR   ¿   s    z_ConstOpMixin.fremÚorc                 C   s   dS )z;
        Bitwise integer OR:
            lhs | rhs
        Nr   rC   r   r   r   Úor_Æ   s    z_ConstOpMixin.or_Úandc                 C   s   dS )z<
        Bitwise integer AND:
            lhs & rhs
        Nr   rC   r   r   r   Úand_Í   s    z_ConstOpMixin.and_Úxorc                 C   s   dS )z<
        Bitwise integer XOR:
            lhs ^ rhs
        Nr   rC   r   r   r   rW   Ô   s    z_ConstOpMixin.xorc              	   C   s¢   |d }zt | }W n$ tk
r8   td||f ƒ‚Y nX |dkrJ|dksR|| }| j|jkrrtd| j|jf ƒ‚d ||| j|  ¡ |j| ¡ ¡}tt d¡|ƒS )NÚcmpzinvalid comparison %r for %sÚi)r   r   r)   z{0} {1} ({2} {3}, {4} {5})é   )	Ú_CMP_MAPÚKeyErrorr+   r*   r,   r-   r.   r   ÚIntType)r=   ÚprefixÚsignÚcmpoprD   Zinsr?   r1   r   r   r   Ú_cmpÛ   s(    
ÿ   ýz_ConstOpMixin._cmpc                 C   s   |   dd||¡S )z…
        Signed integer comparison:
            lhs <cmpop> rhs

        where cmpop can be '==', '!=', '<', '<=', '>', '>='
        rY   Ús©ra   ©r=   r`   rD   r   r   r   Úicmp_signedð   s    z_ConstOpMixin.icmp_signedc                 C   s   |   dd||¡S )z”
        Unsigned integer (or pointer) comparison:
            lhs <cmpop> rhs

        where cmpop can be '==', '!=', '<', '<=', '>', '>='
        rY   Úurc   rd   r   r   r   Úicmp_unsignedù   s    z_ConstOpMixin.icmp_unsignedc                 C   s   |   dd||¡S )z›
        Floating-point ordered comparison:
            lhs <cmpop> rhs

        where cmpop can be '==', '!=', '<', '<=', '>', '>=', 'ord', 'uno'
        ÚfÚorc   rd   r   r   r   Úfcmp_ordered  s    z_ConstOpMixin.fcmp_orderedc                 C   s   |   dd||¡S )z�
        Floating-point unordered comparison:
            lhs <cmpop> rhs

        where cmpop can be '==', '!=', '<', '<=', '>', '>=', 'ord', 'uno'
        rh   rf   rc   rd   r   r   r   Úfcmp_unordered  s    z_ConstOpMixin.fcmp_unorderedc                 C   s>   t | jtjƒr&t | jd| jj ¡}nt | jd¡}|  |¡S )z@
        Bitwise integer complement:
            ~value
        )éÿÿÿÿrl   )r   r*   r   Z
VectorTyper   ÚConstantÚcountrW   )r=   r0   r   r   r   Únot_  s    z_ConstOpMixin.not_c                 C   s   t  | jd¡}| | ¡S )z6
        Integer negative:
            -value
        r   )r   rm   r*   rI   )r=   Úzeror   r   r   Úneg$  s    z_ConstOpMixin.negc                 C   s   d  | j|  ¡ ¡}t| j|ƒS )z=
        Floating-point negative:
            -value
        zfneg ({0} {1}))r,   r*   r-   r.   )r=   r1   r   r   r   Úfneg,  s    z_ConstOpMixin.fnegÚtruncc                 C   s   dS )z@
        Truncating integer downcast to a smaller type.
        Nr   ©r=   r>   r   r   r   rs   8  s    z_ConstOpMixin.truncÚzextc                 C   s   dS )z@
        Zero-extending integer upcast to a larger type
        Nr   rt   r   r   r   ru   >  s    z_ConstOpMixin.zextÚsextc                 C   s   dS )zA
        Sign-extending integer upcast to a larger type.
        Nr   rt   r   r   r   rv   D  s    z_ConstOpMixin.sextÚfptruncc                 C   s   dS )zA
        Floating-point downcast to a less precise type.
        Nr   rt   r   r   r   rw   J  s    z_ConstOpMixin.fptruncÚfpextc                 C   s   dS )z?
        Floating-point upcast to a more precise type.
        Nr   rt   r   r   r   rx   P  s    z_ConstOpMixin.fpextÚbitcastc                 C   s   dS )z;
        Pointer cast to a different pointer type.
        Nr   rt   r   r   r   ry   V  s    z_ConstOpMixin.bitcastÚfptouic                 C   s   dS )z=
        Convert floating-point to unsigned integer.
        Nr   rt   r   r   r   rz   \  s    z_ConstOpMixin.fptouiÚuitofpc                 C   s   dS )z=
        Convert unsigned integer to floating-point.
        Nr   rt   r   r   r   r{   b  s    z_ConstOpMixin.uitofpÚfptosic                 C   s   dS )z;
        Convert floating-point to signed integer.
        Nr   rt   r   r   r   r|   h  s    z_ConstOpMixin.fptosiÚsitofpc                 C   s   dS )z;
        Convert signed integer to floating-point.
        Nr   rt   r   r   r   r}   n  s    z_ConstOpMixin.sitofpÚptrtointc                 C   s@   t | jtjƒs"d}t|| jf ƒ‚t |tjƒs<td|f ƒ‚dS )z*
        Cast pointer to integer.
        z2can only call ptrtoint() on pointer type, not '%s'z-can only ptrtoint() to integer type, not '%s'N)r   r*   r   ÚPointerTypeÚ	TypeErrorr]   ©r=   r>   Úmsgr   r   r   r~   t  s    ÿz_ConstOpMixin.ptrtointÚinttoptrc                 C   s@   t | jtjƒs"d}t|| jf ƒ‚t |tjƒs<td|f ƒ‚dS )z*
        Cast integer to pointer.
        z7can only call inttoptr() on integer constants, not '%s'z-can only inttoptr() to pointer type, not '%s'N)r   r*   r   r]   r€   r   r�   r   r   r   rƒ   €  s    ÿz_ConstOpMixin.inttoptrc                 C   sx   t | jtjƒstd| jf ƒ‚| j}|D ]}| |¡}q(dd„ |D ƒ}d | jj| j|  ¡ d 	|¡¡}t
| | j¡|ƒS )z>
        Call getelementptr on this pointer constant.
        z2can only call gep() on pointer constants, not '%s'c                 S   s   g | ]}d   |j| ¡ ¡‘qS )ú{0} {1}©r,   r*   r-   )r   Úidxr   r   r   r   ˜  s   ÿz%_ConstOpMixin.gep.<locals>.<listcomp>z!getelementptr ({0}, {1} {2}, {3})ú, )r   r*   r   r   r€   Úgepr,   Úpointeer-   r%   r.   Ú
as_pointerÚ	addrspace)r=   ÚindicesZouttyperY   Z
strindicesr?   r   r   r   rˆ   Œ  s"    ÿÿ  þz_ConstOpMixin.gepN)-Ú__name__Ú
__module__Ú__qualname__Ú__doc__r<   rB   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rT   rV   rW   ra   re   rg   rj   rk   ro   rq   rr   r@   rs   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   rƒ   rˆ   r   r   r   r   rA   T   sŒ   

















			











rA   c                   @   s   e Zd ZdZdd„ ZdS )ÚValuez(
    The base class for all values.
    c                 C   s   d| j j| jf S )Nz<ir.%s type='%s' ...>)Ú	__class__r�   r*   ©r=   r   r   r   Ú__repr__¦  s    zValue.__repr__N)r�   rŽ   r�   r�   r”   r   r   r   r   r‘   ¡  s   r‘   c                   @   s   e Zd ZdZdd„ ZdS )Ú
_Undefinedz0
    'undef': a value for undefined values.
    c                 C   s*   zt W S  tk
r$   t t¡ Y S X d S ©N)Ú	UndefinedÚ	NameErrorÚobjectÚ__new__r•   )Úclsr   r   r   rš   ®  s    z_Undefined.__new__N)r�   rŽ   r�   r�   rš   r   r   r   r   r•   ª  s   r•   c                   @   sl   e Zd ZdZdd„ Zdd„ Zdd„ Zedd	„ ƒZed
d„ ƒZ	e
dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ ZdS )rm   z 
    A constant LLVM value.
    c                 C   s:   t |tjƒst‚t |tjƒr t‚|| _| |¡}|| _d S r–   )r   r   ÚTyper!   ÚVoidTyper*   Zwrap_constant_valueÚconstant©r=   r>   rž   r   r   r   Ú__init__½  s
    
zConstant.__init__c                 C   s   d  | j|  ¡ ¡S ©Nr„   r…   r“   r   r   r   Ú
_to_stringÄ  s    zConstant._to_stringc                 C   sT   | j d kr| jj}n<| j tkr$d}n,t| j tƒrBd t| j ƒ¡}n| j | j ¡}|S )NZundefzc"{0}")	rž   r*   Únullr—   r   r    r,   r(   Zformat_constant©r=   Úvalr   r   r   Ú_get_referenceÇ  s    


zConstant._get_referencec                 C   sZ   dd„ |D ƒ}t |ƒdkr"tdƒ‚|d }|D ]}||kr.tdƒ‚q.| t |t |ƒ¡|ƒS )zO
        Construct a literal array constant made of the given members.
        c                 S   s   g | ]
}|j ‘qS r   ©r*   ©r   Úelr   r   r   r   Û  s     z*Constant.literal_array.<locals>.<listcomp>r   zneed at least one elementz$all elements must have the same type)Úlenr+   r€   r   Ú	ArrayType)r›   ÚelemsÚtysÚtyrD   r   r   r   Úliteral_arrayÖ  s    
zConstant.literal_arrayc                 C   s   dd„ |D ƒ}| t  |¡|ƒS )zS
        Construct a literal structure constant made of the given members.
        c                 S   s   g | ]
}|j ‘qS r   r§   r¨   r   r   r   r   é  s     z+Constant.literal_struct.<locals>.<listcomp>)r   ZLiteralStructType)r›   r¬   r­   r   r   r   Úliteral_structä  s    zConstant.literal_structc                 C   s   t | jtjƒstdƒ‚| jjS )Nz)Only pointer constant have address spaces)r   r*   r   r   r€   r‹   r“   r   r   r   r‹   ì  s    zConstant.addrspacec                 C   s"   t |tƒrt| ƒt|ƒkS dS d S ©NF)r   rm   r   rC   r   r   r   Ú__eq__ò  s    
zConstant.__eq__c                 C   s   |   |¡ S r–   ©r²   rC   r   r   r   Ú__ne__ø  s    zConstant.__ne__c                 C   s   t t| ƒƒS r–   )Úhashr   r“   r   r   r   Ú__hash__û  s    zConstant.__hash__c                 C   s   d| j | jf S )Nz <ir.Constant type='%s' value=%r>)r*   rž   r“   r   r   r   r”   þ  s    zConstant.__repr__N)r�   rŽ   r�   r�   r    r¢   r¦   Úclassmethodr¯   r°   Úpropertyr‹   r²   r´   r¶   r”   r   r   r   r   rm   ¸  s   


rm   c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	r.   zA
    A constant with an already formatted IR representation.
    c                 C   s    t |tƒst‚t | ||¡ d S r–   )r   r   r!   rm   r    rŸ   r   r   r   r      s    zFormattedConstant.__init__c                 C   s   | j S r–   ©rž   r“   r   r   r   r¢     s    zFormattedConstant._to_stringc                 C   s   | j S r–   r¹   r“   r   r   r   r¦     s    z FormattedConstant._get_referenceN)r�   rŽ   r�   r�   r    r¢   r¦   r   r   r   r   r.     s   r.   c                   @   sf   e Zd ZdZdZdZdd„ Zdd„ Zdd	„ Zd
d„ Z	dd„ Z
ee	e
ƒZdd„ Zdd„ Zedd„ ƒZdS )Ú
NamedValuez*
    The base class for named values.
    ú%Tc                 C   s6   |d k	st ‚t|tjƒst ‚|| _|| _|  |¡ d S r–   )r!   r   r   rœ   Úparentr*   Ú	_set_name)r=   r¼   r*   Únamer   r   r   r      s
    zNamedValue.__init__c                 C   s>   g }t | jtjƒs&| d |  ¡ ¡¡ |  |¡ d |¡ 	¡ S )Nz{0} = r   )
r   r*   r   r�   Úappendr,   r-   Údescrr%   Úrstrip©r=   r'   r   r   r   r¢      s
    
zNamedValue._to_stringc                 C   s   t ‚d S r–   )ÚNotImplementedErrorrÂ   r   r   r   rÀ   '  s    zNamedValue.descrc                 C   s   | j S r–   )Ú_namer“   r   r   r   Ú	_get_name*  s    zNamedValue._get_namec                 C   s   | j jj|| jd�}|| _d S )N)Zdeduplicate)r¼   ÚscopeÚregisterÚdeduplicate_namerÄ   ©r=   r¾   r   r   r   r½   -  s    
ÿzNamedValue._set_namec                 C   s8   | j }d|ksd|kr*| dd¡ dd¡}d | j|¡S )Nú\ú"ú\5cú\22z{0}"{1}")r¾   Úreplacer,   Úname_prefixrÉ   r   r   r   r¦   4  s    zNamedValue._get_referencec                 C   s   d| j j| j| jf S )Nz<ir.%s %r of type '%s'>©r’   r�   r¾   r*   r“   r   r   r   r”   ;  s
      ÿzNamedValue.__repr__c                 C   s>   | j }t|tjƒr| j j}t|tjƒr*|S td | j ¡ƒ‚d S )NzNot a function: {0})r*   r   r   r   r‰   ÚFunctionTyper€   r,   )r=   r®   r   r   r   Úfunction_type?  s    zNamedValue.function_typeN)r�   rŽ   r�   r�   rÏ   rÈ   r    r¢   rÀ   rÅ   r½   r¸   r¾   r¦   r”   rÒ   r   r   r   r   rº     s   
rº   c                       sL   e Zd ZdZ‡ fdd„Zdd„ Zdd„ ZeZdd	„ Zd
d„ Z	dd„ Z
‡  ZS )ÚMetaDataStringz[
    A metadata string, i.e. a constant string used as a value in a metadata
    node.
    c                    s$   t t| ƒj|t ¡ dd� || _d S )Nr   ©r¾   )ÚsuperrÓ   r    r   ÚMetaDataTypeÚstring)r=   r¼   r×   ©r’   r   r   r    P  s
    þzMetaDataString.__init__c                 C   s   ||   ¡ df7 }d S )NÚ
)r-   rÂ   r   r   r   rÀ   V  s    zMetaDataString.descrc                 C   s   d  t| jƒ¡S )Nz!"{0}")r,   r(   r×   r“   r   r   r   r¦   Y  s    zMetaDataString._get_referencec                 C   s   t |tƒr| j|jkS dS d S r±   )r   rÓ   r×   rC   r   r   r   r²   ^  s    
zMetaDataString.__eq__c                 C   s   |   |¡ S r–   r³   rC   r   r   r   r´   d  s    zMetaDataString.__ne__c                 C   s
   t | jƒS r–   )rµ   r×   r“   r   r   r   r¶   g  s    zMetaDataString.__hash__)r�   rŽ   r�   r�   r    rÀ   r¦   r¢   r²   r´   r¶   Ú__classcell__r   r   rØ   r   rÓ   J  s   rÓ   c                   @   s$   e Zd ZdZdd„ Zdd„ ZeZdS )ÚMetaDataArgumentzÊ
    An argument value to a function taking metadata arguments.
    This can wrap any other kind of LLVM value.

    Do not instantiate directly, Builder.call() will create these
    automatically.
    c                 C   s4   t |tƒst‚t |jtjƒr t‚t ¡ | _|| _d S r–   )r   r‘   r!   r*   r   rÖ   Úwrapped_value©r=   Úvaluer   r   r   r    t  s    
zMetaDataArgument.__init__c                 C   s   d  | jj| j ¡ ¡S r¡   )r,   rÜ   r*   r-   r“   r   r   r   r¦   z  s    
ÿzMetaDataArgument._get_referenceN)r�   rŽ   r�   r�   r    r¦   r¢   r   r   r   r   rÛ   k  s   rÛ   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )ÚNamedMetaDatazk
    A named metadata node.

    Do not instantiate directly, use Module.add_named_metadata() instead.
    c                 C   s   || _ g | _d S r–   )r¼   Úoperands)r=   r¼   r   r   r   r    ‰  s    zNamedMetaData.__init__c                 C   s   | j  |¡ d S r–   )rà   r¿   )r=   Úmdr   r   r   rG   �  s    zNamedMetaData.addN)r�   rŽ   r�   r�   r    rG   r   r   r   r   rß   ‚  s   rß   c                       sL   e Zd ZdZdZ‡ fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
‡  ZS )ÚMDValuezš
    A metadata node's value, consisting of a sequence of elements ("operands").

    Do not instantiate directly, use Module.add_metadata() instead.
    ú!c                    s4   t t| ƒj|t ¡ |d� t|ƒ| _|j | ¡ d S ©NrÔ   )	rÕ   râ   r    r   rÖ   Útuplerà   Úmetadatar¿   )r=   r¼   r   r¾   rØ   r   r   r    ™  s    þ
zMDValue.__init__c                 C   s†   g }| j D ]Z}t|jtjƒrLt|tƒr<|jd kr<| d¡ qd| | ¡ ¡ q
| d 	|j| ¡ ¡¡ q
d 
|¡}|d 	|¡df7 }d S )Nr£   r„   r‡   z
!{{ {0} }}rÙ   )rà   r   r*   r   rÖ   rm   rž   r¿   r-   r,   r%   )r=   r'   rà   r?   r   r   r   rÀ      s    

zMDValue.descrc                 C   s   | j t| jƒ S r–   ©rÏ   r   r¾   r“   r   r   r   r¦   ­  s    zMDValue._get_referencec                 C   s   t |tƒr| j|jkS dS d S r±   )r   râ   rà   rC   r   r   r   r²   °  s    
zMDValue.__eq__c                 C   s   |   |¡ S r–   r³   rC   r   r   r   r´   ¶  s    zMDValue.__ne__c                 C   s
   t | jƒS r–   )rµ   rà   r“   r   r   r   r¶   ¹  s    zMDValue.__hash__©r�   rŽ   r�   r�   rÏ   r    rÀ   r¦   r²   r´   r¶   rÚ   r   r   rØ   r   râ   ‘  s   râ   c                   @   s   e Zd ZdZdd„ ZdS )ÚDITokenz§
    A debug information enumeration value that should appear bare in
    the emitted metadata.

    Use this to wrap known constants, e.g. the DW_* enumerations.
    c                 C   s
   || _ d S r–   )rÞ   rÝ   r   r   r   r    Å  s    zDIToken.__init__N)r�   rŽ   r�   r�   r    r   r   r   r   ré   ½  s   ré   c                       sL   e Zd ZdZdZ‡ fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
‡  ZS )ÚDIValuezŒ
    A debug information descriptor, containing key-value pairs.

    Do not instantiate directly, use Module.add_debug_info() instead.
    rã   c                    s@   t t| ƒj|t ¡ |d� || _|| _t|ƒ| _|j	 
| ¡ d S rä   )rÕ   rê   r    r   rÖ   Úis_distinctÚkindrå   rà   ræ   r¿   )r=   r¼   rë   rì   rà   r¾   rØ   r   r   r    Ñ  s    þ
zDIValue.__init__c                 C   sâ   | j r|d7 }g }| jD ]¦\}}|d kr.d}n~|dkr<d}np|dkrJd}nbt|tƒr\|j}nPt|tƒrvd t|ƒ¡}n6t|tƒrŠt|ƒ}n"t|t	ƒrž| 
¡ }ntd|f ƒ‚| d	 ||¡¡ qd
 |¡}|d| jd|df7 }d S )N)z	distinct r£   TÚtrueFÚfalsez"{}"z'invalid operand type for debug info: %rz{0}: {1}r‡   rã   ú(z)
)rë   rà   r   ré   rÞ   r   r,   r(   Úintrº   r-   r€   r¿   r%   rì   )r=   r'   rà   ÚkeyrÞ   Zstrvaluer   r   r   rÀ   Ú  s0    





ÿ
zDIValue.descrc                 C   s   | j t| jƒ S r–   rç   r“   r   r   r   r¦   ô  s    zDIValue._get_referencec                 C   s6   t |tƒr.| j|jko,| j|jko,| j|jkS dS d S r±   )r   rê   rë   rì   rà   rC   r   r   r   r²   ÷  s    

ÿ
þzDIValue.__eq__c                 C   s   |   |¡ S r–   r³   rC   r   r   r   r´   ÿ  s    zDIValue.__ne__c                 C   s   t | j| j| jfƒS r–   )rµ   rë   rì   rà   r“   r   r   r   r¶     s    zDIValue.__hash__rè   r   r   rØ   r   rê   É  s   	rê   c                       s(   e Zd ZdZdZdZ‡ fdd„Z‡  ZS )ÚGlobalValuez
    A global value.
    ú@Fc                    s.   t t| ƒj||Ž d| _d| _d| _i | _d S ©Nr   )rÕ   rò   r    ÚlinkageÚstorage_classÚsectionræ   )r=   ÚargsÚkwargsrØ   r   r   r      s
    zGlobalValue.__init__)r�   rŽ   r�   r�   rÏ   rÈ   r    rÚ   r   r   rØ   r   rò     s   rò   c                       s*   e Zd ZdZd‡ fdd„	Zdd„ Z‡  ZS )ÚGlobalVariablez
    A global variable.
    r   c                    s`   t |tjƒst‚tt| ƒj|| |¡|d� || _d | _	d| _
d| _|| _d | _| j | ¡ d S )NrÔ   F)r   r   rœ   r!   rÕ   rú   r    rŠ   Ú
value_typeÚinitializerÚunnamed_addrÚglobal_constantr‹   Úalignr¼   Ú
add_global)r=   Úmoduler>   r¾   r‹   rØ   r   r   r      s    ÿzGlobalVariable.__init__c                 C   s^  | j rd}nd}| js*| jd kr$dnd}n| j}|rB| |d ¡ | jrX| | jd ¡ | jrh| d¡ | jdkr„| d | j¡¡ | d	j|| jd
�¡ | jd k	rÞ| jj	| jkrÈt
d| jj	| jf ƒ‚| d| j ¡  ¡ n |dkrþ| d|  t¡ ¡  ¡ | j�r| d| jf ¡ | jd k	�r6| d| jf ¡ | j�rP| | jdd�¡ | d¡ d S )Nrž   ÚglobalÚexternalr   ú zunnamed_addr r   zaddrspace({0:d}) z{kind} {type})rì   r*   z3got initializer of type %s for global value type %s)r  Zextern_weakz, section "%s"z
, align %dT)Zleading_commarÙ   )rþ   rõ   rü   r¿   rö   rý   r‹   r,   rû   r*   r€   r-   r—   r÷   rÿ   ræ   Ú_stringify_metadata)r=   r'   rì   rõ   r   r   r   rÀ   &  s<    


þzGlobalVariable.descr)r   )r�   rŽ   r�   r�   r    rÀ   rÚ   r   r   rØ   r   rú     s   rú   c                       sJ   e Zd ZdZdZd‡ fdd„	Zdd„ Z‡ fdd„Zd	d
„ Zdd„ Z	‡  Z
S )ÚAttributeSetzxA set of string attribute.
    Only accept items listed in *_known*.

    Properties:
    * Iterate in sorted order
    r   c                    s2   t ƒ  ¡  t|tƒr|g}|D ]}|  |¡ qd S r–   )rÕ   r    r   r   rG   )r=   rø   r¾   rØ   r   r   r    \  s
    

zAttributeSet.__init__c                 C   s   |S r–   r   )r=   r¾   r>   r   r   r   Ú_expandc  s    zAttributeSet._expandc                    s4   || j krtd || ¡ƒ‚|  |¡ tt| ƒ |¡S )Nzunknown attr {!r} for {})Ú_knownr+   r,   Ú_validate_addrÕ   r  rG   rÉ   rØ   r   r   rG   f  s    

zAttributeSet.addc                 C   s   d S r–   r   rÉ   r   r   r   r	  l  s    zAttributeSet._validate_addc                    s   ‡ ‡fdd„t ˆ ƒD ƒS )Nc                    s   g | ]}ˆ   |ˆ¡‘qS r   )r  )r   rY   rt   r   r   r   p  s     z)AttributeSet._to_list.<locals>.<listcomp>)Úsortedrt   r   rt   r   Ú_to_listo  s    zAttributeSet._to_list)r   )r�   rŽ   r�   r�   r  r    r  rG   r	  r  rÚ   r   r   rØ   r   r  S  s   r  c                        s°   e Zd Zeddddddddd	d
dddddddddddddddddddddgƒZd-‡ fd!d"„	Z‡ fd#d$„Zed%d&„ ƒZej	d'd&„ ƒZed(d)„ ƒZ
e
j	d*d)„ ƒZ
‡ fd+d,„Z‡  ZS ).ÚFunctionAttributesZ
argmemonlyÚalwaysinlineÚbuiltinZcoldZinaccessiblememonlyZinaccessiblemem_or_argmemonlyZ
inlinehintZ	jumptableZminsizeZnakedZ	nobuiltinZnoduplicateZnoimplicitfloatÚnoinlineZnonlazybindZ	norecurseZ	noredzoneZnoreturnZnounwindZoptnoneZoptsizeZreadnoneÚreadonlyZreturns_twiceZsanitize_addressZsanitize_memoryZsanitize_threadÚsspZsspregZ	sspstrongZuwtabler   c                    s    d| _ d | _tt| ƒ |¡ d S ©Nr   )Ú_alignstackÚ_personalityrÕ   r  r    ©r=   rø   rØ   r   r   r    ~  s    zFunctionAttributes.__init__c                    s8   |dkrd| ks |dkr(d| kr(t dƒ‚tƒ  |¡ d S )Nr  r  z$Can't have alwaysinline and noinline)r+   rÕ   rG   rÉ   rØ   r   r   rG   ƒ  s    ÿÿzFunctionAttributes.addc                 C   s   | j S r–   )r  r“   r   r   r   Ú
alignstackŠ  s    zFunctionAttributes.alignstackc                 C   s   |dkst ‚|| _d S r  )r!   r  r¤   r   r   r   r  Ž  s    c                 C   s   | j S r–   )r  r“   r   r   r   Úpersonality“  s    zFunctionAttributes.personalityc                 C   s    |d kst |tƒst‚|| _d S r–   )r   rò   r!   r  r¤   r   r   r   r  —  s    c                    sL   t ƒ  |¡}| jr$| d | j¡¡ | jrH| dj| jj| j ¡ d�¡ |S )Nzalignstack({0:d})zpersonality {persty} {persfn})ZperstyZpersfn)rÕ   r  r  r¿   r,   r  r*   r-   )r=   Zret_typeÚattrsrØ   r   r   r  œ  s    þzFunctionAttributes._to_list)r   )r�   rŽ   r�   Ú	frozensetr  r    rG   r¸   r  Úsetterr  r  rÚ   r   r   rØ   r   r  s  sX                          ø




r  c                       s„   e Zd ZdZ‡ fdd„Zedd„ ƒZe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edd„ ƒZ‡  ZS )ÚFunctionz�Represent a LLVM Function but does uses a Module as parent.
    Global Values are stored as a set of dependencies (attribute `depends`).
    c                    s†   t |tjƒst‚ttˆ ƒj|| ¡ |d� |ˆ _t	 
¡ ˆ _g ˆ _tƒ ˆ _t‡ fdd„|jD ƒƒˆ _tˆ |jƒˆ _ˆ j ˆ ¡ dˆ _d S )NrÔ   c                    s   g | ]}t ˆ |ƒ‘qS r   )ÚArgument)r   Útr“   r   r   r   ³  s   ÿz%Function.__init__.<locals>.<listcomp>r   )r   r   rœ   r!   rÕ   r  r    rŠ   Úftyper   Z	NameScoperÆ   Úblocksr  Ú
attributesrå   rø   ÚReturnValueÚreturn_typeÚreturn_valuer¼   r   Úcalling_convention)r=   r  r  r¾   rØ   r“   r   r    ¬  s    
ÿ
zFunction.__init__c                 C   s   | j S r–   ©r¼   r“   r   r   r   r  ¹  s    zFunction.modulec                 C   s
   | j d S r  ©r  r“   r   r   r   Úentry_basic_block½  s    zFunction.entry_basic_blockc                 C   s   | j S r–   r&  r“   r   r   r   Úbasic_blocksÁ  s    zFunction.basic_blocksr   c                 C   s   t | |d�}| j |¡ |S )N©r¼   r¾   )ÚBlockr  r¿   )r=   r¾   Úblkr   r   r   Úappend_basic_blockÅ  s    zFunction.append_basic_blockc                 C   s   t | |d�}| j ||¡ |S )zInsert block before
        r)  )r*  r  Úinsert)r=   Úbeforer¾   r+  r   r   r   Úinsert_basic_blockÊ  s    zFunction.insert_basic_blockc              	   C   s  | j r
dnd}| j}d dd„ | jD ƒ¡}|  ¡ }| jrRdd | j | jj¡¡ nd}t	| jƒrr| jj
rldnd}n| jj
r~d	nd}| j}| j}	d d
d„ |||	|fD ƒ¡}
|  ¡ }|rÀd |¡nd}| jrÖd | j¡nd}d}|j|
||||||d�}| |¡ dS )zB
        Describe the prototype ("head") of the function.
        ZdefineZdeclarer‡   c                 s   s   | ]}t |ƒV  qd S r–   ©r   )r   Úar   r   r   Ú	<genexpr>×  s     z+Function.descr_prototype.<locals>.<genexpr>r  r   z, ...z...c                 s   s   | ]}|rt |ƒV  qd S r–   r0  )r   Úxr   r   r   r2  á  s      z {}z section "{}"z:{prefix} {name}({args}{vararg}){attrs}{section}{metadata}
)r^   r¾   rø   Úvarargr  r÷   ræ   N)r  r#  r%   rø   r-   r   r  r  r"  ÚanyZvar_argrõ   r$  r  r,   r÷   r¿   )r=   r'   ÚstateÚretrø   r¾   r  r4  rõ   Zcconvr^   ræ   r÷   Zpt_strZ	prototyper   r   r   Údescr_prototypeÑ  s6    ÿÿÿ

  þzFunction.descr_prototypec                 C   s   | j D ]}| |¡ qdS )z7
        Describe of the body of the function.
        N)r  rÀ   )r=   r'   r+  r   r   r   Ú
descr_bodyë  s    
zFunction.descr_bodyc                 C   s2   |   |¡ | jr.| d¡ |  |¡ | d¡ d S )Nz{
z}
)r8  r  r¿   r9  rÂ   r   r   r   rÀ   ò  s
    


zFunction.descrc                 C   s   g }|   |¡ d |¡S rô   )rÀ   r%   rÂ   r   r   r   Ú__str__ù  s    
zFunction.__str__c                 C   s   t | jƒdkS r  )rª   r  r“   r   r   r   Úis_declarationþ  s    zFunction.is_declaration)r   )r   )r�   rŽ   r�   r�   r    r¸   r  r'  r(  r,  r/  r8  r9  rÀ   r:  r;  rÚ   r   r   rØ   r   r  §  s    




r  c                       sº   e Zd ZedddddddddddddddddddddœƒZd‡ fdd	„	Zd
d„ Z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‡ fdd„Z‡  ZS )ÚArgumentAttributes)NT)TT)FF)FTr±   )ZbyrefZbyvalZelementtypeZimmargZinallocaZinregÚnestZnoaliasZ	nocaptureZnofreeZnonnullZnoundefZpreallocatedÚreturnedZsignextZsretZ
swiftasyncZ
swifterrorZ	swiftselfZzeroextr   c                    s&   d| _ d| _d| _tt| ƒ |¡ d S r  )Ú_alignÚ_dereferenceableÚ_dereferenceable_or_nullrÕ   r<  r    r  rØ   r   r   r    !  s    zArgumentAttributes.__init__c                 C   sD   dd l }|jjd }| j |¡|dk }|d kr@td|› d�ƒ‚d S )Nr   é   z
Attribute z) is not supported on current LLVM version)Úllvmlite.bindingÚbindingÚllvm_version_infor  Úgetr+   )r=   r¾   ÚllvmliteÚ
llvm_majorÚrequires_typer   r   r   r	  '  s    
ÿz ArgumentAttributes._validate_addc                 C   sF   dd l }|jjd }| j |¡|dk }|r>|› d|j› d�S |S d S )Nr   rB  rï   ú))rC  rD  rE  r  rF  r‰   )r=   r¾   r>   rG  rH  rI  r   r   r   r  /  s    zArgumentAttributes._expandc                 C   s   | j S r–   )r?  r“   r   r   r   rÿ   8  s    zArgumentAttributes.alignc                 C   s    t |tƒr|dkst‚|| _d S r  )r   rð   r!   r?  r¤   r   r   r   rÿ   <  s    c                 C   s   | j S r–   )r@  r“   r   r   r   ÚdereferenceableA  s    z"ArgumentAttributes.dereferenceablec                 C   s    t |tƒr|dkst‚|| _d S r  )r   rð   r!   r@  r¤   r   r   r   rK  E  s    c                 C   s   | j S r–   )rA  r“   r   r   r   Údereferenceable_or_nullJ  s    z*ArgumentAttributes.dereferenceable_or_nullc                 C   s    t |tƒr|dkst‚|| _d S r  )r   rð   r!   rA  r¤   r   r   r   rL  N  s    c                    s\   t ƒ  |¡}| jr$| d | j¡¡ | jr<| d | j¡¡ | jrXd}| | | j¡¡ |S )Nzalign {0:d}zdereferenceable({0:d})zdereferenceable_or_null({0:d}))rÕ   r  rÿ   r¿   r,   rK  rL  )r=   r>   r  ZdrefrØ   r   r   r  S  s    zArgumentAttributes._to_list)r   )r�   rŽ   r�   r   r  r    r	  r  r¸   rÿ   r  rK  rL  r  rÚ   r   r   rØ   r   r<    sL   è	





r<  c                       s.   e Zd Zd‡ fdd„	Zdd„ Zdd„ Z‡  ZS )	Ú_BaseArgumentr   c                    s8   t |tjƒst‚tt| ƒj|||d� || _tƒ | _	d S rä   )
r   r   rœ   r!   rÕ   rM  r    r¼   r<  r   )r=   r¼   r>   r¾   rØ   r   r   r    `  s    z_BaseArgument.__init__c                 C   s   d| j j| j| jf S )Nz<ir.%s %r of type %s>rÐ   r“   r   r   r   r”   f  s    ÿz_BaseArgument.__repr__c                 C   s   | j  |¡ d S r–   )r   rG   )r=   Úattrr   r   r   Úadd_attributej  s    z_BaseArgument.add_attribute)r   )r�   rŽ   r�   r    r”   rO  rÚ   r   r   rØ   r   rM  _  s   rM  c                   @   s   e Zd ZdZdd„ ZdS )r  z3
    The specification of a function argument.
    c                 C   sB   | j  | j¡}|r,d | jd |¡|  ¡ ¡S d | j|  ¡ ¡S d S )Nz{0} {1} {2}r  r„   )r   r  r*   r,   r%   r-   ©r=   r  r   r   r   r:  s  s    ÿzArgument.__str__N©r�   rŽ   r�   r�   r:  r   r   r   r   r  n  s   r  c                   @   s   e Zd ZdZdd„ ZdS )r!  z9
    The specification of a function's return value.
    c                 C   s4   | j  | j¡}|r&d d |¡| j¡S t| jƒS d S )Nr„   r  )r   r  r*   r,   r%   r   rP  r   r   r   r:  �  s    zReturnValue.__str__NrQ  r   r   r   r   r!  |  s   r!  c                       s^   e Zd ZdZd‡ fdd„	Zedd„ ƒZedd„ ƒZed	d
„ ƒZdd„ Z	dd„ Z
dd„ Z‡  ZS )r*  a   
    A LLVM IR basic block. A basic block is a sequence of
    instructions whose execution always goes from start to end.  That
    is, a control flow instruction (branch) can only appear as the
    last instruction, and incoming branches can only jump to the first
    instruction.
    r   c                    s2   t t| ƒj|t ¡ |d� |j| _g | _d | _d S rä   )rÕ   r*  r    r   Z	LabelTyperÆ   ÚinstructionsÚ
terminator)r=   r¼   r¾   rØ   r   r   r    ’  s    zBlock.__init__c                 C   s
   | j d k	S r–   )rS  r“   r   r   r   Úis_terminated˜  s    zBlock.is_terminatedc                 C   s   | j S r–   r%  r“   r   r   r   Úfunctionœ  s    zBlock.functionc                 C   s   | j jS r–   )r¼   r  r“   r   r   r   r     s    zBlock.modulec                 C   s,   |  d |  ¡ ¡¡ |dd„ | jD ƒ7 }d S )Nz{0}:
c                 S   s   g | ]}d   |¡‘qS )z  {0}
)r,   )r   Úinstrr   r   r   r   ¦  s     zBlock.descr.<locals>.<listcomp>)r¿   r,   Ú_format_namerR  rÂ   r   r   r   rÀ   ¤  s    zBlock.descrc                 C   sd   |j |j krtdƒ‚| j |¡}| j |¡ | j ||¡ | jjD ]}|jD ]}| ||¡ qLqBdS )zReplace an instructionz$new instruction has a different typeN)	r*   r€   rR  ÚindexÚremover-  r¼   r(  Zreplace_usage)r=   ÚoldÚnewÚposZbbrV  r   r   r   rÎ   ¨  s    
zBlock.replacec                 C   s2   | j }t |¡s.| dd¡ dd¡}d |¡}|S )NrÊ   rÌ   rË   rÍ   z"{0}")r¾   Ú_SIMPLE_IDENTIFIER_REÚmatchrÎ   r,   rÉ   r   r   r   rW  ´  s
    

zBlock._format_name)r   )r�   rŽ   r�   r�   r    r¸   rT  rU  r  rÀ   rÎ   rW  rÚ   r   r   rØ   r   r*  ‰  s   


r*  c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚBlockAddressz'
    The address of a basic block.
    c                 C   s<   t |tƒst‚t |tƒst‚t d¡ ¡ | _|| _|| _	d S )Né   )
r   r  r!   r*  r   r]   rŠ   r*   rU  Úbasic_block)r=   rU  ra  r   r   r   r    Ä  s
    zBlockAddress.__init__c                 C   s   d  | j|  ¡ ¡S r¡   r…   r“   r   r   r   r:  Ë  s    zBlockAddress.__str__c                 C   s   d  | j ¡ | j ¡ ¡S )Nzblockaddress({0}, {1}))r,   rU  r-   ra  r“   r   r   r   r-   Î  s    þzBlockAddress.get_referenceN)r�   rŽ   r�   r�   r    r:  r-   r   r   r   r   r_  ¿  s   r_  )3r�   r6   r×   Úrer   r   Zllvmlite.irr   r   Zllvmlite.ir._utilsr   r   r   r  ÚmapÚordÚascii_lettersÚdigitsr#   Úcompiler]  r[   r(   r<   r@   r™   rA   r‘   r•   r—   rm   r.   rº   rÓ   rÛ   rß   râ   ré   rê   rò   rú   Úsetr  r  r  r<  rM  r  r!  r*  r_  r   r   r   r   Ú<module>   s`   ÿþ
ú
  O	J8!,=> 4\\6