
    :YdJ                        d Z ddlZddlZddl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                            z   e eed                    z  Z ej        d          Zddd	d
dddZi fdZd Zd Z G d de          Z G d de          Z G d de          Z e            Z G d de	e
ee          Z G d de          Z G d de	e
e          Z G d de          Z  G d d e	e
e          Z! G d! d"e          Z" G d# d$e          Z# G d% d&          Z$ G d' d(e          Z% G d) d*eee          Z& G d+ d,e&          Z' G d- d.e(          Z) G d/ d0e)          Z* G d1 d2e&          Z+ G d3 d4e)          Z, G d5 d6e          Z- G d7 d8e-          Z. G d9 d:e-          Z/ G d; d<e          Z0 G d= d>e          Z1dS )?z_
Classes that are LLVM values: Value, Constant...
Instructions are in the instructions module.
    N)valuestypes_utils)_StrCaching_StringReferenceCaching_HasMetadataz !#$%&'()*+,-./:;<=>?@[]^_`{|}~z[-a-zA-Z$._][-a-zA-Z$._0-9]*$gtlteqnegele)><==!=z>=z<=c                 H   t          | t                    r|                                 } t          | t          t          f          sJ s6t          d          D ]&}|t          v rt          |          |<   d|z  |<   'f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                      g | ]
}|         S  r   ).0ch_maps     2lib/python3.11/site-packages/llvmlite/ir/values.py
<listcomp>z"_escape_string.<locals>.<listcomp>/   s    
#
#
#48
#
#
#     )	
isinstancestrencodebytes	bytearrayrange_VALID_CHARSchrjoin)textr   r   bufs    `  r   _escape_stringr)      s    
 $ {{}}dUI.///// )** 	) 	)B\!!r77R#b=R
#
#
#
#d
#
#
#C773<<r   c                       fd}|S )Nc                 F    t          j        |           fd            }|S )Nc                    | j         |j         k    r t          d| j         d|j         d          d                    | j         |                                 |j         |                                          }t	          | j         |          S )N%Operands must be the same type, got (, )z{0} ({1} {2}, {3} {4}))type
ValueErrorformatget_referenceFormattedConstant)lhsrhsfmtopnames      r   wrappedz%_binop.<locals>.wrap.<locals>.wrapped5   s    x38## j$'HHHchhh"8 9 9 9 +11&25(C<M<M<O<O25(C<M<M<O<OQ QC %SXs333r   	functoolswrapsfnr9   r8   s     r   wrapz_binop.<locals>.wrap4   s8    				4 	4 	4 	4 
		4 r   r   r8   r?   s   ` r   _binoprA   3   s#         Kr   c                       fd}|S )Nc                 J     t          j                    fd            }|S )Nc                      | |           || j         k    r| S d                    | j         |                                 |          }t          ||          S )Nz{0} ({1} {2} to {3}))r0   r2   r3   r4   )selftypopr>   r8   s      r   r9   z&_castop.<locals>.wrap.<locals>.wrappedF   sb    BtSMMMdi'..vty/3/A/A/C/CSJ JB$S"---r   r:   r=   s   ` r   r?   z_castop.<locals>.wrapE   s>    				. 	. 	. 	. 	. 
		. r   r   r@   s   ` r   _castoprH   D   s#         Kr   c                      e Zd Z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d          d             Z ed          d             Z ed           d!             Z ed"          d#             Z ed$          d%             Zd& Zd' Zd( Zd) Zd* Zd+ Zd, Zd- Z ed.          d/             Z  ed0          d1             Z! ed2          d3             Z" ed4          d5             Z# ed6          d7             Z$ ed8          d9             Z% ed:          d;             Z& ed<          d=             Z' ed>          d?             Z( ed@          dA             Z) edB          dC             Z* edD          dE             Z+dF Z,dGS )H_ConstOpMixinzQ
    A mixin defining constant operations, for use in constant-like classes.
    shlc                     dS )z<
        Left integer shift:
            lhs << rhs
        Nr   rE   others     r   rK   z_ConstOpMixin.shl]         r   lshrc                     dS )zP
        Logical (unsigned) right integer shift:
            lhs >> rhs
        Nr   rM   s     r   rP   z_ConstOpMixin.lshrd   rO   r   ashrc                     dS )zQ
        Arithmetic (signed) right integer shift:
            lhs >> rhs
        Nr   rM   s     r   rR   z_ConstOpMixin.ashrk   rO   r   addc                     dS )z9
        Integer addition:
            lhs + rhs
        Nr   rM   s     r   rT   z_ConstOpMixin.addr   rO   r   faddc                     dS )z@
        Floating-point addition:
            lhs + rhs
        Nr   rM   s     r   rV   z_ConstOpMixin.faddy   rO   r   subc                     dS )z<
        Integer subtraction:
            lhs - rhs
        Nr   rM   s     r   rX   z_ConstOpMixin.sub   rO   r   fsubc                     dS )zC
        Floating-point subtraction:
            lhs - rhs
        Nr   rM   s     r   rZ   z_ConstOpMixin.fsub   rO   r   mulc                     dS )z?
        Integer multiplication:
            lhs * rhs
        Nr   rM   s     r   r\   z_ConstOpMixin.mul   rO   r   fmulc                     dS )zF
        Floating-point multiplication:
            lhs * rhs
        Nr   rM   s     r   r^   z_ConstOpMixin.fmul   rO   r   udivc                     dS )zB
        Unsigned integer division:
            lhs / rhs
        Nr   rM   s     r   r`   z_ConstOpMixin.udiv   rO   r   sdivc                     dS )z@
        Signed integer division:
            lhs / rhs
        Nr   rM   s     r   rb   z_ConstOpMixin.sdiv   rO   r   fdivc                     dS )z@
        Floating-point division:
            lhs / rhs
        Nr   rM   s     r   rd   z_ConstOpMixin.fdiv   rO   r   uremc                     dS )zC
        Unsigned integer remainder:
            lhs % rhs
        Nr   rM   s     r   rf   z_ConstOpMixin.urem   rO   r   sremc                     dS )zA
        Signed integer remainder:
            lhs % rhs
        Nr   rM   s     r   rh   z_ConstOpMixin.srem   rO   r   fremc                     dS )zA
        Floating-point remainder:
            lhs % rhs
        Nr   rM   s     r   rj   z_ConstOpMixin.frem   rO   r   orc                     dS )z;
        Bitwise integer OR:
            lhs | rhs
        Nr   rM   s     r   or_z_ConstOpMixin.or_   rO   r   andc                     dS )z<
        Bitwise integer AND:
            lhs & rhs
        Nr   rM   s     r   and_z_ConstOpMixin.and_   rO   r   xorc                     dS )z<
        Bitwise integer XOR:
            lhs ^ rhs
        Nr   rM   s     r   rr   z_ConstOpMixin.xor   rO   r   c           	         |dz   }	 t           |         }n## t          $ r t          d|d|          w xY w|dk    r|dv s||z   }| j        |j        k    r t          d| j        d|j        d          d	                    ||| j        |                                 |j        |                                          }t          t          j        d
          |          S )Ncmpzinvalid comparison z for i)r   r   r-   r.   r/   z{0} {1} ({2} {3}, {4} {5})   )	_CMP_MAPKeyErrorr1   r0   r2   r3   r4   r   IntType)rE   prefixsigncmpoprN   insrG   r7   s           r   _cmpz_ConstOpMixin._cmp   s   un	L%BB 	L 	L 	L*uuuccJKKK	L #%<"7"7B9
