
    I/Ph                        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                            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 d0 d1e*          Z+ G d2 d3e'          Z, G d4 d5e*          Z- G d6 d7e           Z. G d8 d9e.          Z/ G d: d;e.          Z0 G d< d=e           Z1 G d> d?e          Z2dS )@z_
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                 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     R/var/www/html/test/jupyter/venv/lib/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fnr:   r9   s     r   wrapz_binop.<locals>.wrap4   s8    				4 	4 	4 	4 
		4 r   r   r9   r@   s   ` r   _binoprB   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}))r1   r3   r4   r5   )selftypopr?   r9   s      r   r:   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   rA   s   ` r   _castoprI   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   rF   others     r   rL   z_ConstOpMixin.shl]         r   lshrc                     dS )zP
        Logical (unsigned) right integer shift:
            lhs >> rhs
        Nr   rN   s     r   rQ   z_ConstOpMixin.lshrd   rP   r   ashrc                     dS )zQ
        Arithmetic (signed) right integer shift:
            lhs >> rhs
        Nr   rN   s     r   rS   z_ConstOpMixin.ashrk   rP   r   addc                     dS )z9
        Integer addition:
            lhs + rhs
        Nr   rN   s     r   rU   z_ConstOpMixin.addr   rP   r   faddc                     dS )z@
        Floating-point addition:
            lhs + rhs
        Nr   rN   s     r   rW   z_ConstOpMixin.faddy   rP   r   subc                     dS )z<
        Integer subtraction:
            lhs - rhs
        Nr   rN   s     r   rY   z_ConstOpMixin.sub   rP   r   fsubc                     dS )zC
        Floating-point subtraction:
            lhs - rhs
        Nr   rN   s     r   r[   z_ConstOpMixin.fsub   rP   r   mulc                     dS )z?
        Integer multiplication:
            lhs * rhs
        Nr   rN   s     r   r]   z_ConstOpMixin.mul   rP   r   fmulc                     dS )zF
        Floating-point multiplication:
            lhs * rhs
        Nr   rN   s     r   r_   z_ConstOpMixin.fmul   rP   r   udivc                     dS )zB
        Unsigned integer division:
            lhs / rhs
        Nr   rN   s     r   ra   z_ConstOpMixin.udiv   rP   r   sdivc                     dS )z@
        Signed integer division:
            lhs / rhs
        Nr   rN   s     r   rc   z_ConstOpMixin.sdiv   rP   r   fdivc                     dS )z@
        Floating-point division:
            lhs / rhs
        Nr   rN   s     r   re   z_ConstOpMixin.fdiv   rP   r   uremc                     dS )zC
        Unsigned integer remainder:
            lhs % rhs
        Nr   rN   s     r   rg   z_ConstOpMixin.urem   rP   r   sremc                     dS )zA
        Signed integer remainder:
            lhs % rhs
        Nr   rN   s     r   ri   z_ConstOpMixin.srem   rP   r   fremc                     dS )zA
        Floating-point remainder:
            lhs % rhs
        Nr   rN   s     r   rk   z_ConstOpMixin.frem   rP   r   orc                     dS )z;
        Bitwise integer OR:
            lhs | rhs
        Nr   rN   s     r   or_z_ConstOpMixin.or_   rP   r   andc                     dS )z<
        Bitwise integer AND:
            lhs & rhs
        Nr   rN   s     r   and_z_ConstOpMixin.and_   rP   r   xorc                     dS )z<
        Bitwise integer XOR:
            lhs ^ rhs
        Nr   rN   s     r   rs   z_ConstOpMixin.xor   rP   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/   r0   z{0} {1} ({2} {3}, {4} {5})   )	_CMP_MAPKeyErrorr2   r1   r3   r4   r5   r   IntType)rF   prefixsigncmpoprO   insrH   r8   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 '==', '!=', '<', '<=', '>', '>='
        rw   sr   rF   r~   rO   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 '==', '!=', '<', '<=', '>', '>='
        rw   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   r1   r   
