σ
\K]c           @@ sn  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 d
 e f d     YZ e e  Z  d   Z! d e" f d     YZ# d e$ f d     YZ% d e f d     YZ& d S(   i    (   t   absolute_importt   print_functionN(   t
   namedtuple(   t   c_size_tt   byreft   c_char_pt   c_void_pt	   Structuret   CDLLt   POINTERt   create_string_buffert   c_intt	   addressoft   c_byte(   t   utilst   config(   t   devicesi   (   t   AMDGCNModule(   t   CmdLinet   OpaqueModuleRefc           B@ s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyR      s   c          G@ s   g  d |  D] } t  | j d   ^ q } t |  } t |   } x( t |  D] } t | |  | | <qR Wt j | t |   d S(   s   
    Use this for setting debug flags to libHLC using the same options
    available to LLVM.
    E.g -debug-pass=Structure
    t   libhlct   asciiN(   R   (	   R
   t   encodet   lenR   t   rangeR   t   hlct   ROC_SetCommandLineOptionR   (   t   optt   xt   inpt   argct   argvt   i(    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyt
   set_option   s    ,t   Errorc           B@ s   e  Z RS(    (   R   R   (    (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyR$   +   s   t   HLCc           B@ s}   e  Z d  Z d Z d   Z d   Z d   Z d d d d  Z d   Z	 d	 d
  Z
 d   Z d	 d  Z d   Z d   Z RS(   s"   
    LibHLC wrapper interface
    c         C@ s,  t  j j t j d d  } t  j j |  r? t  j j |  sE t  | |  _ t	 j
   } | j j } | |  _ |  j d  k r(y% t t  j j t j d d   } Wn t k
 rΒ t d   q(Xt | j _ t | j _ t | j _ | j   t j | | j  t t g | j _  | t! |   _ n  d  S(   Nt   sharet	   rocmtoolst   libs   librocmlite.sosh   librocmlite.so cannot be found.  Please install the roctools package by: conda install -c numba roctools("   t   ost   patht   joint   syst   prefixt   existst   isdirt   AssertionErrort   bitcode_pathR   t   get_contextt   agentt   namet
   target_cpuR   t   NoneR   t   OSErrort   ImportErrort   moduleref_ptrt   ROC_ParseModulet   restypet   ROC_ParseBitcodeR   t   ROC_ModuleEmitBRIGt   ROC_InitializeR   t   finalizet   ROC_FinalizeR   R   R   t   argtypest   type(   t   selfR1   t   dev_ctxR5   R   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyt   __init__5   s&    *		%
c         C@ sX   t  | t  r! | j d  } n  t |  } |  j j |  } | sT t d   n  | S(   Nt   latin1s   Failed to parse assembly(   t
   isinstancet   strR   R
   R   R:   R$   (   RC   t   irt   buft   mod(    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyt   parse_assemblyT   s    c         C@ sO   t  | t |   } |  j j | t t |    } | sK t d   n  | S(   Ns   Failed to parse bitcode(   R
   R   R   R<   R   R$   (   RC   t   bitcodeRJ   RK   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyt   parse_bitcode]   s
    !i   i    i   c         C@ sL   |  j  j | t |  t |  t |  t |  j   sH t d   n  d  S(   Ns   Failed to optimize module(   R   t   ROC_ModuleOptimizet   intR   R5   R$   (   RC   RK   R   t   sizet   verify(    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyt   optimized   s    c         C@ s(   |  j  j | |  s$ t d   n  d  S(   Ns   Failed to link modules(   R   t   ROC_ModuleLinkInR$   (   RC   t   dstt   src(    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyt   linki   s    i   c         C@ sq   t  d  } |  j j | t |  t  |  j  t |   sK t d   n  | j j d  } |  j j	 |  | S(   Ni    s   Failed to emit HSAILRF   (
   R   R   t   ROC_ModuleEmitHSAILRP   R5   R   R$   t   valuet   decodet   ROC_DisposeString(   RC   RK   R   RJ   t   ret(    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyt   to_hsailm   s    c         C@ s   t  j | |  d  S(   N(   t   clit	   link_brig(   RC   t
   upbrig_loct   patchedbrig_loc(    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyt
   _link_brigv   s    c         C@ s  t  d  } |  j j | t |  t |  j  t |   } | sQ t d   n  t | j	 | j
  } y t Wn t k
 r t |  } n Xt t |   } |  j j |  t j   } g  } d }	 t j j | |	  }
 t |
 d  ! } | j |  | j |
  Wd  QXd } t j j | |  } |  j |
 |  t | d    } | j   } | j |  Wd  QXx | D] } t j |  qsWt j |  | S(   Ni    s   Failed to emit BRIGs   unpatched.brigt   wbs   patched.brigt   rb(   R   R   R=   RP   R   R5   R   R$   R   t   from_addressRY   t   buffert	   NameErrort   bytesR[   t   tempfilet   mkdtempR)   R*   R+   t   opent   writet   appendRb   t   readt   unlinkt   rmdir(   RC   RK   R   t   bufptrRQ   RJ   R\   t   tmpdirt	   tmp_filest   upbrig_fileR`   t   up_brig_fobjt   patchedbrig_fileRa   t   p_brig_fobjt   patchedBrigt   afile(    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyt   to_brigy   s:    c         C@ sK   t  d  } |  j j | t |   | j j d  } |  j j |  | S(   Ni    RF   (   R   R   t   ROC_ModulePrintR   RY   RZ   R[   (   RC   RK   RJ   R\   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyt	   to_string«   s
    c         C@ s   |  j  j |  d  S(   N(   R   t   ROC_ModuleDestroy(   RC   RK   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyt   destroy_module²   s    N(   R   R   t   __doc__R6   R   RE   RL   RN   RS   RW   R]   Rb   Rz   R|   R~   (    (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyR%   /   s   							2	t   Modulec           B@ s,   e  Z d    Z d   Z d   Z d   Z RS(   c         C@ s&   g  |  _  t   |  _ t j |   d  S(   N(   t   _llvm_modulesR%   t   _hlcR   RE   (   RC   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyRE   ·   s    	c         C@ sW   |  j  |  } |  j j |  } t j rC t |  j j |   n  |  j j |  d S(   s0   
        Load LLVM with HSAIL SPIR spec
        N(	   t   _preprocessR   RL   R   t   DUMP_OPTIMIZEDt   printR|   R   Rm   (   RC   t   llvmirRK   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyt	   load_llvmΌ   s
    	c         C@ s|   xu |  j  D]j } t j j |  j j |  } t | d  8 } | j   } |  j j |  } |  j j	 | |  Wd  QXq
 Wd  S(   NRd   (
   t   bitcodesR)   R*   R+   R   R1   Rk   Rn   RN   RW   (   RC   t   maint   bct   bc_patht   builtinRJ   RK   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyt   link_builtinsΛ   s    c         C@ sό   |  j  s t d   |  j d } x( |  j d D] } |  j j | |  q1 W|  j |  |  j j |  t j r t	 |  j j
 |   n  |  j j |  } |  j j |  } t |  _  |  j j |  t j rΰ t	 |  n  t d d d g  | |  S(   s;   
        Finalize module and return the HSAIL code
        s   Module finalized alreadyi    i   t   FinalizerResultt   hsailt   brig(   t
   _finalizedR0   R   R   RW   R   RS   R   R   R   R|   R]   Rz   t   TrueR~   t   DUMP_ASSEMBLYR   (   RC   R   t   depR   R   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyt   generateGCNΥ   s    			(   R   R   RE   R   R   R   (    (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyR   Ά   s   			
('   t
   __future__R    R   R)   R,   t   collectionsR   t   ctypesR   R   R   R   R   R   R	   R
   R   R   R   Ri   t   ret   numbaR   R   t   numba.roc.hsadrvR   t   commonR   t   numba.roc.hlc.hlcR   R^   R   R9   R#   t	   ExceptionR$   t   objectR%   R   (    (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/libhlc.pyt   <module>   s$   L		