σ
\K]c           @` s5  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
 j d e
 j  Z e
 j d e
 j  Z e
 j d  Z e
 j d	  Z e
 j d
  Z e
 j d  Z e
 j d  Z d   Z d   Z d   Z d   Z d   Z e	 j e  d e f d     Y Z d e f d     YZ d S(   s0   
Shared code for the low level compiler tooling
i    (   t   print_functiont   divisiont   absolute_import(   t   abstractmethodt   ABCMeta(   t   sixNs   \n\.([0-9a-z_\.]+):s   %\.([0-9a-z_]+)s	   \!\d+\s*=s   metadata\s*\![{'\"]s   \!\d+s   (.*)"(\$.*)".*s   (.*)=(.*alloca(.*))c         C` s―   g  } x |  j    D] } t j |  r d t j |  k r | j d d  } | j d d  } d   } t j | |  } | j	 d  } q n  | j
 |  q Wd j |  S(	   sL   
    Rewrite metadata since llvm3.6 dropped the "metadata" type prefix.
    s   !{s   metadata !{s   !"s   metadata !"c         S` s   d j  |  j d   S(   Ns   metadata {0}i    (   t   formatt   group(   t   m(    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyt   sub_metadata#   s    s	   metadata s   
N(   t
   splitlinest   _re_metadata_deft   matcht   Nonet   _re_metadata_correct_usaget   searcht   replacet   _re_metadata_reft   subt   lstript   appendt   join(   t   irt   buft   lineR	   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyt   add_metadata_type   s    	c         C` s   d   } t  j | |   S(   s5   
    HLC does not like variable with '.' prefix.
    c         S` s   d j  |  j d   S(   Ns
   %_dot_.{0}i   (   R   R   (   t   mat(    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyt   repl1   s    (   t   _re_regnameR   (   t   llvmirR   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyt   rename_register-   s    	c         C` s   d   } t  j | |   S(   s4   
    HLC does not like a label with '.' prefix.
    c         S` s   d j  |  j d   S(   Ns
   _dot_.{0}:i   (   R   R   (   R   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyR   ;   s    (   t   _re_labelnameR   (   R   R   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyt   rename_label7   s    	c         C` s   t  |   }  t |   }  |  S(   s@   
    Adapt the LLVM IR to match the syntax required by HLC.
    (   R   R    (   R   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyt   adapt_llvm_versionA   s    c         C` s,  |  j    } d } g  } x| D]ό } d | k rt j |  j   \ } } } t j |  } | r― | j   \ }	 }
 |
 j   }
 d } | |	 |
 f } | |	 |
 | f } n | j   } | | } d | | f } d } | | | | | f } | j |  | j |  q | j |  q Wd j |  S(   s½   
    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.
    t   __tmpt   allocas   %s"%s"s   %s = %s, addrspace(5)s:   %s = addrspacecast %s addrspace(5)* %s to %s addrspace(0)*s   
(   R
   t   _re_alloca_partsR   t   groupst   _re_alloca_quotedt   stripR   R   (   R   t   linest   manglet   new_irt   lt   assigneet   alloca_matcht   ptrtyt   q_matcht   startt   vart   name_fmtt   old_namet   new_namet
   allocalinet   castline_fmtt   castline(    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyt   alloca_addrspace_correctionK   s,    
t   _AMDGCNModulec           B` s;   e  Z d  Z e d    Z e d    Z e d    Z RS(   s)   
    The AMDCGN LLVM module contract
    c         C` s   d  S(   N(    (   t   selfR   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyt	   load_llvms   s    c         C` s   d  S(   N(    (   R:   t   main(    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyt   link_builtinsw   s    c         C` s   d  S(   N(    (   R:   R   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyt   generateGCN{   s    (   t   __name__t
   __module__t   __doc__R   R;   R=   R>   (    (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyR9   m   s   t   AMDGCNModulec        	   B` s\   e  Z d  Z d d d d d d d d d	 g	 Z d
   Z d   Z d   Z d   Z d   Z RS(   s)   
    The AMDCGN LLVM module contract
    s   opencl.amdgcn.bcs   ocml.amdgcn.bcs   ockl.amdgcn.bcs)   oclc_correctly_rounded_sqrt_off.amdgcn.bcs   oclc_daz_opt_off.amdgcn.bcs   oclc_finite_only_off.amdgcn.bcs   oclc_isa_version_803.amdgcn.bcs   oclc_unsafe_math_off.amdgcn.bcs   irif.amdgcn.bcc         C` s   t  |  _ d  S(   N(   t   Falset
   _finalized(   R:   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyt   __init__   s    c         C` s   t  |  } t |  } | S(   N(   R!   R8   (   R:   R   t   version_adaptedt   alloca_fixed(    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyt   _preprocess   s    c         C` s   d  S(   N(    (   R:   R   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyR;      s    c         C` s   d  S(   N(    (   R:   R<   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyR=      s    c         C` s   d  S(   N(    (   R:   (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyR>      s    (	   R?   R@   RA   t   bitcodesRE   RH   R;   R=   R>   (    (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyRB      s   					(   RA   t
   __future__R    R   R   t   abcR   R   t   numbaR   t   ret   compilet   IR   R   R   R   R   R&   R$   R   R   R    R!   R8   t   add_metaclasst   objectR9   RB   (    (    (    s3   lib/python2.7/site-packages/numba/roc/hlc/common.pyt   <module>   s&   		
	
	
	"