VectorTyper   Constantcountrs   )rF   r7   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   r1   rY   )rF   zeros     r   negz_ConstOpMixin.neg$  s'    
 ty!,,xx~~r   c                     d                     | j        |                                           }t          | j        |          S )z=
        Floating-point negative:
            -value
        zfneg ({0} {1}))r3   r1   r4   r5   )rF   r8   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   rF   rG   s     r   r   z_ConstOpMixin.trunc8  rP   r   zextc                     dS )z@
        Zero-extending integer upcast to a larger type
        Nr   r   s     r   r   z_ConstOpMixin.zext>  rP   r   sextc                     dS )zA
        Sign-extending integer upcast to a larger type.
        Nr   r   s     r   r   z_ConstOpMixin.sextD  rP   r   fptruncc                     dS )zA
        Floating-point downcast to a less precise type.
        Nr   r   s     r   r   z_ConstOpMixin.fptruncJ  rP   r   fpextc                     dS )z?
        Floating-point upcast to a more precise type.
        Nr   r   s     r   r   z_ConstOpMixin.fpextP  rP   r   bitcastc                     dS )z;
        Pointer cast to a different pointer type.
        Nr   r   s     r   r   z_ConstOpMixin.bitcastV  rP   r   fptouic                     dS )z=
        Convert floating-point to unsigned integer.
        Nr   r   s     r   r   z_ConstOpMixin.fptoui\  rP   r   uitofpc                     dS )z=
        Convert unsigned integer to floating-point.
        Nr   r   s     r   r   z_ConstOpMixin.uitofpb  rP   r   fptosic                     dS )z;
        Convert floating-point to signed integer.
        Nr   r   s     r   r   z_ConstOpMixin.fptosih  rP   r   sitofpc                     dS )z;
        Convert signed integer to floating-point.
        Nr   r   s     r   r   z_ConstOpMixin.sitofpn  rP   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   r1   r   PointerType	TypeErrorr{   rF   rG   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   r1   r   r{   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}r3   r1   r4   )r   idxs     r   r   z%_ConstOpMixin.gep.<locals>.<listcomp>  sF     * * *  &&sx1B1B1D1DEE * * *r   z!getelementptr ({0}, {1} {2}, {3})r/   )r   r1   r   r   r   gepr3   pointeer4   r'   r5   
as_pointer	addrspace)rF   indicesouttyperw   
strindicesrH   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__rB   rL   rQ   rS   rU   rW   rY   r[   r]   r_   ra   rc   re   rg   ri   rk   ro   rr   rs   r   r   r   r   r   r   r   r   rI   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rK   rK   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   rK   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   r1   rF   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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VoidTyper1   wrap_constant_valueconstantrF   rG   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   r1   nullr   r   r#   r3   r*   format_constantrF   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   r1   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)lenr2   r   r   	ArrayType)r   elemstystyrO   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   Fc                 X    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   packedr   s       r   literal_structzConstant.literal_struct  s6    
 (''''s5*377???r   c                 v    t          | j        t          j                  st	          d          | j        j        S )Nz)Only pointer constant have address spaces)r   r1   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    rN   s     r   __eq__zConstant.__eq__  s0    eX&& 	t99E

**5r   c                 .    |                      |           S r   r   rN   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   )r1   r   r   s    r   r   zConstant.__repr__  s     59YYYNNr   N)F)r   r   r   r   r   r   r   classmethodr   r   propertyr   r   r  r  r   r   r   r   r   r     s         ! ! !A A A   ; ; [; @ @ @ [@ # # X#
  & & &  O O O O Or   r   c                   $    e Zd ZdZd Zd Zd ZdS )r5   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   r5   r5     sK         / / /      r   r5   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   parentr1   	_set_name)rF   r  r1   names       r   r   zNamedValue.__init__  sL    !!!$
+++++	tr   c                 0   g }t          | j        t          j                  s:|                    d                    |                                                      |                     |           d                    |          	                                S )Nz{0} = r   )
r   r1   r   r   appendr3   r4   descrr'   rstriprF   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   rF   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  replacer3   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  r1   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})r1   r   r   r   r   FunctionTyper   r3   )rF   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   r4  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  )superr6  r   r   MetaDataTypestring)rF   r  r;  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
)r4   r  s     r   r  zMetaDataString.descrV  s!    ""$$d++r   c                 P    d                     t          | j                            S )Nz!"{0}")r3   r*   r;  r   s    r   r   zMetaDataString._get_referenceY  s    ~dk::;;;r   c                 P    t          |t                    r| j        |j        k    S dS r   )r   r6  r;  rN   s     r   r   zMetaDataString.__eq__^  s(    e^,, 	;%,..5r   c                 .    |                      |           S r   r  rN   s     r   r  zMetaDataString.__ne__d  r  r   c                 *    t          | j                  S r   )r  r;  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   r6  r6  J  s         
    , , ,< < <  J  & & &! ! ! ! ! ! !r   r6  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   r1   r   r:  wrapped_valuerF   values     r   r   zMetaDataArgument.__init__t  sQ    %'''''ej%*<=====&((	"r   c                 p    d                     | j        j        | j                                                  S r   )r3   rG  r1   r4   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   rE  rE  k  s@         # # #D D D
  JJJr   rE  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)rF   r  s     r   r   zNamedMetaData.__init__  s    r   c                 :    | j                             |           d S r   )rN  r  )rF   mds     r   rU   zNamedMetaData.add  s    R     r   N)r   r   r   r   r   rU   r   r   r   rL  rL    s<           ! ! ! ! !r   rL  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 Nr8  )	r9  rR  r   r   r:  tuplerN  metadatar  )rF   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=  )rN  r   r1   r   r:  r   r   r  r4   r3   r'   )rF   r)   rN  rH   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   rR  rN  rN   s     r   r   zMDValue.__eq__  s(    eW%% 	=EN225r   c                 .    |                      |           S r   r  rN   s     r   r  zMDValue.__ne__  r  r   c                 *    t          | j                  S r   )r  rN  r   s    r   r  zMDValue.__hash__  s    DM"""r   r   r   r   r   r.  r   r  r   r   r  r  rB  rC  s   @r   rR  rR    s         
 K% % % % %5 5 51 1 1  & & &# # # # # # #r   rR  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   )rI  rH  s     r   r   zDIToken.__init__  s    