""* $			5:::7 8 8 8 +11It))++J++--/ /
 !q!1!13777s     5c                 2    |                      dd||          S )z
        Signed integer comparison:
            lhs <cmpop> rhs

        where cmpop can be '==', '!=', '<', '<=', '>', '>='
        rv   sr   rE   r}   rN   s      r   icmp_signedz_ConstOpMixin.icmp_signed        yyc5%000r   c                 2    |                      dd||          S )z
        Unsigned integer (or pointer) comparison:
            lhs <cmpop> rhs

        where cmpop can be '==', '!=', '<', '<=', '>', '>='
        rv   ur   r   s      r   icmp_unsignedz_ConstOpMixin.icmp_unsigned   r   r   c                 2    |                      dd||          S )z
        Floating-point ordered comparison:
            lhs <cmpop> rhs

        where cmpop can be '==', '!=', '<', '<=', '>', '>=', 'ord', 'uno'
        for   r   s      r   fcmp_orderedz_ConstOpMixin.fcmp_ordered  r   r   c                 2    |                      dd||          S )z
        Floating-point unordered comparison:
            lhs <cmpop> rhs

        where cmpop can be '==', '!=', '<', '<=', '>', '>=', 'ord', 'uno'
        r   r   r   r   s      r   fcmp_unorderedz_ConstOpMixin.fcmp_unordered  r   r   c                     t          | j        t          j                  r(t	          j        | j        d| j        j        z            }nt	          j        | j        d          }|                     |          S )z@
        Bitwise integer complement:
            ~value
        )r   )r   r0   r   
