B
     \P'                 @   s   d dl mZmZ d dlZd dlmZmZ d dlZd dlZd dlZd dl	Z	d dl
mZ d dlmZ d dlmZ ddlmZ dd	lmZ dd
lmZ d dlmZ d dlmZ d dlmZ d dlmZ eZdZedd Zdd ZG dd deZG dd deZ dS )    )print_functionabsolute_importN)
check_callcheck_output)
namedtuple)config)devices   )AMDGCNModule)ROCM_BC_PATH)TRIPLE)datetime)contextmanager)utils)HsaSupportErrorFc           	   c   s@   t rtjV  n.tjrtjV  nttjd} | V  W d Q R X d S )Nwb)	NOISY_CMDLINE
subprocessZSTDOUTr   ZIS_PY3ZDEVNULLopenosdevnull)r    r   0lib/python3.7/site-packages/numba/roc/hlc/hlc.py
error_pipe   s    

r   c           
   O   s   y\t  L}tr>tt dtjd tdd|  tjd t	| d|i|}W d Q R X W n0 t
jk
r } zt| |W d d }~X Y nX |S )Nz%b %d %H:%M:%S)filezCMD: ;stderr)r   r   printr   ZnowZstrftimesysstdoutjoin_real_check_callr   ZCalledProcessError)argskwargsr   Zreter   r   r   r   %   s    
 r   c               @   sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )CmdLinec             C   s   | j s&t }|jjd}d| | _d| jd| j	| jddddd	g	| _
d| jd| j	| jddd	g| _d| jd
| j	| jddd	g| _d| jd
| j	| jddd	g| _d| jddd	dg| _d| jddd	g| _d| jddd	g| _d S )NzUTF-8z-mcpu %s z-O3z-disable-simplify-libcallsz-verifyz-Sz	-o {fout}z{fin}z-O2z-filetype=asmz-filetype=objz{lib}z-shared)initializedr   Zget_contextZagentnamedecode
target_cpur    opttriple_flagCMD_OPT
CMD_VERIFYllcCMD_GEN_HSAILCMD_GEN_BRIG	llvm_linkCMD_LINK_BUILTINSCMD_LINK_LIBSld_lldCMD_LINK_BRIG)selfZdev_ctxr*   r   r   r   _initialize:   sd    