r   N)r   r   r   r   r   r   r   r   ra  ra    s-             r   ra  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.
    rS  c                     t          t          |                               |t          j                    |           || _        || _        t          |          | _        |j	        
                    |            d S rU  )r9  rd  r   r   r:  is_distinctkindrV  rN  rW  r  )rF   r  rf  rg  rN  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/   rS  (z)
)rf  rN  r   ra  rI  r    r3   r*   intr  r4   r   r  r'   rg  )rF   r)   rN  keyrI  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   rZ  r   s    r   r   zDIValue._get_reference  r[  r   c                     t          |t                    r0| j        |j        k    o| j        |j        k    o| j        |j        k    S dS r   )r   rd  rf  rg  rN  rN   s     r   r   zDIValue.__eq__  sP    eW%% 	#u'88 0	UZ'0/0 5r   c                 .    |                      |           S r   r  rN   s     r   r  zDIValue.__ne__  r  r   c                 D    t          | j        | j        | j        f          S r   )r  rf  rg  rN  r   s    r   r  zDIValue.__hash__  s    T%ty$-@AAAr   r_  rC  s   @r   rd  rd    s         
 K% % % % %6 6 641 1 1  & & &B B B B B B Br   rd  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   )r9  rt  r   linkagestorage_classsectionrW  )rF   argskwargsr   s      r   r   zGlobalValue.__init__  sF    )k4  )4:6:::r   )r   r   r   r   r.  r&  r   rB  rC  s   @r   rt  rt    sO          K        r   rt  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 )Nr8  F)r   r   r   r9  r~  r   r   