VectorTyper   Constantcountrr   )rE   r6   s     r   not_z_ConstOpMixin.not_  s\    
 di!122 	1/$)UTY_-DEECC/$)R00Cxx}}r   c                 `    t          j        | j        d          }|                    |           S )z6
        Integer negative:
            -value
        r   )r   r   r0   rX   )rE   zeros     r   negz_ConstOpMixin.neg$  s'    
 ty!,,xx~~r   c                     d                     | j        |                                           }t          | j        |          S )z=
        Floating-point negative:
            -value
        zfneg ({0} {1}))r2   r0   r3   r4   )rE   r7   s     r   fnegz_ConstOpMixin.fneg,  s9    
 %%di1C1C1E1EFF C000r   truncc                     dS )z@
        Truncating integer downcast to a smaller type.
        Nr   rE   rF   s     r   r   z_ConstOpMixin.trunc8  rO   r   zextc                     dS )z@
        Zero-extending integer upcast to a larger type
        Nr   r   s     r   r   z_ConstOpMixin.zext>  rO   r   sextc                     dS )zA
        Sign-extending integer upcast to a larger type.
        Nr   r   s     r   r   z_ConstOpMixin.sextD  rO   r   fptruncc                     dS )zA
        Floating-point downcast to a less precise type.
        Nr   r   s     r   r   z_ConstOpMixin.fptruncJ  rO   r   fpextc                     dS )z?
        Floating-point upcast to a more precise type.
        Nr   r   s     r   r   z_ConstOpMixin.fpextP  rO   r   bitcastc                     dS )z;
        Pointer cast to a different pointer type.
        Nr   r   s     r   r   z_ConstOpMixin.bitcastV  rO   r   fptouic                     dS )z=
        Convert floating-point to unsigned integer.
        Nr   r   s     r   r   z_ConstOpMixin.fptoui\  rO   r   uitofpc                     dS )z=
        Convert unsigned integer to floating-point.
        Nr   r   s     r   r   z_ConstOpMixin.uitofpb  rO   r   fptosic                     dS )z;
        Convert floating-point to signed integer.
        Nr   r   s     r   r   z_ConstOpMixin.fptosih  rO   r   sitofpc                     dS )z;
        Convert signed integer to floating-point.
        Nr   r   s     r   r   z_ConstOpMixin.sitofpn  rO   r   ptrtointc                     t          | j        t          j                  sd}t	          || j        fz            t          |t          j                  st	          d|d          dS )z*
        Cast pointer to integer.
        z2can only call ptrtoint() on pointer type, not '%s'z*can only ptrtoint() to integer type, not ''N)r   r0   r   PointerType	TypeErrorrz   rE   rF   msgs      r   r   z_ConstOpMixin.ptrtointt  su    
 $)U%677 	0FCC49,.///#u}-- 	&)"ss% & & &	& 	&r   inttoptrc                     t          | j        t          j                  sd}t	          || j        fz            t          |t          j                  st	          d|d          dS )z*
        Cast integer to pointer.
        z7can only call inttoptr() on integer constants, not '%s'z*can only inttoptr() to pointer type, not 'r   N)r   r0   r   rz   r   r   r   s      r   r   z_ConstOpMixin.inttoptr  su    
 $)U]33 	0KCC49,.///#u011 	&)"ss% & & &	& 	&r   c                    t          | j        t          j                  st	          d| j        d          | j        }|D ]}|                    |          }d |D             }d                    | j        j        | j        |                                 d	                    |                    }t          |                    | j                  |          S )z>
        Call getelementptr on this pointer constant.
        z/can only call gep() on pointer constants, not 'r   c                 h    g | ]/}d                      |j        |                                          0S ){0} {1}r2   r0   r3   )r   idxs     r   r   z%_ConstOpMixin.gep.<locals>.<listcomp>  sF     * * *  &&sx1B1B1D1DEE * * *r   z!getelementptr ({0}, {1} {2}, {3})r.   )r   r0   r   r   r   gepr2   pointeer3   r&   r4   
as_pointer	addrspace)rE   indicesouttyperv   
strindicesrG   s         r   r   z_ConstOpMixin.gep  s     $)U%677 	,)#yyy+ , , , ) 	% 	%Akk!nnGG* *!(* * *
 177Ity  $))J"7"79 9 !!3!3DN!C!CRHHHr   N)-__name__
__module____qualname____doc__rA   rK   rP   rR   rT   rV   rX   rZ   r\   r^   r`   rb   rd   rf   rh   rj   rn   rq   rr   r   r   r   r   r   r   r   r   rH   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rJ   rJ   T   s         VE]]  ] VF^^  ^ VF^^  ^ VE]]  ] VF^^  ^ VE]]  ] VF^^  ^ VE]]  ] VF^^  ^ VF^^  ^ VF^^  ^ VF^^  ^ VF^^  ^ VF^^  ^ VF^^  ^ VD\\  \ VE]]  ] VE]]  ]8 8 8*1 1 11 1 11 1 11 1 1
 
 
  1 1 1 WW  
 WV__  _
 WV__  _
 WY  
 WW  
 WY  
 WX  
 WX  
 WX  
 WX  
 WZ	& 	& 	& WZ	& 	& 	&I I I I Ir   rJ   c                       e Zd ZdZd ZdS )Valuez(
    The base class for all values.
    c                 2    d| j         j        d| j        dS )N<ir.z type='z' ...>)	__class__r   r0   rE   s    r   __repr__zValue.__repr__  s      *..*A*A*A4999NNr   N)r   r   r   r   r   r   r   r   r   r     s2         O O O O Or   r   c                       e Zd ZdZd ZdS )
_Undefinedz0
    'undef': a value for undefined values.
    c                 p    	 t           S # t          $ r" t                              t                    cY S w xY wN)	Undefined	NameErrorobject__new__r   )clss    r   r   z_Undefined.__new__  s@    	. 	. 	. 	.>>*-----	.s   	 )55N)r   r   r   r   r   r   r   r   r   r     s-         . . . . .r   r   c                   ~    e Zd ZdZd Zd Zd Zed             Zed             Z	e
d             Zd Zd	 Zd
 Zd ZdS )r   z 
    A constant LLVM value.
    c                     t          |t          j                  sJ t          |t          j                  rJ || _        |                    |          }|| _        d S r   )r   r   TypeVoidTyper0   wrap_constant_valueconstantrE   rF   r   s      r   __init__zConstant.__init__  sW    #uz*****c5>22222	**844 r   c                 \    d                     | j        |                                           S Nr   r   r   s    r   
_to_stringzConstant._to_string  &    	4+=+=+?+?@@@r   c                    | j         | j        j        }nr| j         t          u rd}nat	          | j         t
                    r(d                    t          | j                             }n| j                            | j                   }|S )Nundefzc"{0}")	r   r0   nullr   r   r"   r2   r)   format_constantrE   vals     r   _get_referencezConstant._get_reference  sx    = ).CC]i''CCy11 	;//."?"?@@CC )++DM::C
r   c                     d |D             }t          |          dk    rt          d          |d         }|D ]}||k    rt          d           | t          j        |t          |                    |          S )zO
        Construct a literal array constant made of the given members.
        c                     g | ]	}|j         
