U
    ¥½|eÍ‡  ã                   @   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   úO/var/www/website-v5/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 )NZ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 '==', '!=', '<', '<=', '>', '>='
        rX   Ús©r`   ©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 '==', '!=', '<', '<=', '>', '>='
        rX   Úurb   rc   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Úorb   rc   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'
        rg   re   rb   rc   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
        )éÿÿÿÿrk   )r   r*   r   Ú
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outtyperX   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   r`   rd   rf   ri   rj   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*   Ú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(   Ú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   Ú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)Ú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)Ú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   rX   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_twiceÚsanitize_addressZsanitize_memoryZsanitize_threadZ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   Ú	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/  )r0  r%  Úinsert)r=   ÚbeforerÁ   r1  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.
        Ú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–   r7  )r   Úxr   r   r   r9  á  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(  ÚanyÚvar_argrù   r*  r
  r,   rû   rÂ   )r=   r'   ÚstateÚretrü   rÁ   r  r;  rù   Úcconvr]   rê   rû   Zpt_strÚ	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'   r1  r   r   r   Ú
descr_bodyë  s    
zFunction.descr_bodyc                 C   s2   |   |¡ | jr.| d¡ |  |¡ | d¡ d S )Nz{
z}
)rB  r%  rÂ   rC  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.  r2  r5  rB  rC  rÃ   rD  rE  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´   )Ú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Ù   rF  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   rM  ró   ú))rN  rO  rP  r  rQ  r‰   )r=   rÁ   r>   rR  rS  rT  r   r   r   r  /  s    zArgumentAttributes._expandc                 C   s   | j S r–   )rJ  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!   rJ  r¦   r   r   r   r  <  s    c                 C   s   | j S r–   )rK  r“   r   r   r   ÚdereferenceableA  s    z"ArgumentAttributes.dereferenceablec                 C   s    t |tƒr|dkst‚|| _d S r  )r   rô   r!   rK  r¦   r   r   r   rV  E  s    c                 C   s   | j S r–   )rL  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!   rL  r¦   r   r   r   rW  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,   rV  rW  )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  rV  rW  r  rÞ   r   r   rÜ   r   rF    sL   è	





rF  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Ù   rX  r¡   r¿   rF  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”   rZ  rÞ   r   r   rÜ   r   rX  _  s   rX  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   rD  s  s    ÿzArgument.__str__N©r�   rŽ   r�   r�   rD  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   r[  r   r   r   rD  �  s    zReturnValue.__str__Nr\  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 )r0  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Ù   r0  r¡   r   Ú	LabelTyperÊ   ÚinstructionsÚ
terminator)r=   r¿   rÁ   rÜ   r   r   r¡   ’  s    zBlock.__init__c                 C   s
   | j d k	S r–   )r_  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_namer^  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€   r^  ÚindexÚremover3  r¿   r.  Zreplace_usage)r=   ÚoldÚnewÚposÚbbrb  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   rc  ´  s
    

zBlock._format_name)r   )r�   rŽ   r�   r�   r¡   r»   r`  ra  r  rÃ   rÒ   rc  rÞ   r   r   rÜ   r   r0  ‰  s   


r0  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!   r0  r   r\   rŠ   r*   ra  Úbasic_block)r=   ra  rn  r   r   r   r¡   Ä  s
    zBlockAddress.__init__c                 C   s   d  | j|  ¡ ¡S r¢   r…   r“   r   r   r   rD  Ë  s    zBlockAddress.__str__c                 C   s   d  | j ¡ | j ¡ ¡S )Nzblockaddress({0}, {1}))r,   ra  r-   rn  r“   r   r   r   r-   Î  s    þzBlockAddress.get_referenceN)r�   rŽ   r�   r�   r¡   rD  r-   r   r   r   r   rl  ¿  s   rl  )3r�   r6   rÛ   Úrer   r   Úllvmlite.irr   r   Úllvmlite.ir._utilsr   r   r   r  ÚmapÚordÚascii_lettersÚdigitsr#   Úcompilerj  rZ   r(   r<   r@   r™   rA   r‘   r•   r—   rm   r.   r½   r×   rß   rã   ræ   rí   rî   rö   rþ   Úsetr  r  r   rF  rX  r!  r'  r0  rl  r   r   r   r   Ú<module>   s`   ÿþ
ú
  O	J8!,=> 4\\6