value_typeinitializerunnamed_addrglobal_constantr   alignr  
add_global)rF   modulerG   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   r0  zunnamed_addr r   zaddrspace({0:d}) z{kind} {type})rg  r1   zgot initializer of type z for global value type )r  extern_weakz, section "r*  z
, align %dT)leading_commar=  )r  rx  r  r  ry  r  r   r3   r  r1   r   r4   r   rz  r  rW  _stringify_metadata)rF   r)   rg  rx  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  rB  rC  s   @r   r~  r~    sV         
% 
% 
% 
% 
% 
%* * * * * * *r   r~  c                   >     e Zd ZdZdZd fd	Zd Z fdZd Z xZ	S )AttributeSetzxA set of string attribute.
    Only accept items listed in *_known*.

    Properties:
    * Iterate in sorted order
    r   c                     t                                                       t          |t                    r|g}|D ]}|                     |           d S r   )r9  r   r   r    rU   )rF   r{  r  r   s      r   r   zAttributeSet.__init__\  s\    dC   	6D 	 	DHHTNNNN	 	r   c                     |S r   r   )rF   r  rG   s      r   _expandzAttributeSet._expandc  s    r   c                     || j         vr#t          d                    ||                     t          t          |                               |          S )Nzunknown attr {!r} for {})_knownr2   r3   r9  r  rU   rF   r  r   s     r   rU   zAttributeSet.addf  sM    t{""7>>tTJJKKK\4((,,T222r   c                 >      fdt                     D             S )Nc                 <    g | ]}                     |          S r   )r  )r   rw   rF   rG   s     r   r   z)AttributeSet._to_list.<locals>.<listcomp>l  s'    ;;;Q$$;;;r   )sortedr   s   ``r   _to_listzAttributeSet._to_listk  s'    ;;;;;fTll;;;;r   r   )
r   r   r   r   r  r   r  rU   r  rB  rC  s   @r   r  r  S  s          F       3 3 3 3 3
< < < < < < <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
 fd	Z xZS )FunctionAttributes) 
argmemonlyalwaysinlinebuiltincold
convergent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_personalityr9  r  r   rF   r{  r   s     r   r   zFunctionAttributes.__init__z  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)r2   r9  rU   r  s     r   rU   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   rt  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                                                             |S )Nzalignstack({0:d})zpersonality {persty} {persfn})perstypersfn)r9  r  r  r  r3   r  r1   r4   )rF   ret_typeattrsr   s      r   r  zFunctionAttributes._to_list  s      **? 	FLL,33DODDEEE 	:LL8??','5577 @ 9 9 : : : r   r  )r   r   r   	frozensetr  r   rU   r
  r  setterr  r  rB  rC  s   @r   r  r  o  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 )Nr8  c                 0    g | ]}t          |          S r   )Argument)r   trF   s     r   r   z%Function.__init__.<locals>.<listcomp>  s3     0 0 0  $D!,, 0 0 0r   r   )r   r   r   r9  r  r   r   ftyper   	NameScoper$  blocksr  
attributesrV  r{  ReturnValuereturn_typereturn_valuer  r  calling_convention)rF   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  )rF   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)rF   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d                    | j                            | j        j                            z   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   r0  r   z, ...z...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 {}z section "{}"z:{prefix} {name}({args}{vararg}){attrs}{section}{metadata}
)r|   r  r{  varargr  rz  rW  N)r  r  r'   r{  r4   r  r  r  r  anyvar_argrx  r  r  r3   rz  r  )rF   r)   stateretr{  r  r  r  rx  cconvr|   rW  rz  pt_str	prototypes                  r   descr_prototypezFunction.descr_prototype  s    !K6Yyy3333333!!##(,@chht77J" $  $ % % % %=? 	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  )rF   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 rw  )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  rB  rC  s   @r   r  r    s        % % % % %   X   X   X   
     4      
 % % X% % % % %r   r  c                   Z    e Zd Z ei 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ddddddd          Zd fd	Zd Zed             Zej	        d             Zed             Z