S r   r0   r   els     r   r   z*Constant.literal_array.<locals>.<listcomp>      '''2rw'''r   r   zneed at least one elementz$all elements must have the same type)lenr1   r   r   	ArrayType)r   elemstystyrN   s        r   literal_arrayzConstant.literal_array  s    
 (''''s88q==8999V 	H 	HEU{{ FGGG s5?2s5zz22E:::r   c                 V    d |D             } | t          j        |          |          S )zS
        Construct a literal structure constant made of the given members.
        c                     g | ]	}|j         
S r   r   r   s     r   r   z+Constant.literal_struct.<locals>.<listcomp>  r   r   )r   LiteralStructType)r   r   r   s      r   literal_structzConstant.literal_struct  s4    
 (''''s5*3//777r   c                 v    t          | j        t          j                  st	          d          | j        j        S )Nz)Only pointer constant have address spaces)r   r0   r   r   r   r   r   s    r   r   zConstant.addrspace  s4    $)U%677 	IGHHHy""r   c                 p    t          |t                    r t          |           t          |          k    S dS NF)r   r   r   rM   s     r   __eq__zConstant.__eq__  s0    eX&& 	t99E

**5r   c                 .    |                      |           S r   r   rM   s     r   __ne__zConstant.__ne__      ;;u%%%%r   c                 :    t          t          |                     S r   )hashr   r   s    r   __hash__zConstant.__hash__  s    CIIr   c                 (    d| j         d| j        dS )Nz<ir.Constant type='z' value=r   )r0   r   r   s    r   r   zConstant.__repr__  s     59YYYNNr   N)r   r   r   r   r   r   r   classmethodr   r   propertyr   r   r  r  r   r   r   r   r   r     s         ! ! !A A A   ; ; [; 8 8 [8 # # X#
  & & &  O O O O Or   r   c                   $    e Zd ZdZd Zd Zd ZdS )r4   zA
    A constant with an already formatted IR representation.
    c                 l    t          |t                    sJ t                              | ||           d S r   )r   r   r   r   r   s      r   r   zFormattedConstant.__init__  s6    (C((((($X.....r   c                     | j         S r   r   r   s    r   r   zFormattedConstant._to_string  
    }r   c                     | j         S r   r  r   s    r   r   z FormattedConstant._get_reference  r  r   N)r   r   r   r   r   r   r   r   r   r   r4   r4     sK         / / /      r   r4   c                   r    e Zd ZdZdZdZd Zd Zd Zd Z	d Z
 ee	e
          Zd	 Zd
 Zed             ZdS )
NamedValuez*
    The base class for named values.
    %Tc                     |J t          |t          j                  sJ || _        || _        |                     |           d S r   )r   r   r   parentr0   	_set_name)rE   r  r0   names       r   r   zNamedValue.__init__  sL    !!!$
+++++	tr   c                 0   g }t          | j        t          j                  s:|                    d                    |                                                      |                     |           d                    |          	                                S )Nz{0} = r   )
r   r0   r   r   appendr2   r3   descrr&   rstriprE   r(   s     r   r   zNamedValue._to_string   sr    $)U^44 	>JJxt'9'9';';<<===

