U
    ¤½|er#  ã                   @   s4   d dl Z d dlmZmZmZmZ G dd„ deƒZdS )é    N)ÚcontextÚvaluesÚtypesÚ_utilsc                   @   s¼   e Zd Zdejfdd„Zdd„ Zdd„ Zdd	„ Zd+dd„Z	d,dd„Z
dd„ Zedd„ ƒZedd„ ƒZdd„ Zdd„ Zd-dd„Zd.dd„Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ ZdS )/ÚModuleÚ c                 C   sB   || _ || _d| _t ¡ | _d| _t ¡ | _	g | _
i | _i | _d S )Nr   zunknown-unknown-unknown)r   ÚnameÚdata_layoutr   Ú	NameScopeÚscopeÚtripleÚcollectionsÚOrderedDictÚglobalsÚmetadataÚnamedmetadataÚ_metadatacache)Úselfr   r   © r   úO/var/www/website-v5/atlas_env/lib/python3.8/site-packages/llvmlite/ir/module.pyÚ__init__   s    

zModule.__init__c                 C   sb   g }|D ]T}|d kr"t  ¡ d ƒ}n0t|tƒr:t | |¡}nt|ttfƒrR|  |¡}| 	|¡ q|S ©N)
r   ÚMetaDataTypeÚ
isinstanceÚstrr   ÚMetaDataStringÚlistÚtupleÚadd_metadataÚappend)r   ÚoperandsÚ	fixed_opsÚopr   r   r   Ú_fix_metadata_operands   s    

zModule._fix_metadata_operandsc                 C   s<   g }|D ].\}}t |ttfƒr(|  |¡}| ||f¡ q|S r   )r   r   r   r   r   )r   r    r!   r   r"   r   r   r   Ú_fix_di_operands$   s    
zModule._fix_di_operandsc                 C   sp   t |ttfƒstd|f ƒ‚|  |¡}t|ƒ}|| jkrbt| jƒ}tj	| |t
|ƒd�}|| j|< n
| 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.
        z3expected a list or tuple of metadata values, got %r©r   )r   r   r   Ú	TypeErrorr#   r   Úlenr   r   ÚMDValuer   )r   r    ÚkeyÚnÚmdr   r   r   r   -   s    ÿ



zModule.add_metadataFc                 C   sf   t t|  | ¡ ¡ƒƒ}|||f}|| jkrXt| jƒ}tj| |||t	|ƒd�}|| j|< n
| 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)   r*   Údir   r   r   Úadd_debug_infoA   s    




zModule.add_debug_infoNc                 C   sr   || j kr| j | }nt | ¡ }| j |< |dk	rnt|tjƒsH|  |¡}t|jtjƒsdt	d|f ƒ‚| 
|¡ |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"])
        Nz'wrong type for metadata element: got %r)r   r   ÚNamedMetaDatar   ÚValuer   Útyper   r   r&   Úadd)r   r   ÚelementÚnmdr   r   r   Úadd_named_metadataU   s    

ÿ
zModule.add_named_metadatac                 C   s
   | 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   r   r   r   Úget_named_metadatan   s    zModule.get_named_metadatac                 C   s   dd„ | j  ¡ D ƒS )zI
        A list of functions declared or defined in this module.
        c                 S   s   g | ]}t |tjƒr|‘qS r   )r   r   ÚFunction©Ú.0Úvr   r   r   Ú
<listcomp>z   s    ÿz$Module.functions.<locals>.<listcomp>©r   r   ©r   r   r   r   Ú	functionsu   s    zModule.functionsc                 C   s
   | j  ¡ S )z>
        An iterable of global values in this module.
        rA   rB   r   r   r   Úglobal_values}   s    zModule.global_valuesc                 C   s
   | j | S )z-
        Get a global value by name.
        )r   r:   r   r   r   Ú
get_global„   s    zModule.get_globalc                 C   s    |j | jkst‚|| j|j < dS )z)
        Add a new global value.
        N)r   r   ÚAssertionError)r   Zglobalvaluer   r   r   Ú
add_globalŠ   s    zModule.add_globalc                 C   s   | j  |¡S )zJ
        Get a unique global name with the following *name* hint.
        )r   Údeduplicater:   r   r   r   Úget_unique_name‘   s    zModule.get_unique_namer   c                    s<  ‡ ‡fdd„}ˆ dkr$ˆd j g}ndd„ ˆD ƒ}d ˆ g| ¡}|| jkrV| j| S |d k	rb�nÊtˆƒdkr’ˆ dkr’t t ¡ t d	¡g¡}�nštˆƒd	k�r:ˆ d