e
j	        d             Z
ed             Zej	        d             Z fdZ xZS ) ArgumentAttributesbyrefTbyvalelementtypeimmargFinallocainregnestnoalias	nocapturenofreenonnullnoundefpreallocatedreturnedsignextsret
swiftasync)
swifterror	swiftselfzeroextr   c                     d| _         d| _        d| _        t          t          |                               |           d S r  )_align_dereferenceable_dereferenceable_or_nullr9  r
  r   r  s     r   r   zArgumentAttributes.__init__  s?     !()% $''0066666r   c                 X    | j                             |          }|r| d|j         dS |S )Nrk  r0   )r  getr   )rF   r  rG   requires_types       r   r  zArgumentAttributes._expand!  s;    -- 	++S[++++Kr   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   rl  r   r   s     r   r  zArgumentAttributes.align,  s)    #s##0qr   c                     | j         S r   )r!  r   s    r   dereferenceablez"ArgumentAttributes.dereferenceable1  s    $$r   c                 N    t          |t                    r|dk    sJ || _        d S r  )r   rl  r!  r   s     r   r)  z"ArgumentAttributes.dereferenceable5  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   rl  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}))r9  r  r  r  r3   r)  r,  )rF   rG   r  drefr   s       r   r  zArgumentAttributes._to_listC  s      %%: 	;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  rB  rC  s   @r   r
  r
    s          	 		
 	t 	% 	D 	 	 	5 	U 	% 	5 	5 	  	E!" 	5#$ 	%& 	e'( -    F2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 rU  )	r   r   r   r9  r1  r   r  r
  r  )rF   r  rG   r  r   s       r   r   z_BaseArgument.__init__P  sX    #uz*****mT""++FCd+CCC,..r   c                 B    d| j         j        d| j        d| j        dS )Nr   r0  z	 of type r   r1  r   s    r   r   z_BaseArgument.__repr__V  s-     *..*A*A*A4999*.)))5 	5r   c                 :    | j                             |           d S r   )r  rU   )rF   attrs     r   add_attributez_BaseArgument.add_attributeZ  s    D!!!!!r   r  )r   r   r   r   r   r6  rB  rC  s   @r   r1  r1  O  s[        / / / / / /5 5 5" " " " " " "r   r1  c                       e Zd ZdZd ZdS )r  z3
    The specification of a function argument.
    c                     | j                             | j                  }|rAd                    | j        d                    |          |                                           S d                    | j        |                                           S )Nz{0} {1} {2}r0  r   )r  r  r1   r3   r'   r4   rF   r  s     r   r  zArgument.__str__c  s    ((33 	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                             | j                  }|r.d                    d                    |          | j                  S t          | j                  S )Nr   r0  )r  r  r1   r3   r'   r    r9  s     r   r  zReturnValue.__str__q  sQ    ((33 	"##CHHUOOTY???ty>>!r   Nr:  r   r   r   r  r  l  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 rU  )r9  r  r   r   	LabelTyper$  instructions
terminator)rF   r  r  r   s      r   r   zBlock.__init__  sL    eT##FEO,=,=D#III\
r   c                     | j         d uS r   )rA  r   s    r   is_terminatedzBlock.is_terminated  s    d**r   c                     | j         S r   r  r   s    r   functionzBlock.function  r  r   c                     | j         j        S r   )r  r  r   s    r   r  zBlock.module  s    {!!r   c                     |                     d                    |                                                      |d | j        D             z  }d S )Nz{0}:
c                 8    g | ]}d                      |          S )z  {0}
)r3   )r   instrs     r   r   zBlock.descr.<locals>.<listcomp>  s&    GGGE	  ''GGGr   )r  r3   _format_namer@  r  s     r   r  zBlock.descr  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)	r1   r   r@  indexremover  r  r  replace_usage)rF   oldnewposbbrI  s         r   r-  zBlock.replace  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-  r3   r'  s     r   rJ  zBlock._format_name  sZ     y$**400 	(<<f--55c6BBD>>$''Dr   r  )r   r   r   r   r   r
  rC  rE  r  r  r-  rJ  rB  rC  s   @r   r  r  y  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   r{   r   r1   rE  basic_block)rF   rE  rZ  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}))r3   rE  r4   rZ  r   s    r   r4   zBlockAddress.get_reference  s=    '..M''))**,,. . 	.r   N)r   r   r   r   r   r  r4   r   r   r   rW  rW    sN         ' ' 'A A A. . . . .r   rW  )3r   r<   r;  rer   r   llvmlite.irr   r   llvmlite.ir._utilsr   r   r	   r  mapordascii_lettersdigitsr%   compilerT  ry   r*   rB   rI   r   rK   r   r   r   r   r5   r  r6  rE  rL  rR  ra  rd  rt  r~  setr  r  r  r
  r1  r  r  r  rW  r   r   r   <module>rf     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\   ; ; ; ; ;[ ; ; ;|< < < < <3 < < <81 1 1 1 1 1 1 1hY% Y% Y% Y% Y%{ Y% Y% Y%xM M M M M M M M`" " " " "J " " "E E E E E} E E E
" 
" 
" 
" 
"- 
" 
" 
"3 3 3 3 3J 3 3 3l. . . . .5 . . . . .r   