
    J/Ph                     D   d dl Z d dlZd dl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m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 d dlmZ d dlmZ d d	lmZ d d
l m!Z!  e"g d          Z#d Z$d Z%d Z& G d de'          Z( G d de          Z) G d de)          Z* G d de*          Z+ G d de*          Z, G d de'          Z-d Z. G d de'          Z/ G d d e          Z0 G d! d"e0          Z1 G d# d$e1          Z2 G d% d&e1          Z3d' Z4d( Z5dS ))    N)abstractmethodABCMeta)utilsconfigcgutils)create_pass_manager_builder)remove_redundant_nrt_refct)rtsys)require_global_compiler_lock)NumbaInvalidConfigWarning)disassemble_elf_to_cfg)PassTimingsCollection)x86i386i486i586i686i786i886i986c                 J    |                      d          d         }|t          v S )N-r   )split_x86arch)triplearchs     R/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/numba/core/codegen.py_is_x86r      s#    <<QD8    c                  <   t           j                            d          } | sdS d}| D ]s}|                                }	 |t	          t
          j        |                                          z  }G# t          $ r  t          j
        d|t                     Y pw xY w|S )zParse refprune flags from the `config`.

    Invalid values are ignored an warn via a `NumbaInvalidConfigWarning`
    category.

    Returns
    -------
    flags : llvmlite.binding.RefPruneSubpasses
    ,r   zinvalid refprune flags )r   LLVM_REFPRUNE_FLAGSr   stripgetattrllRefPruneSubpassesupperAttributeErrorwarningswarnr   )flagsvalitems      r   _parse_refprune_flagsr.       s     &,,S11E q
C 5 5zz||	572/>>>CC 	5 	5 	5M<D<<35 5 5 5 5	5 Js   /A//'BBc                 |  	
 t           j        rX	 dd l}ddlm ddlm} ddlm} ddlm	 ddl	m

 ||d}||         	
fd}n&# t          $ r d	}t          |          w xY wt          }t          d
           t          |                     dd                      ||           t          d
           d S )Nr   )	highlight)GasLexer)	LlvmLexer)Terminal256Formatter)by_colorscheme)llvmasmc           
      p    t           |                                                           d S )N)style)print)argr3   r4   r0   lexers    r   printerzdump.<locals>.printerH   sW    iiUUWW**1A1ABBBD D E E E E Er   z0Please install pygments to see highlighted dumpszP================================================================================P   r   )r   HIGHLIGHT_DUMPSpygmentsr0   pygments.lexersr1   r2   pygments.formattersr3   numba.misc.dump_styler4   ImportError
ValueErrorr9   center)headerbodylangr?   	gas_lexer
llvm_lexer	lexer_mapr<   msgr3   r4   r0   r;   s            @@@@r   dumprM   8   s@    	EOOO
 +*****======??????@@@@@@<<<<<<!+I>>IdOEE E E E E E E E E  	" 	" 	"DCS//!	"  	(OOO	&--C
 
 !!!GDMMM	(OOOOOs   A
 
A&c                   <    e Zd ZdZd Z	 	 	 	 ddZdd	Zd
 Zd ZdS )_CFGa  
    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                     || _         || _        || _        |                    |          }t	          j        |          | _        || _        d S N)cresnamepy_funcget_functionr%   get_function_cfgdotkwargs)selfrR   rS   rT   rX   fns         r   __init__z_CFG.__init__[   sG    		t$$&r**r   NTF
   c	                   KLMNOPQRSTUVWX ddl SddlWddl}	ddl}
ddlm} ddlm} ddlm	} ddl
m} d} |||||||||          } |||	          Kd
 } |||            |K|            |d           NdNd<   dNd<   dNd<   dNd<   dNd<   dNd<   dNd<   dNd<   dNd<   dNd<   d Nd!<   | j                            | j                  }| j                                        }Wfd"} ||          USfd#} || j        | j        |          }W                    d$          }W                    d%          }W                    d&          Vd'}W                    |          TW                    d(          }W                    d)          }W                    d*          }W                    d+          }W                    d,          }W                    d-          }W                    d.          } W                    d/          }!d0 }"d1 Li }#i }$Kj        r|
                    | j                  \  XQ |j        |                              d2d3          }%S                    |%                              d45          }&|	                    |&                    d6                    }'d}(|'d7         D ]})d8\  PO|)d9         }*|)d:         }+|)d;         },|+|#|,<   |*d<d=         }*|*                    d>          }-g }.d<Md3}/|                    |-d=                   }0|-}1|0|0                                d         }2|2                    d?          }3t;          |3          Md@}4g }5|j        rNd         Nd         dA}6ni }6|3D ]l}7|                    |7                                          \  }8}9|6                    |9dB          }:|5                     |4!                    |:|8|9                     md3"                    |5          }/|-dd=         }1dC};|.                     |;!                    NdD         M L|1d         #                                                               dERKLMNOPQRTUVXfdF}<|1d<d         D ]}=|                    |=          rKj$        sKj        r |<|=|.          }>|>|>\  PO|j%        r|&                    |=          r	Nd         }?n|j'        r|&                    |=          r	Nd         }?n|j(        r|&                    |=          r	Nd         }?n|j)        r| &                    |=          r	Nd         }?nw|j*        r|!&                    |=          r	Nd         }?nR|j+        r|&                    |=          r	Nd         }?n-|j,        r|&                    |=          r	Nd!         }?nNdD         }?|?NdD         us|sA |" L|=                    D ],}@|.                     R!                    |?M|@                     -|/r(|.                     dG!                    |/                     d3"                    |.          }A|ArdH|(dI|AdJ}BdK!                    |B          }*nd3}*|-                    |+|*L           dM|'v r=|'dM         D ]4}C|Cd;         },|C                    dNd          }D|CdO         |CdP         |Df|$|,<   5|$.                                D ]I\  },}C|#|Cd<                  }E|#|Cd                  }F|CdQ         }G|G|EdR|Gz  z  }E|/                    |E|F           J|rg }HN.                                D ].\  }I}J|H                     dS!                    |J|I                     /|-                    dTdU!                    d3"                    |H                    L           |||0                    |||V           |                    dW5          S )Xz
        "Pretty" prints the DOT graph of the CFG.
        For explanation of the parameters see the docstring for
        numba.core.dispatcher::inspect_cfg.
        r   N)binding)List)SimpleNamespace)defaultdictF)increfdecrefreturnsraisesmeminfobranchesllvm_intrin_callsfunction_calls)pythonlineinfoc                 H   t          |t                    r| j        D ]}t          | ||           dS t          |t                    rs|                                D ]\\  }}|| j        vrt          d|z            t          |t                    rt          | ||           Gd}t          |||fz            dS t          |t                    r3|D ].}|| j        vrt          d|z            t          | |d           /dS d}t          |t          |          z            )z Parses the kwarg into a consistent format for use in configuring
            the Digraph rendering. _config is the configuration instance to
            update, kwarg is the kwarg on which to base the updates.
            zUnexpected key in kwarg: %sz$Unexpected value for key: %s, got:%sTz)Unhandled configuration type for kwarg %sN)	
