B
      ›\}  ã               @   sà   d Z ddlmZmZmZ ddlmZmZ ddlm	Z	 ddl
Z
e
 de
j¡Ze
 de
j¡Ze
 d¡Ze
 d	¡Ze
 d
¡Ze
 d¡Ze
 d¡Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Ze	 e¡G dd„ deƒƒZG dd„ deƒZdS )z0
Shared code for the low level compiler tooling
é    )Úprint_functionÚdivisionÚabsolute_import)ÚabstractmethodÚABCMeta)ÚsixNz\n\.([0-9a-z_\.]+):z%\.([0-9a-z_]+)z	\!\d+\s*=zmetadata\s*\![{'\"]z\!\d+z(.*)"(\$.*)".*z(.*)=(.*alloca(.*))c             C   sx   g }xh|   ¡ D ]\}t |¡r`dt |¡kr`| dd¡}| dd¡}dd„ }t ||¡}| d¡}| 	|¡ qW d	 
|¡S )
zL
    Rewrite metadata since llvm3.6 dropped the "metadata" type prefix.
    Nz!{zmetadata !{z!"zmetadata !"c             S   s   d  |  d¡¡S )Nzmetadata {0}r   )ÚformatÚgroup)Úm© r   ú3lib/python3.7/site-packages/numba/roc/hlc/common.pyÚsub_metadata#   s    z'add_metadata_type.<locals>.sub_metadataz	metadata Ú
)Ú
splitlinesÚ_re_metadata_defÚmatchÚ_re_metadata_correct_usageÚsearchÚreplaceÚ_re_metadata_refÚsubÚlstripÚappendÚjoin)ZirZbufÚliner   r   r   r   Úadd_metadata_type   s    

r   c             C   s   dd„ }t  || ¡S )z5
    HLC does not like variable with '.' prefix.
    c             S   s   d  |  d¡¡S )Nz
%_dot_.{0}é   )r   r	   )Úmatr   r   r   Úrepl1   s    zrename_register.<locals>.repl)Ú_re_regnamer   )Úllvmirr   r   r   r   Úrename_register-   s    r!   c             C   s   dd„ }t  || ¡S )z4
    HLC does not like a label with '.' prefix.
    c             S   s   d  |  d¡¡S )Nz
_dot_.{0}:r   )r   r	   )r   r   r   r   r   ;   s    zrename_label.<locals>.repl)Ú_re_labelnamer   )r    r   r   r   r   Úrename_label7   s    r#   c             C   s   t | ƒ} t| ƒ} | S )z@
    Adapt the LLVM IR to match the syntax required by HLC.
    )r!   r#   )r    r   r   r   Úadapt_llvm_versionA   s    r$   c             C   sØ   |   ¡ }d}g }x¼|D ]´}d|krÀt |¡ ¡ \}}}t |¡}|rz| ¡ \}	}
|
 ¡ }
d}||	|
f }||	|
| f }n| ¡ }|| }d||f }d}|||||f }| |¡ | |¡ q| |¡ qW d |¡S )z½
    rewrites llvmir such that alloca's go into addrspace(5) and are then
    addrspacecast back to to addrspace(0). Alloca into 5 is a requirement of
    the datalayout specification.
    Z__tmpZallocaz%s"%s"z%s = %s, addrspace(5)z:%s = addrspacecast %s addrspace(5)* %s to %s addrspace(0)*r   )r   Ú_re_alloca_partsr   ÚgroupsÚ_re_alloca_quotedÚstripr   r   )r    ÚlinesZmangleZnew_irÚlZassigneeZalloca_matchZptrtyZq_matchÚstartÚvarZname_fmtZold_nameÚnew_nameZ
allocalineZcastline_fmtZcastliner   r   r   Úalloca_addrspace_correctionK   s,    


r.   c               @   s4   e Zd ZdZedd„ ƒZedd„ ƒZedd„ ƒZdS )	Ú_AMDGCNModulez)
    The AMDCGN LLVM module contract
    c             C   s   d S )Nr   )Úselfr    r   r   r   Ú	load_llvms   s    z_AMDGCNModule.load_llvmc             C   s   d S )Nr   )r0   Úmainr   r   r   Úlink_builtinsw   s    z_AMDGCNModule.link_builtinsc             C   s   d S )Nr   )r0   r    r   r   r   ÚgenerateGCN{   s    z_AMDGCNModule.generateGCNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r1   r3   r4   r   r   r   r   r/   m   s   r/   c            	   @   sN   e Zd ZdZdddddddd	d
g	Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z	dS )ÚAMDGCNModulez)
    The AMDCGN LLVM module contract
    zopencl.amdgcn.bczocml.amdgcn.bczockl.amdgcn.bcz)oclc_correctly_rounded_sqrt_off.amdgcn.bczoclc_daz_opt_off.amdgcn.bczoclc_finite_only_off.amdgcn.bczoclc_isa_version_803.amdgcn.bczoclc_unsafe_math_off.amdgcn.bczirif.amdgcn.bcc             C   s
   d| _ d S )NF)Z
_finalized)r0   r   r   r   Ú__init__‘   s    zAMDGCNModule.__init__c             C   s   t |ƒ}t|ƒ}|S )N)r$   r.   )r0   r    Zversion_adaptedZalloca_fixedr   r   r   Ú_preprocess”   s    zAMDGCNModule._preprocessc             C   s   d S )Nr   )r0   r    r   r   r   r1   ™   s    zAMDGCNModule.load_llvmc             C   s   d S )Nr   )r0   r2   r   r   r   r3   œ   s    zAMDGCNModule.link_builtinsc             C   s   d S )Nr   )r0   r   r   r   r4   Ÿ   s    zAMDGCNModule.generateGCNN)
r5   r6   r7   r8   Zbitcodesr:   r;   r1   r3   r4   r   r   r   r   r9   €   s   r9   )r8   Z
__future__r   r   r   Úabcr   r   Znumbar   ÚreÚcompileÚIr"   r   r   r   r   r'   r%   r   r!   r#   r$   r.   Zadd_metaclassÚobjectr/   r9   r   r   r   r   Ú<module>   s&   







"