3wws||""$$$r   c                     t           r   )NotImplementedErrorr  s     r   r  zNamedValue.descr'  s    !!r   c                     | j         S r   )_namer   s    r   	_get_namezNamedValue._get_name*  s
    zr   c                 `    | j         j                            || j                  }|| _        d S )N)deduplicate)r  scoperegisterdeduplicate_namer  rE   r  s     r   r  zNamedValue._set_name-  s6    { ))$6:6K * M M


r   c                     | j         }d|v sd|v r*|                    dd                              dd          }d                    | j        |          S )N\"\5c\22z{0}"{1}")r  replacer2   name_prefixr%  s     r   r   zNamedValue._get_reference4  sV    y4<<3$;;<<f--55c6BBD  !14888r   c                 B    d| j         j        d| j        d| j        dS )Nr    z
 of type 'z'>r   r   r  r0   r   s    r   r   zNamedValue.__repr__;  s,     N###TYYY			; 	;r   c                     | j         }t          |t          j                  r| j         j        }t          |t          j                  r|S t          d                    | j                             )NzNot a function: {0})r0   r   r   r   r   FunctionTyper   r2   )rE   r   s     r   function_typezNamedValue.function_type?  sb    Yb%+,, 	#"Bb%,-- 	EI188CCDDDr   N)r   r   r   r   r,  r$  r   r   r  r  r  r  r  r   r   r2  r   r   r   r  r    s          K  % % %" " "    
 8Iy))D9 9 9; ; ; E E XE E Er   r  c                   D     e Zd ZdZ fdZd Zd ZeZd Zd Z	d Z
 xZS )MetaDataStringz[
    A metadata string, i.e. a constant string used as a value in a metadata
    node.
    c                     t          t          |                               |t          j                    d           || _        d S )Nr   r  )superr4  r   r   MetaDataTypestring)rE   r  r9  r   s      r   r   zMetaDataString.__init__P  sH    nd##,,V-2-?-A-A24 	- 	6 	6 	6 r   c                 8    ||                                  dfz  }d S )N
)r3   r  s     r   r  zMetaDataString.descrV  s!    ""$$d++r   c                 P    d                     t          | j                            S )Nz!"{0}")r2   r)   r9  r   s    r   r   zMetaDataString._get_referenceY  s    ~dk::;;;r   c                 P    t          |t                    r| j        |j        k    S dS r   )r   r4  r9  rM   s     r   r   zMetaDataString.__eq__^  s(    e^,, 	;%,..5r   c                 .    |                      |           S r   r   rM   s     r   r  zMetaDataString.__ne__d  r  r   c                 *    t          | j                  S r   )r  r9  r   s    r   r  zMetaDataString.__hash__g  s    DK   r   )r   r   r   r   r   r  r   r   r   r  r  __classcell__r   s   @r   r4  r4  J  s         
    , , ,< < <  J  & & &! ! ! ! ! ! !r   r4  c                   "    e Zd ZdZd Z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                     t          |t                    sJ t          |j        t          j                  rJ t          j                    | _        || _        d S r   )r   r   r0   r   r8  wrapped_valuerE   values     r   r   zMetaDataArgument.__init__t  sQ    %'''''ej%*<=====&((	"r   c                 p    d                     | j        j        | j                                                  S r   )r2   rE  r0   r3   r   s    r   r   zMetaDataArgument._get_referencez  s7     2 7 $ 2 @ @ B BD D 	Dr   N)r   r   r   r   r   r   r   r   r   r   rC  rC  k  s@         # # #D D D
  JJJr   rC  c                       e Zd ZdZd Zd ZdS )NamedMetaDatazk
    A named metadata node.

    Do not instantiate directly, use Module.add_named_metadata() instead.
    c                 "    || _         g | _        d S r   )r  operands)rE   r  s     r   r   zNamedMetaData.__init__  s    r   c                 :    | j                             |           d S r   )rL  r  )rE   mds     r   rT   zNamedMetaData.add  s    R     r   N)r   r   r   r   r   rT   r   r   r   rJ  rJ    s<           ! ! ! ! !r   rJ  c                   D     e Zd ZdZdZ fdZd Zd Zd Zd Z	d Z
 x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                     t          t          |                               |t          j                    |           t          |          | _        |j                            |            d S Nr6  )	r7  rP  r   r   r8  tuplerL  metadatar  )rE   r  r   r  r   s       r   r   zMDValue.__init__  sf    gt%%f&+&8&:&:+/ 	& 	1 	1 	1 ft$$$$$r   c                    g }| j         D ]}t          |j        t          j                  rZt          |t
                    r|j        |                    d           S|                    |                                           {|                    d	                    |j        |                                                     d
                    |          }|d	                    |          dfz  }d S )Nr   r   r.   z
!{{ {0} }}r;  )rL  r   r0   r   r8  r   r   r  r3   r2   r&   )rE   r(   rL  rG   s       r   r  zMDValue.descr  s    - 	O 	OB"'5#566 Ob(++ 80COOF++++OOB$4$4$6$67777	 0 0":J:J:L:L M MNNNN99X&&##H--t44r   c                 :    | j         t          | j                  z   S r   r,  r   r  r   s    r   r   zMDValue._get_reference      #di..00r   c                 P    t          |t                    r| j        |j        k    S dS r   )r   rP  rL  rM   s     r   r   zMDValue.__eq__  s(    eW%% 	=EN225r   c                 .    |                      |           S r   r   rM   s     r   r  zMDValue.__ne__  r  r   c                 *    t          | j                  S r   )r  rL  r   s    r   r  zMDValue.__hash__  s    DM"""r   r   r   r   r   r,  r   r  r   r   r  r  r@  rA  s   @r   rP  rP    s         
 K% % % % %5 5 51 1 1  & & &# # # # # # #r   rP  c                       e Zd ZdZ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                     || _         d S r   )rG  rF  s     r   r   zDIToken.__init__  s    


r   N)r   r   r   r   r   r   r   r   r_  r_    s-             r   r_  c                   D     e Zd ZdZdZ fdZd Zd Zd Zd Z	d Z
 xZS )	DIValuez
    A debug information descriptor, containing key-value pairs.

    Do not instantiate directly, use Module.add_debug_info() instead.
    rQ  c                     t          t          |                               |t          j                    |           || _        || _        t          |          | _        |j	        
                    |            d S rS  )r7  rb  r   r   r8  is_distinctkindrT  rL  rU  r  )rE   r  rd  re  rL  r  r   s         r   r   zDIValue.__init__  su    gt%%f&+&8&:&:+/ 	& 	1 	1 	1 '	ht$$$$$r   c                 h   | j         r|dz  }g }| j        D ]\  }}|d}n|du rd}n|du rd}nt          |t                    r|j        }nt          |t
                    r#d                    t          |                    }nat          |t                    rt          |          }n<t          |t                    r|
                                }nt          d|          |                    d	                    ||                     d
                    |          }|d| j        d|dfz  }d S )N)z	distinct r   TtrueFfalsez"{}"z%invalid operand type for debug info: z{0}: {1}r.   rQ  (z)
)rd  rL  r   r_  rG  r   r2   r)   intr  r3   r   r  r&   re  )rE   r(   rL  keyrG  strvalues         r   r  zDIValue.descr  sX    	">!C- 	> 	>JC}!$!%"E7++ 
, ;E3'' ,!==)>)>??E3'' ,u::E:.. , ..00i#(5!+ , , ,OOJ--c8<<====99X&&TYXu55r   c                 :    | j         t          | j                  z   S r   rX  r   s    r   r   zDIValue._get_reference  rY  r   c                     t          |t                    r0| j        |j        k    o| j        |j        k    o| j        |j        k    S dS r   )r   rb  rd  re  rL  rM   s     r   r   zDIValue.__eq__  sP    eW%% 	#u'88 0	UZ'0/0 5r   c                 .    |                      |           S r   r   rM   s     r   r  zDIValue.__ne__  r  r   c                 D    t          | j        | j        | j        f          S r   )r  rd  re  rL  r   s    r   r  zDIValue.__hash__  s    T%ty$-@AAAr   r]  rA  s   @r   rb  rb    s         
 K% % % % %6 6 641 1 1  & & &B B B B B B Br   rb  c                   *     e Zd ZdZdZdZ fdZ xZS )GlobalValuez
    A global value.
    @Fc                      t          t          |           j        |i | d| _        d| _        d| _        i | _        d S Nr   )r7  rr  r   linkagestorage_classsectionrU  )rE   argskwargsr   s      r   r   zGlobalValue.__init__  sF    )k4  )4:6:::r   )r   r   r   r   r,  r$  r   r@  rA  s   @r   rr  rr    sO          K        r   rr  c                   *     e Zd ZdZd fd	Zd Z xZS )GlobalVariablez
    A global variable.
    r   c                 D   t          |t          j                  sJ t          t          |                               ||                    |          |           || _        d | _        d| _	        d| _
        || _        d | _        | j                            |            d S )Nr6  F)r   r   r   r7  r|  r   r   
value_typeinitializerunnamed_addrglobal_constantr   alignr  
add_global)rE   modulerF   r  r   r   s        r   r   zGlobalVariable.__init__  s    #uz*****nd##,,VS^^I5N5N26 	- 	8 	8 	8!$"
t$$$$$r   c                 ^   | j         rd}nd}| j        s| j        dnd}n| j        }|r|                    |dz              | j        r|                    | j        dz              | j        r|                    d           | j        dk    r-|                    d                    | j                             |                    d	                    || j        
                     | j        i| j        j	        | j        k    r$t          d| j        j	        d| j                  |                    d| j                                        z              nF|dvrB|                    d|                     t                                                    z              | j        r|                    d| j        d           | j        |                    d| j        fz             | j        r)|                    |                     d                     |                    d           d S )Nr   globalexternalr   r.  zunnamed_addr r   zaddrspace({0:d}) z{kind} {type})re  r0   zgot initializer of type z for global value type )r  extern_weakz, section "r(  z
, align %dT)leading_commar;  )r  rv  r  r  rw  r  r   r2   r~  r0   r   r3   r   rx  r  rU  _stringify_metadata)rE   r(   re  rv  s       r   r  zGlobalVariable.descr&  s8    	DDD| 	#$($4$<jj"GGlG 	&JJw}%%% 	1JJt)C/000 	(JJ'''>QJJ*11$.AABBB

?**4?*KKLLL'$77i#'#3#8#8#8$//!K L L L JJsT-;;===>>>>777JJsT__Y77EEGGGHHH< 	=JJJT\\\;<<<:!JJ|tzm3444= 	EJJt//d/CCDDD

4r   )r   )r   r   r   r   r   r  r@  rA  s   @r   r|  r|    sV         
% 
% 
% 
% 
% 
%* * * * * * *r   r|  c                   8     e Zd ZdZdZddZ fdZ fdZ xZS )AttributeSetzxA set of string attribute.
    Only accept items listed in *_known*.

    Properties:
    * Iterate in sorted order
    r   c                 j    t          |t                    r|g}|D ]}|                     |           d S r   )r   r   rT   )rE   ry  r  s      r   r   zAttributeSet.__init__\  sE    dC   	6D 	 	DHHTNNNN	 	r   c                     || j         vr#t          d                    ||                     t          t          |                               |          S )Nzunknown attr {!r} for {})_knownr1   r2   r7  r  rT   rE   r  r   s     r   rT   zAttributeSet.addb  sM    t{""7>>tTJJKKK\4((,,T222r   c                     t          t          t          t          |                                                               S r   )itersortedr7  r  __iter__)rE   r   s    r   r  zAttributeSet.__iter__g  s/    F5t44==??@@AAAr   r   )	r   r   r   r   r  r   rT   r  r@  rA  s   @r   r  r  S  s          F   3 3 3 3 3
B B B B B B B B Br   r  c                        e Zd Z eg d          Zd
 fd	Z fdZed             Zej	        d             Zed             Z
e
j	        d             Z
d	 Z xZS )FunctionAttributes)
argmemonlyalwaysinlinebuiltincoldinaccessiblememonlyinaccessiblemem_or_argmemonly
inlinehint	jumptableminsizenaked	nobuiltinnoduplicatenoimplicitfloatnoinlinenonlazybind	norecurse	noredzonenoreturnnounwindoptnoneoptsizereadnonereadonlyreturns_twicesanitize_addresssanitize_memorysanitize_threadsspsspreg	sspstronguwtabler   c                 t    d| _         d | _        t          t          |                               |           d S Nr   )_alignstack_personalityr7  r  r   rE   ry  r   s     r   r   zFunctionAttributes.__init__w  s8      $''0066666r   c                     |dk    rd| v s
|dk    rd| v rt          d          t                                          |           d S )Nr  r  z$Can't have alwaysinline and noinline)r1   r7  rT   r  s     r   rT   zFunctionAttributes.add|  sX    ^##
d(:(:##$(>(>CDDDDr   c                     | j         S r   r  r   s    r   
alignstackzFunctionAttributes.alignstack  s    r   c                 $    |dk    sJ || _         d S r  r  r   s     r   r  zFunctionAttributes.alignstack  s    axxxxr   c                     | j         S r   )r  r   s    r   personalityzFunctionAttributes.personality  s      r   c                 F    |t          |t                    sJ || _        d S r   )r   rr  r  r   s     r   r  zFunctionAttributes.personality  s'    {jk::{{{r   c                 V   t          |           }| j        r-|                    d                    | j                             | j        rK|                    d                    | j        j        | j                                                             d                    |          S )Nzalignstack({0:d})zpersonality {persty} {persfn})perstypersfnr.  )listr  r  r2   r  r0   r3   r&   rE   attrss     r   r   zFunctionAttributes.__repr__  s    T

? 	FLL,33DODDEEE 	:LL8??','5577 @ 9 9 : : : xxr   r  )r   r   r   	frozensetr  r   rT   r  r  setterr  r   r@  rA  s   @r   r  r  l  s        Y * * * + +F7 7 7 7 7 7
         X     ! ! X!            r   r  c                        e Zd ZdZ fdZed             Zed             Zed             ZddZ	ddZ
d	 Zd
 Zd Zd Zed             Z xZS )FunctionzRepresent a LLVM Function but does uses a Module as parent.
    Global Values are stored as a set of dependencies (attribute `depends`).
    c                     t          |t          j                  sJ t          t                                         ||                                |           | _        t          j	                     _
        g  _        t                       _        t           fd|j        D                        _        t!           |j                   _         j                                        d _        d S )Nr6  c                 0    g | ]}t          |          S r   )Argument)r   trE   s     r   r   z%Function.__init__.<locals>.<listcomp>  s3     0 0 0  $D!,, 0 0 0r   r   )r   r   r   r7  r  r   r   ftyper   	NameScoper"  blocksr  
attributesrT  ry  ReturnValuereturn_typereturn_valuer  r  calling_convention)rE   r  r  r  r   s   `   r   r   zFunction.__init__  s    %,,,,,h&&vu/?/?/A/A&MMM
%''
,.. 0 0 0 0$)J0 0 0 1 1	'e.?@@t$$$"$r   c                     | j         S r   r  r   s    r   r  zFunction.module  
    {r   c                     | j         d         S r  r  r   s    r   entry_basic_blockzFunction.entry_basic_block  s    {1~r   c                     | j         S r   r  r   s    r   basic_blockszFunction.basic_blocks  r  r   r   c                 \    t          | |          }| j                            |           |S )Nr  r  )Blockr  r  )rE   r  blks      r   append_basic_blockzFunction.append_basic_block  s/    4d+++3