isinstancebool__dict__setattrdictitemsrD   settype)_configkwargattrkvrL   r-   s          r   parse_configz)_CFG.pretty_printer.<locals>.parse_config   sg   
 %&& 4#, 2 2DGT511112 2E4(( 4!KKMM 7 7DAq 000()F)JKKK!!T** 7A....D(1v6667 7 E3'' 4! 5 5D7#333()F)MNNNt4444	5 5 B tE{{!2333r   c                      dS )Nwhite r}   r   r   <lambda>z%_CFG.pretty_printer.<locals>.<lambda>   s     r   orangemarkeryellowrj   greentruebrredfalsebrcyanrb   	turquoiserc   	lightpinkraiselightseagreenrf   purplereturn	rosybrownrh   tomatori   c                 
   i }                     d          }|                                 D ]U}|                    |          }|<|                                }|&t	          |          dk    sJ |d         ||d         <   V|S )z Gets the metadata entries from the LLVM IR, these look something
            like '!123 = INFORMATION'. Returns a map of metadata key to metadata
            value, i.e. from the example {'!123': INFORMATION}z(^[!][0-9]+)(\s+=\s+.*)N      r   )compile
splitlinesmatchgroupslen)llvm_strmdmetadata_entryxr   gres         r   get_metadataz)_CFG.pretty_printer.<locals>.get_metadata   s     BZZ(BCCN((** ( (&,,Q//$A}"1vv{{{{#$Q41Q4Ir   c                 0   d}t          |          |k    r*d| d}t          j        |t                     |d |         }                    | |          }|                    d           |                    ddd	t          |          z  
           |S )N   zCFG output filename "z9" exceeds maximum supported length, it will be truncated.)filenameTB)rankdirnodenonez%s)shapefontsize)r   r)   r*   r   Digraphrw   str)rS   fnamer   cmaxwstrfgvs         r   init_digraphz)_CFG.pretty_printer.<locals>.init_digraph   s     D5zzD  C C C Cd$=>>>ete

4%
00AFF4F   FF6$X2FFGGGHr   z
.*{(.*)}.*z.*<(.*)>(.*)z.*!dbg\s+(![0-9]+).*z7.*!DILocation\(line:\s+([0-9]+),\s+column:\s+([0-9]),.*z.*call void @llvm.dbg.value.*z@NRT_incref\bz@NRT_decref\bz@NRT_MemInfoz.*call.*@llvm\..*z.*call.*@.*z"store .*\!numba_exception_output.*zret i32 [^1],?.*c                 0    t          j        | dd          S )Nx   z... )widthsubsequent_indent)textwrapwrap)ss    r   r   z!_CFG.pretty_printer.<locals>.wrap   s    =#HHHHr   c                    d}t          |           |k    r:t          t          |                     }d                    | d |         |          } t	          j        |           } |                     dd          } |                     dd          } |                     dd          } |                     d	d
          } |                     dd          } | S )Ni,  z{}...<hash={}>z\{z&#123;z\}z&#125;\z&#92;%z&#37;!z&#33;)r   r   hashformathtmlescapereplace)r   nhss      r   cleanz"_CFG.pretty_printer.<locals>.clean   s     A1vvzza\\$++AbqbE266AA		%**A		%**A		$((A		#w''A		#w''AHr   z\l... dot_json)r   utf-8objects)r   labelrS   _gvidr   r   z\l|z<<td BGCOLOR="{}" BORDER="1" ALIGN="center" PORT="{}">{}</td>)TFr|   zF<tr><td BGCOLOR="{}" BORDER="1" ALIGN="left" COLSPAN="{}">{}</td></tr>defaultzF<tr><td BGCOLOR="{}" BORDER="0" ALIGN="left" COLSPAN="{}">{}</td></tr>c                 *                        |           }|q|                                }|\t          |          dk    s
J |            |d         }                    |d          }|                      |          }|
t          |                                          dk    s
J |            |                                \  }}|k    s|k    rj        rEd}	|	|||fz  }
                    d          |
                    }|                    |           j        r[t          |          dz   z
  }|dz            }                    d          |                    }|                    |           ||fS dS dS dS dS dS )z
                Search line `l` for metadata associated with python or line info
                and inject it into `new_lines` if requested.
                Nr   r   r   zMarker %s, Line %s, column %sr   rj   )	r   r   r   getrk   r   appendrj   int)l	new_linesmatchedr   r   
debug_dataldlinecolmfmt	mark_linelnlidxsource_line_interleaver   col_spancscur_colcur_linefirstlinenofmtlocation_entryr   metadata_markersrc_codes                 r   metadata_interleavez0_CFG.pretty_printer.<locals>.metadata_interleavei  s   
 *//22&((A}"1vv{{{A{{{!"1%'VVFD%9%9