krÈt ˆd ˆd t d¡g¡}npˆ dkræt ˆd ˆd ¡}nRˆ dk�r
t ˆd t d¡g¡}n.ˆ dk�r(t t d¡ˆ¡}nt ˆd ˆ¡}nòtˆƒdk�rºˆ dk�r„ˆd t d¡ˆd	 t d	¡g‰t t ¡ ˆ¡}n4ˆ dk�r²ˆd t d	¡g‰t ˆd ˆ¡}n|ƒ  nrtˆƒdk�r&ˆ dk�rôˆt d	¡g ‰t t ¡ ˆ¡}n0ˆ dk�rˆd gd ‰t ˆd ˆ¡}n|ƒ  n|ƒ  tj	| ||d�S )Nc                      s   t dˆ tˆƒf ƒ‚d S )Nz"unknown intrinsic %r with %d types)ÚNotImplementedErrorr'   r   ©Ú	intrinsicÚtysr   r   Ú_error˜   s    
ÿz(Module.declare_intrinsic.<locals>._error>   ú	llvm.cttzú	llvm.ctlzúllvm.fmar   c                 S   s   g | ]
}|j ‘qS r   )Úintrinsic_name)r>   Útr   r   r   r@   Ÿ   s     z,Module.declare_intrinsic.<locals>.<listcomp>Ú.zllvm.assumeé   z	llvm.powié    zllvm.powé   zllvm.convert.from.fp16é   zllvm.convert.to.fp16zllvm.memseté   >   rO   rP   é   )zllvm.memcpyzllvm.memmoverQ   r%   )
rR   Újoinr   r'   r   ÚFunctionTypeÚVoidTypeÚIntTyper   r<   )r   rL   rM   ZfntyrN   Úsuffixesr   r   rK   r   Údeclare_intrinsic—   sR    

 


ÿ


zModule.declare_intrinsicc                 C   s   | j jS r   )r   Zidentified_typesrB   r   r   r   Úget_identified_typesÌ   s    zModule.get_identified_typesc                 C   s2   dd„ |   ¡  ¡ D ƒ}|dd„ | j ¡ D ƒ7 }|S )Nc                 S   s   g | ]}|  ¡ ‘qS r   )Úget_declaration)r>   Úitr   r   r   r@   Ñ   s   ÿz*Module._get_body_lines.<locals>.<listcomp>c                 S   s   g | ]}t |ƒ‘qS r   )r   r=   r   r   r   r@   Ô   s     )ra   r   r   ©r   Úlinesr   r   r   Ú_get_body_linesÏ   s
    
ÿzModule._get_body_linesc              	   C   s\   g }| j  ¡ D ].\}}| dj|d dd„ |jD ƒ¡d�¡ q| jD ]}| t|ƒ¡ qD|S )Nz!{name} = !{{ {operands} }}z, c                 s   s   | ]}|  ¡ V  qd S r   )Úget_reference)r>   Úir   r   r   Ú	<genexpr>Û   s   ÿz-Module._get_metadata_lines.<locals>.<genexpr>)r   r    )r   r-   r   Úformatr[   r    r   r   )r   ZmdbufÚkr?   r+   r   r   r   Ú_get_metadata_lines×   s     
ÿÿ

zModule._get_metadata_linesc                 C   s   d  |  ¡ ¡S ©NÚ
)r[   rf   rB   r   r   r   Ú_stringify_bodyá   s    zModule._stringify_bodyc                 C   s   d  |  ¡ ¡S rm   )r[   rl   rB   r   r   r   Ú_stringify_metadataå   s    zModule._stringify_metadatac                 C   sN   g }|d| j f d| jf d| jf dg7 }||  ¡ 7 }||  ¡ 7 }d |¡S )Nz; ModuleID = "%s"ztarget triple = "%s"ztarget datalayout = "%s"r   rn   )r   r   r	   rf   rl   r[   rd   r   r   r   Ú__repr__é   s    


üzModule.__repr__)F)N)r   )r   N)Ú__name__Ú
__module__Ú__qualname__r   Úglobal_contextr   r#   r$   r   r2   r9   r;   ÚpropertyrC   rD   rE   rG   rI   r`   ra   rf   rl   ro   rp   rq   r   r   r   r   r      s*   	





5
r   )r   Úllvmlite.irr   r   r   r   Úobjectr   r   r   r   r   Ú<module>   s   