
\K]c        	   @` s  d  d l  m Z m Z m Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l	 j
 j Z d  d l j
 j Z d  d l j Z d  d l j Z d  d l m Z m Z m Z d  d l m Z d  d l m Z d  d l m Z e  d d d	 d
 d d d d g  Z! d   Z" d   Z# d e$ f d     YZ% d e$ f d     YZ& d e& f d     YZ' d e& f d     YZ( d e$ f d     YZ) d   Z* d e$ f d     YZ+ d e$ f d     YZ, d  e, f d!     YZ- d" e, f d#     YZ. d$   Z/ d%   Z0 d S(&   i    (   t   print_functiont   divisiont   absolute_importN(   t   configt   utilst   cgutils(   t   remove_redundant_nrt_refct(   t   rtsys(   t   require_global_compiler_lockt   x86t   i386t   i486t   i586t   i686t   i786t   i886t   i986c         C` s   |  j  d  d } | t k S(   Nt   -i    (   t   splitt   _x86arch(   t   triplet   arch(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   _is_x86   s    c         C` s2   t  |  j d d   t  |  t  d d  d  S(   NiP   R   t   =(   t   printt   center(   t   headert   body(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   dump   s    
t   _CFGc           B` s/   e  Z d  Z d   Z d e d  Z d   Z RS(   s  
    Wraps the CFG graph for different display method.

    Instance of the class can be stringified (``__repr__`` is defined) to get
    the graph in DOT format.  The ``.display()`` method plots the graph in
    PDF.  If in IPython notebook, the returned image can be inlined.
    c         C` s   | |  _  d  S(   N(   t   dot(   t   selfR   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   __init__*   s    c         C` s   t  j |  j d | d | S(   sC  
        Plot the CFG.  In IPython notebook, the return image object can be
        inlined.

        The *filename* option can be set to a specific path for the rendered
        output to write to.  If *view* option is True, the plot is opened by
        the system default application for the image format (PDF).
        t   filenamet   view(   t   llt   view_dot_graphR   (   R   R!   R"   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   display-   s    	c         C` s   |  j  S(   N(   R   (   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   __repr__8   s    N(   t   __name__t
   __module__t   __doc__R    t   Nonet   FalseR%   R&   (    (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR   "   s   	t   CodeLibraryc           B` sd  e  Z d  Z e Z e Z e Z d   Z e d    Z	 e d    Z
 d   Z d   Z d   Z d   Z d   Z d	   Z d
   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z  d   Z! e" d    Z# e" d    Z$ e" d    Z% d   Z& d   Z' e" d     Z( RS(!   s   
    An interface for bundling LLVM code together and compiling it.
    It is tied to a *codegen* instance (e.g. JITCPUCodegen) that will
    determine how the LLVM code is transformed and linked together.
    c         C` sp   | |  _  | |  _ g  |  _ t j t |  j  j |  j    |  _ t j	 |  j  |  j _
 d  |  _ g  |  _ d  S(   N(   t   _codegent   _namet   _linking_librariesR#   t   parse_assemblyt   strt   _create_empty_modulet   _final_moduleR   t   normalize_ir_textt   nameR*   t   _shared_modulet   _dynamic_globals(   R   t   codegenR5   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR    G   s    			!	c         C` s   |  j    t |  j  d k S(   Ni    (   t   _ensure_finalizedt   lenR7   (   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   has_dynamic_globalsR   s    
c         C` s   |  j  S(   s9   
        The codegen object owning this library.
        (   R-   (   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR8   W   s    c         C` s   d |  j  t |   f S(   Ns   <Library %r at 0x%x>(   R.   t   id(   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR&   ^   s    c         C` s#   |  j  r t d |  f   n  d  S(   Ns+   operation impossible on finalized object %r(   t
   _finalizedt   RuntimeError(   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   _raise_if_finalizeda   s    	c         C` s   |  j  s |  j   n  d  S(   N(   R=   t   finalize(   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR9   f   s    	c         C` sc   |  j  j | _ |  j  j |  < } x2 | j D]' } | j   | j |  | j   q. WWd QXd S(   sP   
        Internal: run function-level optimizations inside *ll_module*.
        N(   R-   t   _data_layoutt   data_layoutt   _function_pass_managert	   functionst
   initializet   runR@   (   R   t	   ll_modulet   fpmt   func(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   _optimize_functionsj   s    
c         C` s,   |  j  j j |  j  t |  j  |  _ d S(   sA   
        Internal: optimize this library's final module.
        N(   R-   t   _mpmRF   R3   R   (   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   _optimize_final_modulex   s    c         C` s   |  j    |  j d k	 r  |  j S|  j } g  } d } xM | j D]B } | d 7} | j r? | j t j j	 k r? | j
 | j  q? q? W| d k r t d |  f   n  | r | j   } x# | D] } d | j |  _ q Wn  | |  _ | S(   s:  
        Internal: get a LLVM module suitable for linking multiple times
        into another library.  Exported functions are made "linkonce_odr"
        to allow for multiple definitions, inlining, and removal of
        unused exports.

        See discussion in https://github.com/numba/numba/pull/890
        i    i   s7   library unfit for linking: no available functions in %st   linkonce_odrN(   R9   R6   R*   R3   RD   t   is_declarationt   linkageR#   t   Linkaget   externalt   appendR5   R>   t   clonet   get_function(   R   t   modt   to_fixt   nfuncst   fnR5   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   _get_module_for_linking   s&    	
	
	c         C` s    |  j    |  j j |  } | S(   sB   
        Create a LLVM IR module for use by this library.
        (   R?   R-   R2   (   R   R5   t	   ir_module(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   create_ir_module   s    
c         C` s   | j    |  j j |  d S(   sk   
        Add a library for linking into this library, without losing
        the original library.
        N(   R9   R/   RR   (   R   t   library(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   add_linking_library   s    
c         C` sm   |  j    t | t j  s" t  t j t |   } t j	 |  } | j
 | _
 | j   |  j |  d S(   sB   
        Add a LLVM IR module's contents to this library.
        N(   R?   t
   isinstancet   llvmirt   Modulet   AssertionErrorR   R4   R1   R#   R0   R5   t   verifyt   add_llvm_module(   R   RZ   t   irRG   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   add_ir_module   s    

c         C` s-   |  j  |  t |  } |  j j |  d  S(   N(   RJ   R   R3   t   link_in(   R   RG   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyRc      s    c         C` s   t    |  j j   |  j   t j rD t d |  j |  j    n  t	   } xI |  j
 D]> } | | k rW | j |  |  j j | j   d t qW qW W|  j   |  j j   |  j   d S(   s   
        Finalize the library.  After this call, nothing can be added anymore.
        Finalization involves various stages of code optimization and
        linking.
        s   FUNCTION OPTIMIZED DUMP %st   preserveN(   R   R-   t   _check_llvm_bugsR?   R   t   DUMP_FUNC_OPTR   R.   t   get_llvm_strt   setR/   t   addR3   Rf   RY   t   TrueRL   Rb   t   _finalize_final_module(   R   t   seenR\   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR@      s    
			
c         C` sC   x< |  j  j D]. } | j j d  r |  j j | j  q q Wd  S(   Ns   numba.dynamic.globals(   R3   t   global_variablesR5   t
   startswithR7   RR   (   R   t   gv(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   _finalize_dyanmic_globals   s    c         C` sW   xP |  j  j D]B } | j r | j j d  r d } t | j | j    q q Wd  S(   Nt	   _ZN5numbas   Symbol {} not linked properly(   R3   RD   RN   R5   Rq   Ra   t   format(   R   RX   t   msg(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   _verify_declare_only_symbols   s    c         C` s   |  j    |  j   t j |   |  j _ |  j j |  j  } | rW t j	 |  |  n  |  j
   t |  _ t j r t d |  j |  j    n  t j r |  j   } | r t d |  j |  j    q n  d S(   s?   
        Make the underlying LLVM module ready to use.
        s   OPTIMIZED DUMP %ss   ASSEMBLY %sN(   Rs   Rw   t   weakreft   proxyR3   t   _CodeLibrary__libraryR-   t   _add_moduleR   R@   t   _finalize_specificRm   R=   R   t   DUMP_OPTIMIZEDR   R.   Rj   t   DUMP_ASSEMBLYt   get_asm_str(   R   t   cleanupt   asm(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyRn      s    


			c         c` s2   |  j  } x" | j D] } | j s | Vq q Wd S(   sj   
        Get all functions defined in the library.  The library must have
        been finalized.
        N(   R3   RD   RN   (   R   RU   RX   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   get_defined_functions  s    		c         C` s   |  j  j |  S(   N(   R3   RT   (   R   R5   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyRT     s    c         C` s   |  j  r t j d  n  d  S(   Ns@   Inspection disabled for cached code. Invalid result is returned.(   t   _disable_inspectiont   warningst   warn(   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt    _sentry_cache_disable_inspection  s    	c         C` s   |  j    t |  j  S(   sA   
        Get the human-readable form of the LLVM module.
        (   R   R1   R3   (   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyRj   "  s    
c         C` s&   |  j    t |  j j j |  j   S(   s2   
        Get the human-readable assembly.
        (   R   R1   R-   t   _tmt   emit_assemblyR3   (   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR   )  s    
c         C` s2   |  j    |  j |  } t j |  } t |  S(   s=   
        Get control-flow graph of the LLVM function
        (   R   RT   R#   t   get_function_cfgR   (   R   R5   RX   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR   0  s    
c         C` s   t  |  _ d  |  _ t |  _ d  S(   N(   Rm   t   _object_caching_enabledR*   t   _compiled_objectR+   t	   _compiled(   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   enable_object_caching=  s    		c         C` sK   |  j  s t d |  f   n  |  j d  k rD t d |  f   n  |  j S(   Ns    object caching not enabled in %ss   no compiled object yet for %s(   R   t
   ValueErrorR   R*   R>   (   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   _get_compiled_objectB  s
    	c         C` sT   |  j  s t d |  f   n  |  j r> t d |  f   n  | |  _ t |  _ d  S(   Ns    object caching not enabled in %ss   library already compiled: %s(   R   R   R   R   Rm   R   (   R   t   value(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   _set_compiled_objectI  s    			c   	      C` s  d d l  m } d d l m } d d l m } | | |   } t d  x | j   D] } | d d k rY t | j	   d d	   } t d
  xp | D]e } | j
 s q n  t d | j
 j   | d | d | j | d d  | j | d d  f  q WqY qY Wt   d S(   sw   
        Dump the symbol table of an ELF file.
        Needs pyelftools (https://github.com/eliben/pyelftools)
        i    (   t   ELFFile(   t   descriptions(   t   BytesIOs	   ELF file:t   sh_typet
   SHT_SYMTABt   keyc         S` s   |  j  S(   N(   R5   (   t   sym(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   <lambda>^  t    s       symbols:s/       - %r: size=%d, value=0x%x, type=%s, bind=%st   st_sizet   st_valuet   st_infot   typet   bindN(   t   elftools.elf.elffileR   t   elftools.elfR   t   ioR   R   t   iter_sectionst   sortedt   iter_symbolsR5   t   decodet   describe_symbol_typet   describe_symbol_bind(	   t   clst   bufR   R   R   t   ft   sect   symbolsR   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt	   _dump_elfQ  s&    

	'c         C` sD   y | j  } Wn t k
 r! d SX| j r@ t | _ | | _ n  d S(   sB   
        `ll_module` was compiled into object code `buf`.
        N(   Rz   t   AttributeErrorR   Rm   R   R   (   R   RG   R   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   _object_compiled_hookl  s    		c         C` sN   y | j  } Wn t k
 r! d SX| j rJ | j rJ | j } d | _ | Sd S(   s>   
        Return a cached object code for `ll_module`.
        N(   Rz   R   R   R   R*   (   R   RG   R   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   _object_getbuffer_hooky  s    		c         C` s#   |  j    |  j d |  j j   f S(   sX   
        Serialize this library using its bitcode as the cached representation.
        t   bitcode(   R9   R.   R3   t
   as_bitcode(   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   serialize_using_bitcode  s    
c         C` s8   |  j    |  j   |  j   j   f } |  j d | f S(   s   
        Serialize this library using its object code as the cached
        representation.  We also include its bitcode for further inlining
        with other libraries.
        t   object(   R9   R   RY   R   R.   (   R   t   data(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   serialize_using_object_code  s    
	c   	      C` s   | \ } } } | j  |  } t | |   s3 t  | d k r_ t j |  | _ | j   | S| d k r | \ } } | j   | j |  t j |  | _	 | j   | j
 j j | j	  | St d | f   d  S(   NR   R   s!   unsupported serialization kind %r(   t   create_libraryR^   Ra   R#   t   parse_bitcodeR3   Rn   R   R   R6   R-   t   _enginet   _load_defined_symbolsR   (	   R   R8   t   stateR5   t   kindR   R   t   object_codet   shared_bitcode(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   _unserialize  s     


()   R'   R(   R)   R+   R=   R   R   R    t   propertyR;   R8   R&   R?   R9   RJ   RL   RY   R[   R]   Re   Rc   R@   Rs   Rw   Rn   R   RT   R   Rj   R   R   R   R   R   t   classmethodR   R   R   R   R   R   (    (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR,   <   sH   							#					 				
										t   AOTCodeLibraryc           B` s#   e  Z d    Z d   Z d   Z RS(   c         C` s    |  j    |  j j j |  j  S(   s   
        Return this library as a native object (a bytestring) -- for example
        ELF under Linux.

        This function implicitly calls .finalize().
        (   R9   R-   R   t   emit_objectR3   (   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   emit_native_object  s    
c         C` s   |  j    |  j j   S(   sz   
        Return this library as LLVM bitcode (a bytestring).

        This function implicitly calls .finalize().
        (   R9   R3   R   (   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   emit_bitcode  s    
c         C` s   d  S(   N(    (   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR|     s    (   R'   R(   R   R   R|   (    (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR     s   	
		t   JITCodeLibraryc           B` s   e  Z d    Z d   Z RS(   c         C` s@   |  j    |  j j } | j |  s) d S|  j j j |  Sd S(   s  
        Generate native code for function named *name* and return a pointer
        to the start of the function (as an integer).

        This function implicitly calls .finalize().

        Returns
        -------
        pointer : int
            - zero (null) if no symbol of *name* is defined by this code
              library.
            - non-zero if the symbol is defined.
        i    N(   R9   R-   R   t   is_symbol_definedt   get_function_address(   R   R5   t   ee(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   get_pointer_to_function  s
    
c         C` s'   |  j  j |  j  |  j  j j   d  S(   N(   R-   t   _scan_and_fix_unresolved_refsR3   R   t   finalize_object(   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR|     s    (   R'   R(   R   R|   (    (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR     s   	t   RuntimeLinkerc           B` s8   e  Z d  Z d Z d   Z d   Z d   Z d   Z RS(   sP   
    For tracking unresolved symbols generated at runtime due to recursion.
    s   .numba.unresolved$c         C` s(   t  j   |  _ t   |  _ g  |  _ d  S(   N(   R   t
   UniqueDictt   _unresolvedRk   t   _definedt	   _resolved(   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR      s    c         C` s   |  j  } x | j D] } | j j |  r | j t |  } | j | j  rV q n  t j j d  } t	 j
 |  } | j | t	 j |   | |  j | <q q Wd S(   sr   
        Scan and track all unresolved external symbols in the module and
        allocate memory for it.
        t   nrt_unresolved_abortN(   t   PREFIXRp   R5   Rq   R:   R   R   R\   R   t   ctypest   c_void_pt   add_global_mappingt	   addressofR   (   R   t   modulet   enginet   prefixRr   R   t   abortfnt   ptr(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   scan_unresolved_symbols  s    	c         C` s7   x0 | j  D]% } | j s
 |  j j | j  q
 q
 Wd S(   s5   
        Scan and track all defined symbols.
        N(   RD   RN   R   Rl   R5   (   R   R   RX   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   scan_defined_symbols  s    	c         C` s   g  |  j  D] } | |  j k r
 | ^ q
 } xS | D]K } | j |  } |  j  | } | | _ |  j j | | f  |  j  | =q2 Wd S(   s=   
        Fix unresolved symbols if they are defined.
        N(   R   R   R   R   R   RR   (   R   R   R5   t   pendingt   fnptrR   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   resolve  s    +	(   R'   R(   R)   R   R    R   R   R   (    (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR     s   			c         ` s"   t  j      f d    } | S(   Nc         ` s     |  j  | |  S(   N(   t   _ee(   R   t   argst   kwargs(   t   old(    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   wrapper  s    (   t	   functoolst   wraps(   R   R   (    (   R   s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   _proxy  s    t	   JitEnginec           B` s   e  Z d  Z d   Z d   Z d   Z d   Z d   Z e e	 j
 j  Z e e	 j
 j  Z e e	 j
 j  Z e e	 j
 j  Z RS(   s   Wraps an ExecutionEngine to provide custom symbol tracking.
    Since the symbol tracking is incomplete  (doesn't consider
    loaded code object), we are not putting it in llvmlite.
    c         C` s   | |  _  t   |  _ d  S(   N(   R   Rk   t   _defined_symbols(   R   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR    )  s    	
c         C` s   | |  j  k S(   s/   Is the symbol defined in this session?
        (   R   (   R   R5   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR   6  s    c         C` s:   x3 | j  | j f D] } |  j d   | D O_ q Wd S(   s(   Extract symbols from the module
        c         S` s"   h  |  ] } | j  s | j  q S(    (   RN   R5   (   t   .0Rr   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pys	   <setcomp>?  s   	 N(   RD   Rp   R   (   R   RU   t   gsets(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR   ;  s    c         C` s   |  j  |  |  j j |  S(   sX   Override ExecutionEngine.add_module
        to keep info about defined symbols.
        (   R   R   t
   add_module(   R   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR   B  s    c         C` s&   |  j  j | j  |  j j | |  S(   s`   Override ExecutionEngine.add_global_mapping
        to keep info about defined symbols.
        (   R   Rl   R5   R   R   (   R   Rr   t   addr(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR   I  s    (   R'   R(   R)   R    R   R   R   R   R   R#   t   ExecutionEnginet   set_object_cacheR   R   t   get_global_value_address(    (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR   $  s   					
t   BaseCPUCodegenc           B` s   e  Z d    Z d   Z d   Z e d    Z d   Z d   Z d   Z	 d   Z
 d   Z d	   Z d
   Z d   Z d   Z d   Z d   Z RS(   c         C` s]   t    d  |  _ t j t |  j |    |  _ d |  j _ t	   |  _
 |  j |  j  d  S(   Nt   global_codegen_module(   t   initialize_llvmR*   RA   R#   R0   R1   R2   t   _llvm_moduleR5   R   t	   _rtlinkert   _init(   R   t   module_name(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR    \  s    	c         C` s  t  | j  g  k s! t d   t j j t j    } t d t j	  } |  j
   |  _ |  j |  | j |   } t j | |  } t j r | j   n  | |  _ t |  |  _ | j |  _ t |  j  |  _ |  j   |  _ |  j j |  j j |  j j  d  S(   Ns   Module isn't emptyt   opt(   t   listRp   Ra   R#   t   Targett   from_triplet   get_process_triplet   dictR   t   OPTt   _customize_tm_featurest   _tm_featurest   _customize_tm_optionst   create_target_machinet   create_mcjit_compilert   ENABLE_PROFILINGt   enable_jit_eventsR   R   R   t   target_datat   _target_dataR1   RA   t   _module_pass_managerRK   R   t   _library_classR   R   (   R   t   llvm_modulet   targett
   tm_optionst   tmR   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR   f  s     !		c         C` sC   t  j t j |   } t j   | _ |  j r? |  j | _ n  | S(   N(	   t   lcR`   R   R4   R#   R   R   RA   RB   (   R   R5   RZ   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR2   |  s
    	c         C` s   |  j  S(   sJ   
        The LLVM "target data" object for this codegen instance.
        (   R
  (   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR	    s    c         C` s   |  j  |  |  S(   sb   
        Create a :class:`CodeLibrary` object for use with this codegen
        instance.
        (   R  (   R   R5   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR     s    c         C` s   |  j  j |  |  S(   N(   R  R   (   R   t
   serialized(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   unserialize_library  s    c         C` sB   t  j   } |  j j |  |  j    } | j |  Wd  QX| S(   N(   R#   t   create_module_pass_managerR   t   add_analysis_passest   _pass_manager_buildert   populate(   R   t   pmt   pmb(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR    s
    c         C` sE   t  j |  } |  j j |  |  j    } | j |  Wd  QX| S(   N(   R#   t   create_function_pass_managerR   R  R  R  (   R   R  R  R  (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyRC     s
    c         C` s"   t  j d t j d t j  } | S(   s  
        Create a PassManagerBuilder.

        Note: a PassManagerBuilder seems good only for one use, so you
        should call this method each time you want to populate a module
        or function pass manager.  Otherwise some optimizations will be
        missed...
        R   t   loop_vectorize(   t   lpt   create_pass_manager_builderR   R  t   LOOP_VECTORIZE(   R   R  (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR    s    		c         C` s   d } t  j |  } t |  } d | k s9 d | k r= d Sd | k rk t j   } t d | f   n  t d | f   d S(   s<   
        Guard against some well-known LLVM bug(s).
        so   
            define double @func()
            {
                ret double 1.23e+01
            }
            s   12.3s   1.23Ns   1.0s   LLVM will produce incorrect floating-point code in the current locale %s.
Please read http://numba.pydata.org/numba-doc/latest/user/faq.html#llvm-locale-bug for more information.s   Unexpected IR:
%s
(   R#   R0   R1   t   localet	   getlocaleR>   Ra   (   R   Rd   RU   t   ir_outt   loc(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyRh     s    c         C` s   |  j  j |  j   |  j f S(   sP   
        Return a tuple unambiguously describing the codegen behaviour.
        (   R   R   t   _get_host_cpu_nameR  (   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   magic_tuple  s    c         C` s=   |  j  j | |  j  |  j  j |  |  j  j |  j  d  S(   N(   R   R   R   R   R   (   R   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR     s    c         C` s   t  j d  j   } |  j j | } | j } y | j |  } Wn2 t k
 ru t  j | | d | } d | _	 n X| j
 | j |  | j    S(   Ni   R5   RQ   (   R_   t   IntTypet
   as_pointerR   R   R   t
   get_globalt   KeyErrort   GlobalVariableRO   t   bitcastt   load(   R   t   buildert   fntyR5   t   voidptrt   ptrnamet   llvm_modR   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   insert_unresolved_ref  s    	c         C` s    t  j d  k r t j   St  j S(   N(   R   t   CPU_NAMER*   R#   t   get_host_cpu_name(   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR#    s    c         C` s   t  j d  k	 r t  j St   S(   N(   R   t   CPU_FEATURESR*   t   get_host_cpu_features(   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   _get_host_cpu_features  s    (   R'   R(   R    R   R2   R   R	  R   R  R  RC   R  Rh   R$  R   R1  R#  R6  (    (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR   Z  s   	
												t   AOTCPUCodegenc           B` s;   e  Z d  Z e Z d d  Z d   Z d   Z d   Z	 RS(   sp   
    A codegen implementation suitable for Ahead-Of-Time compilation
    (e.g. generation of object files).
    c         C` s#   | p	 d |  _  t j |  |  d  S(   NR   (   t	   _cpu_nameR   R    (   R   R   t   cpu_name(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR      s    c         C` sS   |  j  } | d k r$ |  j   } n  | | d <d | d <d | d <|  j | d <d  S(   Nt   hostt   cput   pict   reloct   defaultt	   codemodelt   features(   R8  R#  R  (   R   t   optionsR9  (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR    s    	


c         C` s   d S(   NR   (    (   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR    s    c         C` s   d  S(   N(    (   R   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR{   
  s    N(
   R'   R(   R)   R   R  R*   R    R  R  R{   (    (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR7    s   			t   JITCPUCodegenc           B` s8   e  Z d  Z e Z d   Z d   Z d   Z d   Z RS(   sI   
    A codegen implementation suitable for Just-In-Time compilation.
    c         C` so   |  j    | d <t j j   j } | j d  r: d } n d } | | d <d | d <|  j | d <t | d	 <d  S(
   NR;  R	   t   staticR>  R=  t
   jitdefaultR?  R@  t   jitdebug(   R#  R#   R   t   from_default_tripleR5   Rq   R  Rm   (   R   RA  R   t   reloc_model(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR    s    	

c         C` s
   |  j    S(   N(   R6  (   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR  +  s    c         C` s   |  j  j |  d  S(   N(   R   R   (   R   R   (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR{   /  s    c         C` sE   |  j  j |  } t j d j |  } t j t |   | d <d S(   sr   Set the environment address.

        Update the GlobalVariable named *env_name* to the address of *env*.
        i   i    N(   R   R   R   R   t   from_addressR<   (   R   t   env_namet   envt   gvaddrt   envptr(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   set_env7  s    (	   R'   R(   R)   R   R  R  R  R{   RM  (    (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyRB    s   			c           C` s"   t  j   t  j   t  j   d S(   s    Safe to use multiple times.
    N(   R#   RE   t   initialize_native_targett   initialize_native_asmprinter(    (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR   A  s    

c          C` sl   y t  j   }  Wn t k
 r$ d SXt j s^ x- |  D]" } | j d  r5 t |  | <q5 q5 Wn  |  j   Sd S(   s~   Get host CPU features using LLVM.

    The features may be modified due to user setting.
    See numba.config.ENABLE_AVX.
    R   t   avxN(   R#   R5  R>   R   t
   ENABLE_AVXRq   R+   t   flatten(   R@  t   k(    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyR5  I  s    	(1   t
   __future__R    R   R   R   R   R  Rx   R   t   llvmlite.llvmpy.coret   llvmpyt   coreR  t   llvmlite.llvmpy.passest   passesR  t   llvmlite.bindingt   bindingR#   t   llvmlite.irRd   R_   t   numbaR   R   R   t   numba.runtime.nrtoptR   t   numba.runtimeR   t   numba.compiler_lockR   t	   frozensetR   R   R   R   R   R,   R   R   R   R   R   R   R7  RB  R   R5  (    (    (    s4   lib/python2.7/site-packages/numba/targets/codegen.pyt   <module>   s<   		 u8	63	