B
     \]                 @   s  d dl mZmZ d dlZd dlZd dlmZ d dlmZm	Z	m
Z
mZmZmZmZmZmZmZmZ d dlZd dlZd dlZd dlmZmZ d dlmZ ddlmZ d d	lmZ e ZG d
d deZeeZ dd Z!G dd de"Z#G dd de$Z%G dd deZ&dS )    )absolute_importprint_functionN)
namedtuple)c_size_tbyrefc_char_pc_void_p	StructureCDLLPOINTERcreate_string_bufferc_int	addressofc_byte)utilsconfig)devices   )AMDGCNModule)CmdLinec               @   s   e Zd ZdS )OpaqueModuleRefN)__name__
__module____qualname__ r   r   3lib/python3.7/site-packages/numba/roc/hlc/libhlc.pyr      s   r   c              G   sZ   dd d|  D }t |}t|  }x t|D ]}t|| ||< q.W t|t| dS )z
    Use this for setting debug flags to libHLC using the same options
    available to LLVM.
    E.g -debug-pass=Structure
    c             S   s   g | ]}t |d qS )ascii)r   encode).0xr   r   r   
<listcomp>#   s    zset_option.<locals>.<listcomp>)ZlibhlcN)lenr   ranger   hlcROC_SetCommandLineOptionr   )optZinpZargcargvir   r   r   
set_option   s    
r(   c               @   s   e Zd ZdS )ErrorN)r   r   r   r   r   r   r   r)   +   s   r)   c               @   sj   e Zd ZdZdZdd Zdd Zdd ZdddZdd Z	dddZ
dd ZdddZdd Zdd ZdS )HLCz"
    LibHLC wrapper interface
    Nc             C   s   t jtjdd}t j|r*t j|s.t|| _t	
 }|jj}|| _| jd krytt jtjdd}W n tk
r   tdY nFX t|j_t|j_t|j_|  t||j ttg|j_|t | _d S )NZshareZ	rocmtoolslibzlibrocmlite.sozhlibrocmlite.so cannot be found.  Please install the roctools package by: conda install -c numba roctools)!ospathjoinsysprefixexistsisdirAssertionErrorbitcode_pathr   Zget_contextZagentname
target_cpur#   r
   OSErrorImportErrormoduleref_ptrROC_ParseModuleZrestypeROC_ParseBitcoder   ROC_ModuleEmitBRIGZROC_Initializer   finalizeZROC_Finalizer   r   r$   Zargtypestype)selfr4   Zdev_ctxr6   r#   r   r   r   __init__5   s&    

zHLC.__init__c             C   s8   t |tr|d}t|}| j|}|s4td|S )Nlatin1zFailed to parse assembly)
isinstancestrr   r   r#   r:   r)   )r?   Zirbufmodr   r   r   parse_assemblyT   s    

zHLC.parse_assemblyc             C   s4   t |t|}| j|tt|}|s0td|S )NzFailed to parse bitcode)r   r!   r#   r;   r   r)   )r?   ZbitcoderD   rE   r   r   r   parse_bitcode]   s
    zHLC.parse_bitcode   r   r   c             C   s2   | j |t|t|t|t| js.tdd S )NzFailed to optimize module)r#   ZROC_ModuleOptimizeintr   r6   r)   )r?   rE   r%   sizeZverifyr   r   r   optimized   s    zHLC.optimizec             C   s   | j ||stdd S )NzFailed to link modules)r#   ZROC_ModuleLinkInr)   )r?   dstsrcr   r   r   linki   s    zHLC.link   c             C   sL   t d}| j|t|t | jt|s0td|jd}| j	| |S )Nr   zFailed to emit HSAILrA   )
r   r#   ZROC_ModuleEmitHSAILrI   r6   r   r)   valuedecodeROC_DisposeString)r?   rE   r%   rD   retr   r   r   to_hsailm   s    zHLC.to_hsailc             C   s   t || d S )N)cliZ	link_brig)r?   
upbrig_locpatchedbrig_locr   r   r   
_link_brigv   s    zHLC._link_brigc          	   C   s8  t d}| j|t|t| jt|}|s4tdt| 	|j
}yt W n tk
rh   t|}Y nX tt|}| j| t }g }d}	tj||	}
t|
d}|| ||
 W d Q R X d}tj||}| |
| t|d}| }|| W d Q R X x|D ]}t| qW t| |S )Nr   zFailed to emit BRIGzunpatched.brigwbzpatched.brigrb)r   r#   r<   rI   r   r6   r   r)   r   Zfrom_addressrP   buffer	NameErrorbytesrR   tempfileZmkdtempr,   r-   r.   openwriteappendrX   readunlinkrmdir)r?   rE   r%   ZbufptrrJ   rD   rS   ZtmpdirZ	tmp_filesZupbrig_filerV   Zup_brig_fobjZpatchedbrig_filerW   Zp_brig_fobjZpatchedBrigZafiler   r   r   to_brigy   s:    


zHLC.to_brigc             C   s6   t d}| j|t| |jd}| j| |S )Nr   rA   )r   r#   ZROC_ModulePrintr   rP   rQ   rR   )r?   rE   rD   rS   r   r   r   	to_string   s
    zHLC.to_stringc             C   s   | j | d S )N)r#   ZROC_ModuleDestroy)r?   rE   r   r   r   destroy_module   s    zHLC.destroy_module)rH   r   r   )rO   )rO   )r   r   r   __doc__r#   r@   rF   rG   rK   rN   rT   rX   re   rf   rg   r   r   r   r   r*   /   s   	

	
2r*   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
Modulec             C   s   g | _ t | _t|  d S )N)_llvm_modulesr*   _hlcr   r@   )r?   r   r   r   r@      s    zModule.__init__c             C   s<   |  |}| j|}tjr,t| j| | j| dS )z0
        Load LLVM with HSAIL SPIR spec
        N)	Z_preprocessrk   rF   r   DUMP_OPTIMIZEDprintrf   rj   ra   )r?   ZllvmirrE   r   r   r   	load_llvm   s
    
zModule.load_llvmc          
   C   s^   xX| j D ]N}tj| jj|}t|d(}| }| j|}| j	|| W d Q R X qW d S )NrZ   )
Zbitcodesr,   r-   r.   rk   r4   r_   rb   rG   rN   )r?   mainZbcZbc_pathZbuiltinrD   rE   r   r   r   link_builtins   s    zModule.link_builtinsc             C   s   | j rtd| jd }x$| jdd D ]}| j|| q(W | | | j| tjrjt	| j
| | j|}| j|}d| _ | j| tjrt	| tdddg||S )	z;
        Finalize module and return the HSAIL code
        zModule finalized alreadyr   r   NTZFinalizerResulthsailbrig)Z
_finalizedr3   rj   rk   rN   rp   rK   r   rl   rm   rf   rT   re   rg   ZDUMP_ASSEMBLYr   )r?   ro   Zdeprq   rr   r   r   r   generateGCN   s    

zModule.generateGCNN)r   r   r   r@   rn   rp   rs   r   r   r   r   ri      s   
ri   )'Z
__future__r   r   r,   r/   collectionsr   Zctypesr   r   r   r   r	   r
   r   r   r   r   r   r^   reZnumbar   r   Znumba.roc.hsadrvr   commonr   Znumba.roc.hlc.hlcr   rU   r   r9   r(   	Exceptionr)   objectr*   ri   r   r   r   r   <module>   s&   4 