r   c                 ^    t          | |          }| j                            ||           |S )zInsert block before
        r  )r  r  insert)rE   beforer  r  s       r   insert_basic_blockzFunction.insert_basic_block  s3     4d+++63'''
r   c           	         | j         rdnd}| j        }d                    d | j        D                       }|                                 }| j        }|rd                    |          nd}t          | j                  r| j        j	        rdnd}n| j        j	        rdnd}| j
        }| j        }	d	                    d
 |||	|fD                       }
|                                 }|rd                    |          nd}| j        rd                    | j                  nd}d}|                    |
||||||          }|                    |           dS )zB
        Describe the prototype ("head") of the function.
        definedeclarer.   c              3   4   K   | ]}t          |          V  d S r   r   )r   as     r   	<genexpr>z+Function.descr_prototype.<locals>.<genexpr>  s(      33AQ333333r   z {}r   z, ...z...r.  c              3   8   K   | ]}|t          |          V  d S r   r  )r   xs     r   r  z+Function.descr_prototype.<locals>.<genexpr>  s-      LLQ!L#a&&LLLLLLr   z section "{}"z:{prefix} {name}({args}{vararg}){attrs}{section}{metadata}
)r{   r  ry  varargr  rx  rU  N)r  r  r&   ry  r3   r  r2   anyr  var_argrv  r  r  rx  r  )rE   r(   stateretry  r  r  r  rv  cconvr{   rU  rx  pt_str	prototypes                  r   descr_prototypezFunction.descr_prototype  su    !K6Yyy3333333!!##',4U###"ty>> 	9 $
 2:WWFF"j08UUbF,'LL5'5#*FLLLLL++---5=5<<)))2:>,N/((666BNMMd)/ug+3 " 5 5	 	

9r   c                 D    | j         D ]}|                    |           dS )z7
        Describe of the body of the function.
        N)r  r  )rE   r(   r  s      r   
descr_bodyzFunction.descr_body  s0     ; 	 	CIIcNNNN	 	r   c                     |                      |           | j        rA|                    d           |                     |           |                    d           d S d S )Nz{
z}
)r  r  r  r  r  s     r   r  zFunction.descr  sf    S!!!; 	JJuOOC   JJu	 	r   c                 Z    g }|                      |           d                    |          S ru  )r  r&   r  s     r   __str__zFunction.__str__  s&    

3wws||r   c                 2    t          | j                  dk    S r  )r   r  r   s    r   is_declarationzFunction.is_declaration  s    4;1$$r   r   )r   r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r@  rA  s   @r   r  r    s        % % % % %   X   X   X   
     4      
 % % X% % % % %r   r  c                        e Zd Z eg d          Zd fd	Zed             Zej        d             Zed             Z	e	j        d             Z	ed             Z
e
j        d	             Z
d
 Z xZS )ArgumentAttributes)byvalinallocainregnestnoalias	nocapturenonnullreturnedsignextsretzeroextr   c                     d| _         d| _        d| _        t          t          |                               |           d S r  )_align_dereferenceable_dereferenceable_or_nullr7  r  r   r  s     r   r   zArgumentAttributes.__init__  s?     !()% $''0066666r   c                     | j         S r   )r  r   s    r   r  zArgumentAttributes.align  r  r   c                 N    t          |t                    r|dk    sJ || _        d S r  )r   rj  r  r   s     r   r  zArgumentAttributes.align  s)    #s##0qr   c                     | j         S r   )r  r   s    r   dereferenceablez"ArgumentAttributes.dereferenceable  s    $$r   c                 N    t          |t                    r|dk    sJ || _        d S r  )r   rj  r  r   s     r   r  z"ArgumentAttributes.dereferenceable  s,    #s##0q #r   c                     | j         S r   )r  r   s    r   dereferenceable_or_nullz*ArgumentAttributes.dereferenceable_or_null  s    ,,r   c                 N    t          |t                    r|dk    sJ || _        d S r  )r   rj  r  r   s     r   r  z*ArgumentAttributes.dereferenceable_or_null  s,    #s##0q(+%%%r   c                 `   t          |           }| j        r-|                    d                    | j                             | j        r-|                    d                    | j                             | j        r/d}|                    |                    | j                             |S )Nzalign {0:d}zdereferenceable({0:d})zdereferenceable_or_null({0:d}))r  r  r  r2   r  r  )rE   r  drefs      r   _to_listzArgumentAttributes._to_list"  s    t: 	;LL--dj99::: 	PLL1889MNNOOO' 	D3DLLT%ABBCCCr   r  )r   r   r   r  r  r   r  r  r  r  r  r   r@  rA  s   @r   r  r    s       Y + + + , ,F7 7 7 7 7 7   X \  \ % % X% $ $ $ - - X- #, , $#,	 	 	 	 	 	 	r   r  c                   ,     e Zd Zd fd	Zd Zd Z xZS )_BaseArgumentr   c                     t          |t          j                  sJ t          t          |                               |||           || _        t                      | _        d S rS  )	r   r   r   r7  r"  r   r  r  r  )rE   r  rF   r  r   s       r   r   z_BaseArgument.__init__/  sX    #uz*****mT""++FCd+CCC,..r   c                 B    d| j         j        d| j        d| j        dS )Nr   r.  z	 of type r   r/  r   s    r   r   z_BaseArgument.__repr__5  s-     *..*A*A*A4999*.)))5 	5r   c                 :    | j                             |           d S r   )r  rT   )rE   attrs     r   add_attributez_BaseArgument.add_attribute9  s    D!!!!!r   r  )r   r   r   r   r   r'  r@  rA  s   @r   r"  r"  .  s[        / / / / / /5 5 5" " " " " " "r   r"  c                       e Zd ZdZd ZdS )r  z3
    The specification of a function argument.
    c                    | j                                         }|rAd                    | j        d                    |          |                                           S d                    | j        |                                           S )Nz{0} {1} {2}r.  r   )r  r   r2   r0   r&   r3   r  s     r   r  zArgument.__str__B  s{    ((** 	E ''	388E??(,(:(:(<(<> > > ##DIt/A/A/C/CDDDr   Nr   r   r   r   r  r   r   r   r  r  =  s2         E E E E Er   r  c                       e Zd ZdZd ZdS )r  z9
    The specification of a function's return value.
    c                     | j                                         }|r.d                    d                    |          | j                  S t          | j                  S )Nr   r.  )r  r   r2   r&   r0   r   r  s     r   r  zReturnValue.__str__P  sM    ((** 	"##CHHUOOTY???ty>>!r   Nr*  r   r   r   r  r  K  s-         " " " " "r   r  c                   x     e Zd ZdZd
 fd	Zed             Zed             Zed             Zd Z	d Z
d	 Z x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                     t          t          |                               |t          j                    |           |j        | _        g | _        d | _        d S rS  )r7  r  r   r   	LabelTyper"  instructions
terminator)rE   r  r  r   s      r   r   zBlock.__init__a  sL    eT##FEO,=,=D#III\
r   c                     | j         d uS r   )r1  r   s    r   is_terminatedzBlock.is_terminatedg  s    d**r   c                     | j         S r   r  r   s    r   functionzBlock.functionk  r  r   c                     | j         j        S r   )r  r  r   s    r   r  zBlock.moduleo  s    {!!r   c                     |                     d                    |                                                      |d | j        D             z  }d S )Nz{0}:
c                 8    g | ]}d                      |          S )z  {0}
)r2   )r   instrs     r   r   zBlock.descr.<locals>.<listcomp>u  s&    GGGE	  ''GGGr   )r  r2   _format_namer0  r  s     r   r  zBlock.descrs  sL    

8??4#4#4#6#677888GGT5FGGGGr   c                 @   |j         |j         k    rt          d          | j                            |          }| j                            |           | j                            ||           | j        j        D ]"}|j        D ]}|                    ||           #dS )zReplace an instructionz$new instruction has a different typeN)	r0   r   r0  indexremover  r  r  replace_usage)rE   oldnewposbbr9  s         r   r+  zBlock.replacew  s    8sxBCCC%%c**  %%%  c***+* 	. 	.B . .##C----.	. 	.r   c                     | j         }t                              |          s?|                    dd                              dd          }d                    |          }|S )Nr'  r)  r(  r*  z"{0}")r  _SIMPLE_IDENTIFIER_REmatchr+  r2   r%  s     r   r:  zBlock._format_name  sZ     y$**400 	(<<f--55c6BBD>>$''Dr   r  )r   r   r   r   r   r  r3  r5  r  r  r+  r:  r@  rA  s   @r   r  r  X  s               + + X+   X " " X"H H H
. 
. 
.      r   r  c                   $    e Zd ZdZd Zd Zd ZdS )BlockAddressz'
    The address of a basic block.
    c                     t          |t                    sJ t          |t                    sJ t          j        d                                          | _        || _        || _        d S )N   )	r   r  r  r   rz   r   r0   r5  basic_block)rE   r5  rJ  s      r   r   zBlockAddress.__init__  s`    (H-----+u-----M!$$//11	 &r   c                 \    d                     | j        |                                           S r   r   r   s    r   r  zBlockAddress.__str__  r   r   c                     d                     | j                                        | j                                                  S )Nzblockaddress({0}, {1}))r2   r5  r3   rJ  r   s    r   r3   zBlockAddress.get_reference  s=    '..M''))**,,. . 	.r   N)r   r   r   r   r   r  r3   r   r   r   rG  rG    sN         ' ' 'A A A. . . . .r   rG  )2r   r;   r9  rellvmlite.irr   r   r   llvmlite.ir._utilsr   r   r   r  mapordascii_lettersdigitsr$   compilerD  rx   r)   rA   rH   r   rJ   r   r   r   r   r4   r  r4  rC  rJ  rP  r_  rb  rr  r|  setr  r  r  r  r"  r  r  r  rG  r   r   r   <module>rV     s   
      				 - - - - - - - - - -. . . . . . . . . . 	##c6#78899	##c6=11223	##c#EFFGGH #
#CDD  
	



  !    (  "   JI JI JI JI JIF JI JI JIZ
O O O O OF O O O. . . . . . . . JLL	GO GO GO GO GO{3]E GO GO GOT        5E 5E 5E 5E 5E5u 5E 5E 5Ep! ! ! ! !Z ! ! !B         {$;U      .! ! ! ! !F ! ! !)# )# )# )# )#j )# )# )#X	 	 	 	 	 	 	 	:B :B :B :B :Bj :B :B :Bz    *m\   ; ; ; ; ;[ ; ; ;|B B B B B3 B B B21 1 1 1 1 1 1 1hY% Y% Y% Y% Y%{ Y% Y% Y%x/ / / / / / / /d" " " " "J " " "E E E E E} E E E
" 
" 
" 
" 
"- 
" 
" 
"3 3 3 3 3J 3 3 3l. . . . .5 . . . . .r   