zCmdLine._initializec                s`   t jdd  _ fdd}t _|d _|d _|d _|d _	d j  _
d	 _d S )
NZHSAILBINc                s4    j d k	rtj j | S tjtjd| }|S d S )Nbin)_binary_pathr   pathr    r   prefix)ZtoolZbinpath)r7   r   r   _setup_pathw   s    
z%CmdLine.__init__.<locals>._setup_pathr+   r/   z	llvm-linkzld.lldz-mtriple %sF)r   environgetr:   r   Z_tripler+   r/   r2   r5   r,   r'   )r7   r=   r   )r7   r   __init__u   s    



zCmdLine.__init__c          
   C   s   y|t j| jstdt| jdgdd}dd | D }|d}||d d  }x"|D ]}d	|kr\P q\W d
}t|W n$ tk
r } z W d d }~X Y nX d S )Nzllc not foundz	--versionT)Zuniversal_newlinesc             S   s   g | ]}|  qS r   )strip).0xr   r   r   
<listcomp>   s    z)CmdLine.check_tooling.<locals>.<listcomp>zRegistered Targets:r	   Zamdgcnz5Command line tooling does not support "amdgcn" target)	r   r;   isfiler/   r   r   
splitlinesindexBaseException)r7   outputZolinesZtgtidxZtargetsZtgtmsgr$   r   r   r   check_tooling   s    


zCmdLine.check_toolingc             C   s*   | j s|   t| jj||ddd d S )N)foutfinT)shell)r'   r8   r   r.   format)r7   ipathopathr   r   r   verify   s    zCmdLine.verifyc             C   s*   | j s|   t| jj||ddd d S )N)rL   rM   T)rN   )r'   r8   r   r-   rO   )r7   rP   rQ   r   r   r   optimize   s    zCmdLine.optimizec             C   s*   | j s|   t| jj||ddd d S )N)rL   rM   T)rN   )r'   r8   r   r0   rO   )r7   rP   rQ   r   r   r   generate_hsail   s    zCmdLine.generate_hsailc             C   s*   | j s|   t| jj||ddd d S )N)rL   rM   T)rN   )r'   r8   r   r1   rO   )r7   rP   rQ   r   r   r   generate_brig   s    zCmdLine.generate_brigc             C   sF   | j s|   | jj||d}|ddd |D 7 }t|dd d S )N)rL   rM   r&   c             S   s   g | ]}d  |qS )z{0})rO   )rB   libr   r   r   rD      s    z%CmdLine.link_libs.<locals>.<listcomp>T)rN   )r'   r8   r4   rO   r    r   )r7   rP   libpathsrQ   Zcmdliner   r   r   	link_libs   s
    zCmdLine.link_libsc             C   s*   | j s|   t| jj||ddd d S )N)rL   rM   T)rN   )r'   r8   r   r6   rO   )r7   rP   rQ   r   r   r   	link_brig   s    zCmdLine.link_brigN)__name__
__module____qualname__r8   r@   rK   rR   rS   rT   rU   rX   rY   r   r   r   r   r%   8   s   ;r%   c               @   sN   e Zd Zdd Zdd Zdd Zddd	Zd
d Zdd Zdd Z	dd Z
dS )Modulec             C   s,   t  | _g | _g | _t | _t|  dS )z
        Setup
        N)	tempfileZmkdtemp_tmpdir
_tempfiles
_linkfilesr%   _cmdr
   r@   )r7   r   r   r   r@      s
    
zModule.__init__c             C   s   d S )N)close)r7   r   r   r   __del__   s    zModule.__del__c             C   s*   x| j D ]}t| qW t| j d S )N)r`   r   unlinkrmdirr_   )r7   Zafiler   r   r   rc      s    zModule.closer   c             C   s   |  |}t||d}||fS )N)mode)_track_temp_filer   )r7   r(   rg   r;   Zfobjr   r   r   _create_temp_file   s    
zModule._create_temp_filec             C   s.   t j| jdt| j|}| j| |S )Nz{0}-{1})r   r;   r    r_   rO   lenr`   append)r7   r(   r;   r   r   r   rh      s    
zModule._track_temp_filec          	   C   s   |  |}| d\}}| ||d W dQ R X | d}| jj||d tjrt	|d}t
| d W dQ R X | j| dS )z0
        Load LLVM with HSAIL SPIR spec
        zdump-llvm-irasciiNzverified-llvm-ir)rP   rQ   rb)Z_preprocessri   writeencoderh   rb   rR   r   DUMP_OPTIMIZEDr   r   readr)   ra   rk   )r7   ZllvmirZtmp_llvm_irrM   rL   Zfin_optr   r   r   	load_llvm   s    

zModule.load_llvmc             C   sr   xl| j D ]b}|| j d kr4||dddd }n|}tjt|}| jjj|||d}t	|dd |}qW d S )N/_.)rL   rM   rV   T)rN   )
Zbitcodesreplacer   r;   r    r   rb   r3   rO   r   )r7   rP   rQ   ZbcZ	tmp_opathrV   cmdr   r   r   link_builtins   s    zModule.link_builtinsc          	   C   s\  | j rtd| jd }| d}| jdd }| jj|||d | d}| j||d | d	}| jj||d tj	rt
|d
}t| d W dQ R X | d}| jj||d | d}| jj||d | d}	| jj||	d d| _ t
|d
}| d}
W dQ R X t
|	d
}| }W dQ R X tjrHt|
 tdddg|
|S )zL
        Generate GCN from a module and also return the HSAIL code.
        z Module already has GCN generatedr   zlink-depr	   N)rP   rW   rQ   zlinked-path)rP   rQ   zoptimized-llvm-irrm   rl   zcreate-hsailzcreate-brigzlinked-brigTZFinalizerResulthsailbrig)Z
_finalizedAssertionErrorra   rh   rb   rX   ry   rS   r   rp   r   r   rq   r)   rT   rU   rY   ZDUMP_ASSEMBLYr   )r7   ZllvmfileZpre_builtin_pathrW   Zlinked_pathZopt_pathrM   Z
hsail_pathZ	brig_pathZend_brig_pathrz   r{   r   r   r   generateGCN  s6    







zModule.generateGCNN)r   )rZ   r[   r\   r@   rd   rc   ri   rh   rr   ry   r}   r   r   r   r   r]      s   

r]   )!Z
__future__r   r   r   r   r   r   r^   r   recollectionsr   Znumbar   Znumba.roc.hsadrvr   commonr
   r    r   r   
contextlibr   r   Znumba.roc.hsadrv.errorr   r!   r   r   objectr%   r]   r   r   r   r   <module>   s.    