
    sKgr#                     :    d dl Z d dlmZmZmZmZ  G d de      Zy)    N)contextvaluestypes_utilsc                       e Zd Zdej                  fdZd Zd Zd ZddZ	ddZ
d	 Zed
        Zed        Zd Zd ZddZddZd Zd Zd Zd Zd Zd Zy)Module c                     || _         || _        d| _        t        j                         | _        d| _        t        j                         | _	        g | _
        i | _        i | _        y )Nr	   zunknown-unknown-unknown)r   namedata_layoutr   	NameScopescopetriplecollectionsOrderedDictglobalsmetadatanamedmetadata_metadatacache)selfr   r   s      V/home/alanp/www/video.onchill/myenv/lib/python3.12/site-packages/llvmlite/ir/module.py__init__zModule.__init__   sV    	%%'
/"..0     c                    g }|D ]~  }| t        j                         d       }nNt        |t              rt	        j
                  | |      }n't        |t        t        f      r| j                  |      }|j                  |        |S N)
r   MetaDataType
isinstancestrr   MetaDataStringlisttupleadd_metadataappend)r   operands	fixed_opsops       r   _fix_metadata_operandszModule._fix_metadata_operands   s{    	Bz)U'')$/B$**44Bu.&&r*R   r   c                     g }|D ]?  \  }}t        |t        t        f      r| j                  |      }|j	                  ||f       A |S r   )r   r    r!   r"   r#   )r   r$   r%   r   r&   s        r   _fix_di_operandszModule._fix_di_operands$   sM    	 HD""tUm,&&r*dBZ(	 !
 r   c                 N   t        |t        t        f      st        d|      | j	                  |      }t        |      }|| j
                  vrGt        | j                        }t        j                  | |t        |            }|| j
                  |<   |S | j
                  |   }|S )z
        Add an unnamed metadata to the module with the given *operands*
        (a sequence of values) or return a previous equivalent metadata.
        A MDValue instance is returned, it can then be associated to
        e.g. an instruction.
        z1expected a list or tuple of metadata values, got r   )r   r    r!   	TypeErrorr'   r   lenr   r   MDValuer   )r   r$   keynmds        r   r"   zModule.add_metadata-   s     (T5M2(03 4 4..x8Hod)))DMM"AhSV<B')D$ 	 $$S)B	r   c           	      >   t        t        | j                  |j                                           }|||f}|| j                  vrIt        | j                        }t        j                  | |||t        |            }|| j                  |<   |S | j                  |   }|S )ak  
        Add debug information metadata to the module with the given
        *operands* (a dict of values with string keys) or return
        a previous equivalent metadata.  *kind* is a string of the
        debug information kind (e.g. "DICompileUnit").

        A DIValue instance is returned, it can then be associated to e.g.
        an instruction.
        r+   )
r!   sortedr)   itemsr   r-   r   r   DIValuer   )r   kindr$   is_distinctr/   r0   dis          r   add_debug_infozModule.add_debug_infoA   s      5 5hnn6F GHIX{+d)))DMM"Ak4AOB')D$ 	 $$S)B	r   Nc                 j   || j                   v r| j                   |   }n$t        j                  |       x}| j                   |<   |nt        |t        j                        s| j                  |      }t        |j                  t        j                        st        d|      |j                  |       |S )a  
        Add a named metadata node to the module, if it doesn't exist,
        or return the existing node.
        If *element* is given, it will append a new element to
        the named metadata node.  If *element* is a sequence of values
        (rather than a metadata value), a new unnamed node will first be
        created.

        Example::
            module.add_named_metadata("llvm.ident", ["llvmlite/1.0"])
        z%wrong type for metadata element: got )r   r   NamedMetaDatar   Valuer"   typer   r   r,   add)r   r   elementnmds       r   add_named_metadatazModule.add_named_metadataU   s     4%%%$$T*C-3-A-A$-GGC$$$T*gv||4++G4gllE,>,>?#*!- . .GGG
r   c                      | j                   |   S )z
        Return the metadata node with the given *name*.  KeyError is raised
        if no such node exists (contrast with add_named_metadata()).
        )r   r   r   s     r   get_named_metadatazModule.get_named_metadatan   s    
 !!$''r   c                     | j                   j                         D cg c]  }t        |t        j                        r|  c}S c c}w )zI
        A list of functions declared or defined in this module.
        )r   r   r   Function)r   vs     r   	functionszModule.functionsu   sD    
  <<..0 30aa1 0 3 	3 3s   #Ac                 6    | j                   j                         S )z>
        An iterable of global values in this module.
        )r   r   r   s    r   global_valueszModule.global_values}   s    
 ||""$$r   c                      | j                   |   S )z-
        Get a global value by name.
        )r   rC   s     r   
get_globalzModule.get_global   s     ||D!!r   c                 j    |j                   | j                  vsJ || j                  |j                   <   y)z)
        Add a new global value.
        N)r   r   )r   globalvalues     r   