%1 "0!5!5j!A!AB!~'*299;;'7'71'<'<'<b'<'<'<,.IIKK	c $(8#3#3sg~~'2'; %=/N48FD#;N4N	-0ZZ8h8=i8H8H.J .J(1(8(8(<(<(<'2'9 
%= 034yyK!O/L6>tax6H-0ZZ8h8=k8J8J.L .L(1(8(8(<(<(<+/9$4G '& %} 21  .~ 8F~r   z<tr>{}</tr>z<table id="z<" BORDER="1" CELLBORDER="0" CELLPADDING="0" CELLSPACING="0">z</table>z<{}>)r   edgestailportheadtailr   z:%sz;<tr><td BGCOLOR="{}" BORDER="0" ALIGN="center">{}</td></tr>Keyzn<<table BORDER="1" CELLBORDER="1" CELLPADDING="2" CELLSPACING="1"><tr><td BORDER="0">Key:</td></tr>{}</table>>)r   viewr   svg)1graphvizr   jsoninspectllvmliter^   numba.typedr_   typesr`   collectionsra   rR   rU   rS   get_llvm_strr   rj   getsourcelinesrT   rV   r   Sourcepipeloadsdecoder   r   r   r   rg   r   r   r   joinr#   rk   rb   searchrc   rf   re   rd   rh   ri   r   rr   edgerender)YrY   r   r   render_formatr0   
interleavestrip_irshow_keyr   r   r   r%   r_   r`   ra   _default
_highlightrz   rZ   r   r   r   r   
port_matchport_jmp_matchlocation_expr	dbg_value
nrt_incref
nrt_decrefnrt_meminfoll_intrin_callsll_function_callll_raise	ll_returnr   node_idsedge_idsraw_dot
json_bytesjzonidcobjr   rS   gvidlinesr   	port_liner   sliced_linesportsports_tokenstdfmttbl_datacolorstoktargetvaluecolor	fmtheaderr   r   updated_lineinfocolourr   dattabr   tpr   r   portkey_tabrx   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   sY                                                                              @@@@@@@@@@@@@@r   pretty_printerz_CFG.pretty_printerc   s
    				******$$$$$$))))))++++++$_H+3,4+3,4-56>3;> > >
 &oXIII	4 	4 	46 	Z+++[*--- [))88898"8!7'98"-' Y##DI..9))++	 	 	 	 	 \(##	 	 	 	 	$ LDIx88 ZZ--
N33**%<==4M22JJ?@@	ZZ 011
ZZ 011
jj00**%9::::n55::CDDJJ122		I 	I 	I
	 	 	,   	I$+$:$:4<$H$H!Hk
 &"%b))11(B??YYw'',,J,??
zz*++G4455	? q	& q	&C !'HgLEv;Dw<D!HTN !B$KEKK&&E I, H I &&uRy11G L"((+${{3//|,,-&  #%h<bmDDFFF' H HC$2$8$8$=$=$D$D$F$FMFE"JJug66EOOELL$F$FGGGGGGH--	  %SbSz5IY--bmX.3eLO4I4I4K4K.L.LN N O O O/C)5 )5 )5 )5 )5 )5 )5 )5 )5 )5 )5 )5 )5 )5 )5 )5V "!""% &J &J ??1%%  ' =;+= =':':1i'H'H$'3,<)' $ +):):1)=)= +\FF& +:+<+<Q+?+? +\FF' +K,>,>q,A,A +	]FF& 
+8??1+=+= 
+[FF' +I,<,<Q,?,? +\FF1 +o6L6LQ6O6O + 34FF. +3C3J3J13M3M + 01FF	]F
 I..h.!T%%((^^ J J!((FHa)H)HIIII  B  !5!5i!@!@AAA '')$$C  HKHKM c** FF4uF%%%% d??W B BG}XXj$//"&v,Vb!A #..** 	 	JD$DG$DDG$D7D$FF4  	KG

 ? ?1 !0171? ? ? ? FF5 "0178H8H1I1I  K K K
 4#3HHhT-HHHH vvUv###r   pdfc                 X     | j         d|||d| j        }|                    d          S )a  
        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). *format* can
        be any valid format string accepted by graphviz, default is 'pdf'.
        )r   r   r   r   r}   r-  rX   r   )rY   r   r   r   rawbyts        r   displayz_CFG.display  sJ     %$ JhT39J J=A[J J}}W%%%r   c                 L     | j         di | j                            d          S )Nr   r}   r0  rY   s    r   
_repr_svg_z_CFG._repr_svg_  s+    "t"11T[1188AAAr   c                     | j         S rQ   )rW   r4  s    r   __repr__z_CFG.__repr__  s	    xr   )NNNTFFTr\   )Nr.  F)	__name__
__module____qualname____doc__r[   r-  r2  r5  r7  r}   r   r   rO   rO   S   s            FJ!%BF "L$ L$ L$ L$\& & & &B B B    r   rO   c                   4   e Zd ZdZdZdZdZdddefdZe	d             Z
e	d             Ze	d	             Ze	d
             Zd Zd Zd Zd Zed             Zed             Zed             Zed             Zed             Zed             Zd Zd Zd ZdS )CodeLibraryz
    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.
    Fcodegen
CPUCodegenrS   c                     || _         || _        | j        j         d| j        d}t	          |          | _        g | _        d S )N())_codegen_name	__class__r8  r   _recorded_timings_dynamic_globals)rY   r>  rS   ptc_names       r   r[   zCodeLibrary.__init__  sK    
n-??
???!6x!@!@ "r   c                 Z    |                                   t          | j                  dk    S )Nr   )_ensure_finalizedr   rG  r4  s    r   has_dynamic_globalszCodeLibrary.has_dynamic_globals  s*       4())A--r   c                     | j         S rQ   )rF  r4  s    r   recorded_timingszCodeLibrary.recorded_timings  s    %%r   c                     | j         S )z9
        The codegen object owning this library.
        )rC  r4  s    r   r>  zCodeLibrary.codegen"  s    
 }r   c                     | j         S rQ   )rD  r4  s    r   rS   zCodeLibrary.name)  s
    zr   c                 4    d| j         t          |           fz  S )Nz<Library %r at 0x%x>)rS   idr4  s    r   r7  zCodeLibrary.__repr__-  s    %BtHH(===r   c                 8    | j         rt          d|           d S )Nz)operation impossible on finalized object )
_finalizedRuntimeErrorr4  s    r   _raise_if_finalizedzCodeLibrary._raise_if_finalized0  s4    ? 	*,"&$ ) * * *	* 	*r   c                 @    | j         s|                                  d S d S rQ   )rS  finalizer4  s    r   rJ  zCodeLibrary._ensure_finalized5  s'     	MMOOOOO	 	r   c                 b    |                                   | j                            |          }|S )zC
        Create an LLVM IR module for use by this library.
        )rU  rC  _create_empty_modulerY   rS   	ir_modules      r   create_ir_modulezCodeLibrary.create_ir_module9  s1     	  """M66t<<	r   c                     dS )zk
        Add a library for linking into this library, without losing
        the original library.
        Nr}   rY   librarys     r   add_linking_libraryzCodeLibrary.add_linking_libraryA        r   c                     dS )zC
        Add an LLVM IR module's contents to this library.
        Nr}   )rY   r[  s     r   add_ir_modulezCodeLibrary.add_ir_moduleH  ra  r   c                     dS )z
        Finalize the library.  After this call, nothing can be added anymore.
        Finalization involves various stages of code optimization and
        linking.
        Nr}   r4  s    r   rW  zCodeLibrary.finalizeN  ra  r   c                     dS )z5
        Return the function named ``name``.
        Nr}   rY   rS   s     r   rU   zCodeLibrary.get_functionV  ra  r   c                     dS )zA
        Get the human-readable form of the LLVM module.
        Nr}   r4  s    r   r   zCodeLibrary.get_llvm_str\  ra  r   c                     dS )z2
        Get the human-readable assembly.
        Nr}   r4  s    r   get_asm_strzCodeLibrary.get_asm_strb  ra  r   c                 0    d| _         d | _        d| _        d S )NTF)_object_caching_enabled_compiled_object	_compiledr4  s    r   enable_object_cachingz!CodeLibrary.enable_object_cachingl  s    '+$ $r   c                 t    | j         st          d|           | j        t          d|           | j        S )Nobject caching not enabled in zno compiled object yet for )rk  rD   rl  rT  r4  s    r   _get_compiled_objectz CodeLibrary._get_compiled_objectq  sJ    + 	K*44IJJJ (,$$HIII$$r   c                     | j         st          d|           | j        rt          d|           || _        d| _        d S )Nrp  zlibrary already compiled: T)rk  rD   rm  rl  _disable_inspection)rY   r#  s     r   _set_compiled_objectz CodeLibrary._set_compiled_objectx  sY    + 	K*44IJJJ> 	G*ttEFFF %#'   r   N)r8  r9  r:  r;  rS  rk  rs  r   r[   propertyrK  rM  r>  rS   r7  rU  rJ  r\  r   r`  rc  rW  rU   r   ri  rn  rq  rt  r}   r   r   r=  r=    s         J## #C # # # # . . X. & & X&   X   X> > >* * *
       ^   ^
   ^   ^
   ^
   ^  
% % %( ( ( ( (r   r=  )	metaclassc                        e Zd Z f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dZd Zed             Zed             Zed             Zd Zd Zed             Z xZS )CPUCodeLibraryc                 4   t                                          ||           g | _        t          j        t          | j                            | j                                      | _	        t          j        | j                  | j	        _        d | _        d S rQ   )superr[   _linking_librariesr%   parse_assemblyr   rC  rY  rS   _final_moduler   normalize_ir_text_shared_module)rY   r>  rS   rE  s      r   r[   zCPUCodeLibrary.__init__  s    $'''"$.2249==>>@ @")";DI"F"F"r   c                    | j         j        |_        | j                             |          5 }|j        D ]{}d|j        }| j                            |          5  |                                 |	                    |           |
                                 ddd           n# 1 swxY w Y   |	 ddd           dS # 1 swxY w Y   dS )zP
        Internal: run function-level optimizations inside *ll_module*.
        zFunction passes on N)rC  _data_layoutdata_layout_function_pass_manager	functionsrS   rF  record
initializerunrW  )rY   	ll_modulefpmfuncrx   s        r   _optimize_functionsz"CPUCodeLibrary._optimize_functions  sI   
 !% :	]11)<< 	# "+ # #7$)77+22155 # #NN$$$GGDMMMLLNNN# # # # # # # # # # # # # # ##	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s5   .B>>B$B>$B((B>+B(,B>>CCc                     | j                             | j         j        d| j         j        d          }| j                                         }d}| j                            |          5  |                    | j                   ddd           n# 1 swxY w Y   t          j	        st          | j                  | _        d}| j                            |          5  |                    | j                   ddd           dS # 1 swxY w Y   dS )zA
        Internal: optimize this library's final module.
        Fcheap)loop_vectorizeslp_vectorizeoptcostz/Module passes (cheap optimization for refprune)Nz!Module passes (full optimization))rC  _module_pass_manager	_loopvect
_opt_levelrF  r  r  r}  r   LLVM_REFPRUNE_PASSr	   )rY   	mpm_cheapmpm_full
cheap_name	full_names        r   _optimize_final_modulez%CPUCodeLibrary._optimize_final_module  s   
 M66dmF]16'+}'?(/ 7 1 1	
 =5577F
#**:66 	. 	. MM$,---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.
 ( 	P!;D<N!O!OD7	#**955 	- 	-LL+,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s$   (BBBDD
Dc                    |                                   | j        | j        S | j        }g }d}|j        D ]B}|dz  }|j        s4|j        t          j        j        k    r|	                    |j
                   C|dk    rt          d|           |r3|                                }|D ]}d|                    |          _        || _        |S )a:  
        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
        Nr   r   z5library unfit for linking: no available functions in linkonce_odr)rJ  r  r}  r  is_declarationlinkager%   Linkageexternalr   rS   rT  clonerU   )rY   modto_fixnfuncsrZ   rS   s         r   _get_module_for_linkingz&CPUCodeLibrary._get_module_for_linking  s     	   *&& - 	' 	'BaKF$ 'rz7J)J)Jbg&&&Q;; ,"&$ ) * * *  	@))++C @ @ 2@  &&..!
r   c                 b    |                                  | j                            |           d S rQ   )rJ  r{  r   r^  s     r   r`  z"CPUCodeLibrary.add_linking_library  s1    !!###&&w/////r   c                 :   |                                   t          |t          j                  sJ t	          j        t          |                    }t          j        |          }|j	        |_	        |
                                 |                     |           d S rQ   )rU  rm   llvmirModuler   r~  r   r%   r|  rS   verifyadd_llvm_module)rY   r[  irr  s       r   rc  zCPUCodeLibrary.add_ir_module  s      """)V]33333&s9~~66%b))	"	Y'''''r   c                     |                      |           t          j        st          |          }| j                            |           d S rQ   )r  r   r  r	   r}  link_in)rY   r  s     r   r  zCPUCodeLibrary.add_llvm_module  sK      +++( 	>29==I""9-----r   c                 *   t                       | j                                         |                                  t          j        r+t          d| j        z  |                                 d           t                      }| j
        D ]I}||vrC|                    |           | j                            |                                d           J|                                  | j                                         |                                  d S )NzFUNCTION OPTIMIZED DUMP %sr5   T)preserve)r   rC  _check_llvm_bugsrU  r   DUMP_FUNC_OPTrM   rS   r   rs   r{  addr}  r  r  r  r  _finalize_final_module)rY   seenr_  s      r   rW  zCPUCodeLibrary.finalize  s   $&&& 	&&(((  """ 	.-	9""$$f. . . uu. 	 	Gd""!!!"**3355 +    	##%%%!!#####%%%%%r   c                     | j         j        D ];}|j                            d          r| j                            |j                   <d S )Nznumba.dynamic.globals)r}  global_variablesrS   
startswithrG  r   )rY   r   s     r   _finalize_dynamic_globalsz(CPUCodeLibrary._finalize_dynamic_globals  sT    $5 	6 	6Bw!!"9:: 6%,,RW555	6 	6r   c                     | j         j        D ]L}|j        rC|j                            d          r)d}t          |                    |j                            Md S )N	_ZN5numbazSymbol {} not linked properly)r}  r  r  rS   r  AssertionErrorr   )rY   rZ   rL   s      r   _verify_declare_only_symbolsz+CPUCodeLibrary._verify_declare_only_symbols  se    $. 	: 	:B  :RW%7%7%D%D :5$SZZ%8%8999		: 	:r   c                    |                                   |                                  t          j        |           | j        _        | j                            | j                  }|rt          j        | |           | 	                                 d| _
        t          j        r+t          d| j        z  |                                 d           t          j        r-t          d| j        z  |                                 d           dS dS )z?
        Make the underlying LLVM module ready to use.
        TzOPTIMIZED DUMP %sr5   zASSEMBLY %sr6   N)r  r  weakrefproxyr}  _CPUCodeLibrary__libraryrC  _add_modulerW  _finalize_specificrS  r   DUMP_OPTIMIZEDrM   rS   r   DUMP_ASSEMBLYri  )rY   cleanups     r   r  z%CPUCodeLibrary._finalize_final_module  s    	&&((())+++ (/}T':':$
 -++D,>?? 	,T7+++!!!  	O$ty0$2C2C2E2EvNNN 	G*D,<,<,>,>FFFFF	G 	Gr   c              #   B   K   | j         }|j        D ]}|j        s|V  dS )zj
        Get all functions defined in the library.  The library must have
        been finalized.
        N)r}  r  r  )rY   r  rZ   s      r   get_defined_functionsz$CPUCodeLibrary.get_defined_functions/  s@      
  - 	 	B$ 	 	r   c                 6    | j                             |          S rQ   )r}  rU   rf  s     r   rU   zCPUCodeLibrary.get_function9  s    !..t444r   c                 @    | j         rt          j        d           d S d S )Nz@Inspection disabled for cached code. Invalid result is returned.)rs  r)   r*   r4  s    r    _sentry_cache_disable_inspectionz/CPUCodeLibrary._sentry_cache_disable_inspection<  s:    # 	9M 8 9 9 9 9 9	9 	9r   c                 R    |                                   t          | j                  S rQ   )r  r   r}  r4  s    r   r   zCPUCodeLibrary.get_llvm_strA  s%    --///4%&&&r   c                     |                                   t          | j        j                            | j                            S rQ   )r  r   rC  _tmemit_assemblyr}  r4  s    r   ri  zCPUCodeLibrary.get_asm_strE  s8    --///4=$2243EFFGGGr   Nc                 H    |                                   t          | ||fi |S )z=
        Get control-flow graph of the LLVM function
        )r  rO   )rY   rS   rT   rX   s       r   rV   zCPUCodeLibrary.get_function_cfgI  s0     	--///D$226222r   c                 J    |                                  }t          ||          S )aa  
        Get the CFG of the disassembly of the ELF object at symbol mangled_name.

        Requires python package: r2pipe
        Requires radare2 binary on $PATH.
        Notebook rendering requires python package: graphviz
        Optionally requires a compiler toolchain (via pycc) to link the ELF to
        get better disassembly results.
        )rq  r   )rY   mangled_nameelfs      r   get_disasm_cfgzCPUCodeLibrary.get_disasm_cfgP  s%     ''))%c<888r   c                 B   ddl m} ddlm} ddlm}  | ||                    }t          d           |                                D ]}|d         dk    rt          |	                                d 	          }t          d
           |D ]}|j
        s
t          d|j
                                        |d         |d         |                    |d         d                   |                    |d         d                   fz             t                       dS )zw
        Dump the symbol table of an ELF file.
        Needs pyelftools (https://github.com/eliben/pyelftools)
        r   )ELFFile)descriptions)BytesIOz	ELF file:sh_type
SHT_SYMTABc                     | j         S rQ   rS   )syms    r   r~   z*CPUCodeLibrary._dump_elf.<locals>.<lambda>j  s    SX r   )keyz    symbols:z/    - %r: size=%d, value=0x%x, type=%s, bind=%sst_sizest_valuest_infort   bindN)elftools.elf.elffiler  elftools.elfr  ior  r9   iter_sectionssortediter_symbolsrS   r   describe_symbol_typedescribe_symbol_bind)	clsbufr  r  r  r   secsymbolsr  s	            r   	_dump_elfzCPUCodeLibrary._dump_elf]  sX    	100000------GGGCLL!!k??$$ 	  	 C9~-- !1!1!3!39M9MNNNn%%%" 	  	 C8 ! K X__.. ^ _)>>s9~f?UVV)>>s9~f?UVV	         	r   c                 h    	 |j         }n# t          $ r Y dS w xY w|j        rd|_        ||_        dS dS )zB
        `ll_module` was compiled into object code `buf`.
        NT)r  r(   rk  rm  rl  )r  r  r  rY   s       r   _object_compiled_hookz$CPUCodeLibrary._object_compiled_hookx  s]    
	&DD 	 	 	FF	' 	(!DN$'D!!!	( 	(   
 
c                 z    	 |j         }n# t          $ r Y dS w xY w|j        r|j        r|j        }d|_        |S dS dS )z>
        Return a cached object code for `ll_module`.
        N)r  r(   rk  rl  )r  r  rY   r  s       r   _object_getbuffer_hookz%CPUCodeLibrary._object_getbuffer_hook  sq    
	&DD 	 	 	FF	' 	D,A 	'C$(D!J	 	 	 	r  c                 l    |                                   | j        d| j                                        fS )zX
        Serialize this library using its bitcode as the cached representation.
        bitcode)rJ  rS   r}  
as_bitcoder4  s    r   serialize_using_bitcodez&CPUCodeLibrary.serialize_using_bitcode  s4     	   	9d&8&C&C&E&EFFr   c                     |                                   |                                 |                                                                 f}| j        d|fS )z
        Serialize this library using its object code as the cached
        representation.  We also include its bitcode for further inlining
        with other libraries.
        object)rJ  rq  r  r  rS   )rY   datas     r   serialize_using_object_codez*CPUCodeLibrary.serialize_using_object_code  sV     	   ))++,,..99;;=	8T**r   c                    |\  }}}|                     |          }t          ||           sJ |dk    r/t          j        |          |_        |                                 |S |dk    r|\  }}|                                 |                    |           t          j        |          |_        |                                 |j	        j
                            |j                   |S t          d|          )Nr  r  zunsupported serialization kind )create_libraryrm   r%   parse_bitcoder}  r  rn  rt  r  rC  _engine_load_defined_symbolsrD   )	r  r>  staterS   kindr  rY   object_codeshared_bitcodes	            r   _unserializezCPUCodeLibrary._unserialize  s    dD%%d++$$$$$$9!#!1$!7!7D'')))KX*.'K&&(((%%k222"$"2>"B"BD'')))M!778KLLLK*DDJKKKr   rQ   )r8  r9  r:  r[   r  r  r  r`  rc  r  rW  r  r  r  r  rU   r  r   ri  rV   r  classmethodr  r  r  r  r  r  __classcell__)rE  s   @r   rx  rx    s       # # # # ## # # - - -2! ! !F0 0 0( ( (. . .& & &86 6 6: : :G G G4  5 5 59 9 9
' ' 'H H H3 3 3 39 9 9   [4 
( 
( [
(   [G G G	+ 	+ 	+ L L [L L L L Lr   rx  c                        e Zd Zd Zd Zd ZdS )AOTCodeLibraryc                 r    |                                   | j        j                            | j                  S )z
        Return this library as a native object (a bytestring) -- for example
        ELF under Linux.

        This function implicitly calls .finalize().
        )rJ  rC  r  emit_objectr}  r4  s    r   emit_native_objectz!AOTCodeLibrary.emit_native_object  s2     	   } ,,T-?@@@r   c                 \    |                                   | j                                        S )zz
        Return this library as LLVM bitcode (a bytestring).

        This function implicitly calls .finalize().
        )rJ  r}  r  r4  s    r   emit_bitcodezAOTCodeLibrary.emit_bitcode  s+     	   !,,...r   c                     d S rQ   r}   r4  s    r   r  z!AOTCodeLibrary._finalize_specific      r   N)r8  r9  r:  r  r  r  r}   r   r   r
  r
    sD        A A A/ / /    r   r
  c                       e Zd Zd Zd ZdS )JITCodeLibraryc                     |                                   | j        j        }|                    |          sdS | j        j                            |          S )a  
        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.
        r   )rJ  rC  r   is_symbol_definedget_function_address)rY   rS   ees      r   get_pointer_to_functionz&JITCodeLibrary.get_pointer_to_function  sU     	   ]"##D)) 	D1=(==dCCCr   c                     | j                             | j                   | j                            d          5  | j         j                                         d d d            d S # 1 swxY w Y   d S )NzFinalize object)rC  _scan_and_fix_unresolved_refsr}  rF  r  r   finalize_objectr4  s    r   r  z!JITCodeLibrary._finalize_specific  s    33D4FGGG#**+<== 	4 	4M!11333	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s   A&&A*-A*N)r8  r9  r:  r  r  r}   r   r   r  r    s5        D D D*4 4 4 4 4r   r  c                   .    e Zd ZdZdZd Zd Zd Zd ZdS )RuntimeLinkerzP
    For tracking unresolved symbols generated at runtime due to recursion.
    z.numba.unresolved$c                 j    t          j                    | _        t                      | _        g | _        d S rQ   )r   
UniqueDict_unresolvedrs   _defined	_resolvedr4  s    r   r[   zRuntimeLinker.__init__  s)     +--r   c                    | j         }|j        D ]}|j                            |          r|j        t	          |          d         }|                    |j                  rSt          j                            d          }t          j
        |          }|                    |t          j        |                     || j        |<   dS )zr
        Scan and track all unresolved external symbols in the module and
        allocate memory for it.
        Nnrt_unresolved_abort)PREFIXr  rS   r  r   r  r
   r_  r  ctypesc_void_padd_global_mapping	addressofr   )rY   moduleengineprefixr   r  abortfnptrs           r   scan_unresolved_symbolsz%RuntimeLinker.scan_unresolved_symbols  s    
 ) 
	, 
	,Bw!!&)) 	,gc&kkll+++BG44 -??@VWWog..))"f.>s.C.CDDD(+ %
	, 
	,r   c                 f    |j         D ](}|j        s| j                            |j                   )dS )z5
        Scan and track all defined symbols.
        N)r  r  r!  r  rS   )rY   r*  rZ   s      r   scan_defined_symbolsz"RuntimeLinker.scan_defined_symbols  sD     " 	+ 	+B$ +!!"'***	+ 	+r   c                       fd j         D             }|D ]O}|                    |          } j         |         }||_         j                            ||f            j         |= PdS )z=
        Fix unresolved symbols if they are defined.
        c                 &    g | ]}|j         v |S r}   )r!  ).0rS   rY   s     r   
<listcomp>z)RuntimeLinker.resolve.<locals>.<listcomp>  s%    NNND8M8M48M8M8Mr   N)r   r  r#  r"  r   )rY   r+  pendingrS   fnptrr.  s   `     r   resolvezRuntimeLinker.resolve  s    
 ONNND$4NNN 	' 	'D//55E"4(CCIN!!4+... &&	' 	'r   N)	r8  r9  r:  r;  r%  r[   r/  r1  r8  r}   r   r   r  r    sa          "F  
, , ,&+ + +' ' ' ' 'r   r  c                 F     t          j                    fd            }|S )Nc                 &     | j         g|R i |S rQ   )_ee)rY   argsrX   olds      r   wrapperz_proxy.<locals>.wrapper*  s%    s48-d---f---r   )	functoolswraps)r=  r>  s   ` r   _proxyrA  )  s6    _S. . . . .Nr   c                       e Zd 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dS )	JitEnginezWraps 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                 :    || _         t                      | _        d S rQ   )r;  rs   _defined_symbols)rY   r  s     r   r[   zJitEngine.__init__5  s     !$r   c                     || j         v S )z/Is the symbol defined in this session?
        )rE  rf  s     r   r  zJitEngine.is_symbol_definedB  s     t,,,r   c                 \    |j         |j        fD ]}| xj        d |D             z  c_        dS )z(Extract symbols from the module
        c                 *    h | ]}|j         	|j        S r}   )r  rS   )r4  r   s     r   	<setcomp>z2JitEngine._load_defined_symbols.<locals>.<setcomp>K  s8     &@ &@ &@"-/->&@bg &@ &@ &@r   N)r  r  rE  )rY   r  gsetss      r   r  zJitEngine._load_defined_symbolsG  sc     mS%9: 	@ 	@E!! &@ &@ &@ &@ &@ @!!!	@ 	@r   c                 `    |                      |           | j                            |          S )zXOverride ExecutionEngine.add_module
        to keep info about defined symbols.
        )r  r;  
add_modulerY   r*  s     r   rL  zJitEngine.add_moduleN  s.     	""6***x""6***r   c                 v    | j                             |j                   | j                            ||          S )z`Override ExecutionEngine.add_global_mapping
        to keep info about defined symbols.
        )rE  r  rS   r;  r(  )rY   r   addrs      r   r(  zJitEngine.add_global_mappingU  s5     	!!"'***x**2t444r   N)r8  r9  r:  r;  r[   r  r  rL  r(  rA  r%   ExecutionEngineset_object_cacher  r  get_global_value_addressr}   r   r   rC  rC  0  s         & & &- - -
@ @ @+ + +5 5 5 vb0ABBfR/?@@O!6""4"IJJ%v
3 
  
r   rC  c                   `    e Zd ZdZed             Zed             Zed             Zd Z	d Z
dS )CodegenaM  
    Base Codegen class. It is expected that subclasses set the class attribute
    ``_library_class``, indicating the CodeLibrary class for the target.

    Subclasses should also initialize:

    ``self._data_layout``: the data layout for the target.
    ``self._target_data``: the binding layer ``TargetData`` for the target.
    c                     dS )zD
        Create a new empty module suitable for the target.
        Nr}   rf  s     r   rY  zCodegen._create_empty_moduler  ra  r   c                     dS )zu
        Add a module to the execution engine. Ownership of the module is
        transferred to the engine.
        Nr}   rM  s     r   r  zCodegen._add_modulex  ra  r   c                     | j         S )zJ
        The LLVM "target data" object for this codegen instance.
        )_target_datar4  s    r   target_datazCodegen.target_data  s    
   r   c                       | j         | |fi |S )zb
        Create a :class:`CodeLibrary` object for use with this codegen
        instance.
        )_library_class)rY   rS   rX   s      r   r  zCodegen.create_library  s!    
 #t"488888r   c                 8    | j                             | |          S rQ   )r[  r  )rY   
serializeds     r   unserialize_libraryzCodegen.unserialize_library  s    "//jAAAr   N)r8  r9  r:  r;  r   rY  r  ru  rY  r  r^  r}   r   r   rT  rT  g  s            ^
   ^ ! ! X!9 9 9B B B B Br   rT  c                   V    e 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S )r?  c                    t                       d | _        t          j        t	          |                     |                              | _        d| j        _        t                      | _	        | 
                    | j                   d S )Nglobal_codegen_module)initialize_llvmr  r%   r|  r   rY  _llvm_modulerS   r  	_rtlinker_init)rY   module_names     r   r[   zCPUCodegen.__init__  su     -))+66779 9!8&

4$%%%%%r   c                    t          |j                  g k    s
J d            t          j                            t          j                              }t          t          j                  }| 	                                | _
        |                     |            |j        di |}t          j        }t          j        |||          }t          j        r|                                 || _        t%          |          | _        |j        | _        t-          | j                  | _        t          j        j        rd| _        d| _        nd| _        d| _        | j                            | j        j        | j        j                   d S )	NzModule isn't empty)r  )use_lmmT   Fr   r}   )listr  r%   Targetfrom_tripleget_process_triplerq   r   OPT_customize_tm_features_tm_features_customize_tm_optionscreate_target_machineUSE_LLVMLITE_MEMORY_MANAGERcreate_mcjit_compilerENABLE_PROFILINGenable_jit_eventsr  rC  r   rY  rX  r   r  
is_opt_maxr  r  rQ  r[  r  r  )rY   llvm_moduler"  
tm_optionstmrh  r+  s          r   re  zCPUCodegen._init  sp   K011R7779M777&&r'<'>'>??fj)))
 7799"":...)V)77J774)+r7KKK" 	'$$&&& ((". 122:  	  "DNDOO #DNDO%%d&9&O&*&9&P	R 	R 	R 	R 	Rr   c                     t          j        t          j        |                    }t	          j                    |_        | j        r| j        |_        |S rQ   )	r  r  r   r~  r%   rm  r   r  r  rZ  s      r   rY  zCPUCodegen._create_empty_module  sI    M'";D"A"ABB	022	 	6$($5I!r   c                 N   t          j                    }|                    t          j                               | j                            |           |                    dd           } | j        di |5 }|                    |           d d d            n# 1 swxY w Y   |R|dk    rLt          j
        dk    r<|                                 |                                 |                                 t          j        r!|                    t!                                 |S )Nr  r  r   r}   )r%   create_module_pass_manageradd_target_library_inform  r  add_analysis_passespop_pass_manager_builderpopulater   rn  add_loop_rotate_passadd_instruction_combining_passadd_jump_threading_passr  add_refprune_passr.   )rY   rX   pmr  pmbs        r   r  zCPUCodegen._module_pass_manager  sP   *,,
""2#8#:#:;;;$$R(((zz&$'''T'11&11 	SLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 FJ!OO ##%%%--///&&((($ 	:  !6!8!8999	s   7BB Bc                 d   t          j        |          }|                    |j                   | j                            |            | j        di |5 }|                    |           d d d            n# 1 swxY w Y   t          j	        r!|
                    t                                 |S )Nr}   )r%   create_function_pass_managerr~  r   r  r  r  r  r   r  r  r.   )rY   rx  rX   r  r  s        r   r  z!CPUCodegen._function_pass_manager  s    ,[99
"";#5666$$R((('T'11&11 	SLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	$ 	:  !6!8!8999	s   A88A<?A<c                     |                     dt          j                  }|                     dt          j                  }|                     dt          j                  }t          d|||d|}|S )a  
        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  r  r  )r  r  r  r}   )r  r   rn  LOOP_VECTORIZESLP_VECTORIZEr   )rY   rX   	opt_levelr  r  r  s         r   r  z CPUCodegen._pass_manager_builder  sx     JJufj11	$4f6KLL

?F4HII) 4i9G8E4 4 -34 4
 
r   c                     d}t          j        |          }t          |          }d|v sd|v rdS d|v r&t          j                    }t          d|d          t          d|d	          )
z<
        Guard against some well-known LLVM bug(s).
        zo
            define double @func()
            {
                ret double 1.23e+01
            }
            z12.3z1.23Nz1.0zFLLVM will produce incorrect floating-point code in the current locale zh.
Please read https://numba.readthedocs.io/en/stable/user/faq.html#llvm-locale-bug for more information.zUnexpected IR:

)r%   r|  r   locale	getlocalerT  r  )rY   r  r  ir_outlocs        r   r  zCPUCodegen._check_llvm_bugs  s     ##SVv//FF??"$$C,
 33	   nvvv?@@@r   c                 N    | j         j        |                                 | j        fS )zP
        Return a tuple unambiguously describing the codegen behaviour.
        )rc  r   _get_host_cpu_namerp  r4  s    r   magic_tuplezCPUCodegen.magic_tuple  s+     !($*A*A*C*C!# 	#r   c                     | j                             || j                   | j                             |           | j                             | j                   d S rQ   )rd  r/  r   r1  r8  rM  s     r   r  z(CPUCodegen._scan_and_fix_unresolved_refs$  sP    ..vt|DDD++F333t|,,,,,r   c                 z   t          j        d                                          }| j        j        |z   }|j        }	 |                    |          }n.# t          $ r! t          j        |||          }d|_	        Y nw xY w|
                    |                    |          |                                          S )N   r  r  )r  IntType
as_pointerrd  r%  r*  
get_globalKeyErrorGlobalVariabler  bitcastload)rY   builderfntyrS   voidptrptrnamellvm_modr7  s           r   insert_unresolved_refz CPUCodegen.insert_unresolved_ref)  s    .##..00.'$.>	'''00EE 	' 	' 	')(G'JJJE&EMMM	' w||E22DOO4E4EFFFs   A (A?>A?c                 X    t           j        t          j                    nt           j        S rQ   )r   CPU_NAMEr%   get_host_cpu_namer4  s    r   r  zCPUCodegen._get_host_cpu_name5  s%    ?* $&&&_	&r   c                 N    t           j        t           j        S t                      S rQ   )r   CPU_FEATURESget_host_cpu_featuresr4  s    r   _get_host_cpu_featuresz!CPUCodegen._get_host_cpu_features:  s     *&&$&&&r   N)r8  r9  r:  r[   re  rY  r  r  r  r  r  r  r  r  r  r}   r   r   r?  r?    s        & & &&R &R &RP    *    (A A A<# # #- - -

G 
G 
G& & &
' ' ' ' 'r   r?  c                   0    e Zd ZdZeZddZd Zd Zd Z	dS )AOTCPUCodegenzp
    A codegen implementation suitable for Ahead-Of-Time compilation
    (e.g. generation of object files).
    Nc                 N    |pd| _         t                              | |           d S Nr   )	_cpu_namer?  r[   )rY   rf  cpu_names      r   r[   zAOTCPUCodegen.__init__H  s)    !RD+.....r   c                 z    | j         }|dk    r|                                 }||d<   d|d<   d|d<   | j        |d<   d S )Nhostcpupicrelocr   	codemodelfeatures)r  r  rp  )rY   optionsr  s      r   rq  z#AOTCPUCodegen._customize_tm_optionsM  sU    >v..00H! ("/
r   c                     dS r  r}   r4  s    r   ro  z$AOTCPUCodegen._customize_tm_featuresV  s	     rr   c                     d S rQ   r}   rM  s     r   r  zAOTCPUCodegen._add_module[  r  r   rQ   )
r8  r9  r:  r;  r
  r[  r[   rq  ro  r  r}   r   r   r  r  @  sf         
 $N/ / / /
0 0 0  
    r   r  c                   .    e Zd ZdZeZd Zd Zd Zd Z	dS )JITCPUCodegenzI
    A codegen implementation suitable for Just-In-Time compilation.
    c                 l   |                                  |d<   t          j                                        j        }|                    d          rd}n|                    d          rd}nd}||d<   d|d	<   | j        |d
<   t          j        t          j        j	                  }d|j
        v rd|d<   d S d S )Nr  r   staticppcr  r   r  
jitdefaultr  r  jitT)r  r%   rk  from_default_triplerS   r  rp  r   pysignaturerr  
parameters)rY   r  r   reloc_modelsigs        r   rq  z#JITCPUCodegen._customize_tm_optionsf  s     0022 y,,..3??5!! 	$"KK__U## 	$KK#K&+ #/
 	 ?@@CN""!GENNN #"r   c                 *    |                                  S rQ   )r  r4  s    r   ro  z$JITCPUCodegen._customize_tm_features  s    **,,,r   c                 :    | j                             |           d S rQ   )r   rL  rM  s     r   r  zJITCPUCodegen._add_module  s    '''''r   c                     | j                             |          }t          j        dz                      |          }t          j        t          |                    |d<   dS )zrSet the environment address.

        Update the GlobalVariable named *env_name* to the address of *env*.
        r   r   N)r   rR  r&  r'  from_addressrQ  )rY   env_nameenvgvaddrenvptrs        r   set_envzJITCPUCodegen.set_env  sP    
 66x@@/A%33F;;OBsGG,,q			r   N)
r8  r9  r:  r;  r  r[  rq  ro  r  r  r}   r   r   r  r  _  sa          $N" " "6- - -( ( (- - - - -r   r  c                  x    t          j                     t          j                     t          j                     dS )z Safe to use multiple times.
    N)r%   r  initialize_native_targetinitialize_native_asmprinterr}   r   r   rb  rb    s3     MOOO!!!#%%%%%r   c                      	 t          j                    } t          j        s| D ]}|                    d          rd| |<   |                                 S # t          $ r Y dS w xY w)z~Get host CPU features using LLVM.

    The features may be modified due to user setting.
    See numba.config.ENABLE_AVX.
    avxFr   )r%   r  r   
ENABLE_AVXr  flattenrT  )r  rx   s     r   r  r    s    "+--   	( ( (<<&& ("'HQK !!!    rrs   A 
A"!A")6r)   r?  r  r  r&  r   r   llvmlite.bindingr^   r%   llvmlite.irr  r  abcr   r   
numba.corer   r   r   numba.core.llvm_bindingsr   numba.core.runtime.nrtoptr	   numba.core.runtimer
   numba.core.compiler_lockr   numba.core.errorsr   numba.misc.inspectionr   numba.misc.llvm_pass_timingsr   	frozensetr   r   r.   rM   r  rO   r=  rx  r
  r  r  rA  rC  rT  r?  r  r  rb  r  r}   r   r   <module>r     s                         ' ' ' ' ' ' ' ' - - - - - - - - - - @ @ @ @ @ @ @ @ @ @ @ @ $ $ $ $ $ $ A A A A A A 7 7 7 7 7 7 8 8 8 8 8 8 > > > > > > 9 & & & ' '  
  0  6p p p p p6 p p pfx( x( x( x( x(G x( x( x( x(vxL xL xL xL xL[ xL xL xLv	    ^   24 4 4 4 4^ 4 4 4:5' 5' 5' 5' 5'F 5' 5' 5'n  4
 4
 4
 4
 4
 4
 4
 4
n'B 'B 'B 'B 'B 'B 'B 'B 'BTl' l' l' l' l' l' l' l'^    J   >5- 5- 5- 5- 5-J 5- 5- 5-p& & &" " " " "r   