add_globalzModule.add_global   s0     t||333)4[%%&r   c                 8    | j                   j                  |      S )zJ
        Get a unique global name with the following *name* hint.
        )r   deduplicaterC   s     r   get_unique_namezModule.get_unique_name   s     zz%%d++r   c                    fd}dv rd   j                   g}nD cg c]  }|j                    }}dj                  g|z         }|| j                  v r| j                  |   S |nrt              dk(  rCdk(  r>t	        j
                  t	        j                         t	        j                  d      g      }n!t              dk(  rډdk(  r3t	        j
                  d   d   t	        j                  d      g      }nۉd	k(  rt	        j
                  d   d
z        }ndk(  r/t	        j
                  d   t	        j                  d      g      }ndk(  r+t	        j
                  t	        j                  d            }nTt	        j
                  d         }n9t              d
k(  rdk(  r[d   t	        j                  d      d   t	        j                  d      gt	        j
                  t	        j                               }nˉdv r4d   t	        j                  d      gt	        j
                  d         }n |        nt              dk(  rvdv rBt	        j                  d      gz   t	        j
                  t	        j                               }n7dk(  r#d   gdz  t	        j
                  d         }n |        n |        t        j                  | ||      S c c}w )Nc                  6    t        d t              fz        )Nz"unknown intrinsic %r with %d types)NotImplementedErrorr-   )	intrinsictyss   r   _errorz(Module.declare_intrinsic.<locals>._error   s$    %&J)2CH(='> ? ?r   >   llvm.fma	llvm.ctlz	llvm.cttzr   .zllvm.assume   z	llvm.powi    zllvm.pow   zllvm.convert.from.fp16   zllvm.convert.to.fp16zllvm.memset   >   r[   r\      )zllvm.memcpyzllvm.memmoverZ   r+   )
intrinsic_namejoinr   r-   r   FunctionTypeVoidTypeIntTyper   rF   )r   rW   rX   fntyrY   suffixestr   s    ``     r   declare_intrinsiczModule.declare_intrinsic   s   	? >>A--.H256#Q((#H6xxh./4<<<<%%X]yM9%%enn&6q9I8JKDX]K'))#a&3q65==;L2MNj())#a&#':66))#a&5==3D2EF44))%--*;SA))#a&#6X]M)1vu}}Q/Q}}Q')))%..*:C@881vu}}Q/0))#a&#6X];;U]]1-..))%..*:C@j(1vhl))#a&#6HtT55W 7s   K7c                 .    | j                   j                  S r   )r   identified_typesrJ   s    r   get_identified_typeszModule.get_identified_types   s    ||,,,r   c                     | j                         j                         D cg c]  }|j                          }}|| j                  j                         D cg c]  }t	        |       c}z  }|S c c}w c c}w r   )ro   r   get_declarationr   r   )r   itlinesrG   s       r   _get_body_lineszModule._get_body_lines   s      446==?A?R ##%? 	 A 	$,,"5"5"78"7Q#a&"788	A 9s   A0A5c           
      (   g }| j                   j                         D ]G  \  }}|j                  dj                  |dj	                  d |j
                  D                           I | j                  D ]  }|j                  t        |              |S )Nz!{name} = !{{ {operands} }}z, c              3   <   K   | ]  }|j                           y wr   )get_reference).0is     r   	<genexpr>z-Module._get_metadata_lines.<locals>.<genexpr>   s       +@4>q ,-??+<4>s   )r   r$   )r   r4   r#   formatre   r$   r   r   )r   mdbufkrG   r1   s        r   _get_metadata_lineszModule._get_metadata_lines   s    &&,,.DAqLL6== +@45JJ+@ "@ > A B / --BLLR!  r   c                 @    dj                  | j                               S N
)re   rt   rJ   s    r   _stringify_bodyzModule._stringify_body   s    yy--/00r   c                 @    dj                  | j                               S r   )re   r~   rJ   s    r   _stringify_metadatazModule._stringify_metadata   s    yy11344r   c                     g }|d| j                   dd| j                  dd| j                  ddgz  }|| j                         z  }|| j	                         z  }dj                  |      S )Nz; ModuleID = ""ztarget triple = "ztarget datalayout = "r	   r   )r   r   r   rt   r~   re   )r   rs   s     r   __repr__zModule.__repr__   sp    #'99.&*kk3*.*:*:<	 	 	%%''))++yyr   )Fr   )r	   ) N)__name__
__module____qualname__r   global_contextr   r'   r)   r"   r9   rA   rD   propertyrH   rK   rM   rP   rS   rl   ro   rt   r~   r   r   r   r   r   r   r   r      s    (>(> !((2( 3 3 % %"5,36j-15 r   r   )r   llvmlite.irr   r   r   r   objectr   r   r   r   <module>r      s     6 6p V p r   