
    sh                        S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKJr	  S SK
Jr  S SKJrJr  S SKJrJrJr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  S S	KJr  S S
K J!r!  \"" / SQ5      r#S r$S r%S r& " S S\'5      r( " S S\S9r) " S S\)5      r* " S S\*5      r+ " S S\*5      r, " S S\'5      r-S r. " S S\'5      r/ " S S \S9r0 " S! S"\05      r1 " S# S$\15      r2 " S% S&\15      r3S' r4S( r5g))    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                 <    U R                  S5      S   nU[        ;   $ )N-r   )split_x86arch)triplearchs     f/Users/tiagomarins/Projetos/claudeai/copy_bank/venv/lib/python3.13/site-packages/numba/core/codegen.py_is_x86r      s     <<QD8    c                  B   [         R                  R                  S5      n U (       d  gSnU  H?  nUR                  5       n U[	        [
        R                  UR                  5       5      -  nMA     U$ ! [         a#    [        R                  " SU< 3[        5         Mq  f = f)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1E
Czz|	572//>>C  J  	5MM3D8<35	5s    +A11)BBc                 T  ^	^
^^ [         R                  (       a5   SS KnSSKJm  SSKJn  SSKJn  SSKJm	  SSK	J
m
  XTS.nXb   mU	U
UU4S jnO[        n[        S
5        [        U R                  SS5      5        U" U5        [        S
5        g ! [         a    S	n[        U5      ef = f)Nr   )	highlight)GasLexer)	LlvmLexer)Terminal256Formatter)by_colorscheme)llvmasmc           
      H   > [        T" U T" 5       T" T" 5       S95      5        g )N)style)print)argr3   r4   r0   lexers    r   printerdump.<locals>.printerH   s%    iUW*1ABD 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   dumprN   8   s    	E
 +=?@<!+>IOEE E 	(O	&--C
 !DM	(O)  	"DCS/!	"s   B B'c                   F    \ rS rSrSrS r    S
S jrSS jrS rS r	S	r
g)_CFGS   a  
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                     Xl         X l        X0l        UR                  U5      n[        R
                  " U5      U l        X@l        g N)cresnamepy_funcget_functionr%   get_function_cfgdotkwargs)selfrT   rU   rV   rZ   fns         r   __init___CFG.__init__[   s8    		t$&&r*r   Nc	                   ^K^L^M^N^O^P^Q^R^S^T^U^V^W^X SSK mSSSKmWSSKn	SSKn
SSKJn  SSKJn  SSKJ	n  SSK
Jn  SnU" UUUUUUUUS9nU" XS	9mKS
 nU" UU5        U" TKU5        U" S 5      mNSTNS'   STNS'   STNS'   STNS'   STNS'   STNS'   STNS'   STNS'   STNS'   STNS'   S TNS!'   U R                  R                  U R                  5      nU R                  R                  5       nUW4S" jnU" U5      mUUS4S# jnU" U R                  U R                  U5      nTWR!                  S$5      nTWR!                  S%5      nTWR!                  S&5      mVS'nTWR!                  U5      mTTWR!                  S(5      nTWR!                  S)5      nTWR!                  S*5      nTWR!                  S+5      nTWR!                  S,5      nTWR!                  S-5      nTWR!                  S.5      n TWR!                  S/5      n!S0 n"S1 mL0 n#0 n$TKR"                  (       a  U
R%                  U R&                  5      u  mXmQUR(                  " U5      R+                  S2S35      n%TSR-                  U%5      R/                  S4S59n&U	R1                  U&R3                  S65      5      n'Sn(U'S7    GH  n)S8u  mPmOU)S9   n*U)S:   n+U)S;   n,U+U#U,'   U*S<S= n*U*R5                  S>5      n-/ n.S<mMS3n/UR7                  U-S=   5      n0U-n1U0b  U0R9                  5       S   n2U2R5                  S?5      n3[;        U35      mMS@n4/ n5UR<                  (       a  TNS   TNS   SA.n6O0 n6U3 HY  n7UR7                  U75      R9                  5       u  n8n9U6R?                  U9SB5      n:U5RA                  U4RC                  U:U8U95      5        M[     S3RE                  U55      n/U-SS= n1SCn;U.RA                  U;RC                  TNSD   TMTL" U1S   RG                  5       5      5      5        SEmRUKULUMUNUOUPUQURUTUUUVUX4SF jn<U1S<S  GH  n=UR7                  U=5      (       a  M  TKRH                  (       d  TKR"                  (       a  U<" U=U.5      n>U>b  U>u  mPmOURJ                  (       a  URM                  U=5      (       a  TNS   n?GOURN                  (       a  URM                  U=5      (       a  TNS   n?OURP                  (       a  URM                  U=5      (       a  TNS   n?OURR                  (       a  U RM                  U=5      (       a  TNS   n?OURT                  (       a  U!RM                  U=5      (       a  TNS   n?O_URV                  (       a  URM                  U=5      (       a  TNS   n?O2URX                  (       a  URM                  U=5      (       a  TNS!   n?OTNSD   n?U?TNSD   Ld
  U(       a  GM  U"" TL" U=5      5       H%  n@U.RA                  TRRC                  U?TMU@5      5        M'     GM     U/(       a   U.RA                  SGRC                  U/5      5        S3RE                  U.5      nAUA(       a  SHU(< SIWA< SJ3nBSKRC                  UB5      n*OS3n*UR[                  U+U*SL9  GM     SMU';   a1  U'SM    H(  nCUCS;   n,UCR?                  SNS5      nDUCSO   UCSP   UD4U$U,'   M*     U$R]                  5        H8  u  n,nCU#UCS<      nEU#UCS      nFUCSQ   nGUGb  WESRWG-  -  nEUR_                  WEWF5        M:     U(       ak  / nHTNR]                  5        H'  u  nInJWHRA                  SSRC                  UJUI5      5        M)     UR[                  STSURC                  S3RE                  WH5      5      SL9  Uc  Ub  URa                  XUSV9  UR/                  SWS59$ )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                 *   [        U[        5      (       a   U R                   H  n[        XU5        M     g[        U[        5      (       ai  UR                  5        HT  u  p4X0R                  ;  a  [        SU-  5      e[        U[        5      (       a  [        XU5        ME  Sn[        XSU4-  5      e   g[        U[        5      (       a3  U H,  nX`R                  ;  a  [        SU-  5      e[        XS5        M.     gSn[        U[        U5      -  5      e)zParses 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itemsrE   settype)_configkwargattrkvrM   r-   s          r   parse_config)_CFG.pretty_printer.<locals>.parse_config   s    
 %&&#,,DG51 -E4((!KKMDA 0 00()F)JKK!!T**A.D(1v66 * E3''!D#3#33()F)MNNt4	 " B tE{!233r   c                      g)Nwhite r   r   r   <lambda>%_CFG.pretty_printer.<locals>.<lambda>   s    r   orangemarkeryellowrl   greentruebrredfalsebrcyanrd   	turquoisere   	lightpinkraiselightseagreenrh   purplereturn	rosybrownrj   tomatork   c                    > 0 nTR                  S5      nU R                  5        HI  nUR                  U5      nUc  M  UR                  5       nUc  M.  [	        U5      S:X  d   eUS   XS   '   MK     U$ )zGets 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+.*)      r   )compile
splitlinesmatchgroupslen)llvm_strmdmetadata_entryxr   gres         r   get_metadata)_CFG.pretty_printer.<locals>.get_metadata   sx     BZZ(BCN((*&,,Q/$A}"1v{*{#$Q4Q4 + Ir   c                    > Sn[        U5      U:  a&  SU S3n[        R                  " U[        5        US U nTR	                  XS9nUR                  SS9  UR                  SSS	[        U5      -  S
9  U$ )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   Digraphry   str)rU   fnamer   cmaxwstrfgvs         r   init_digraph)_CFG.pretty_printer.<locals>.init_digraph   s     D5zD /w 7B Cd$=>et

4
0AFF4F FF6$X2FF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                 .    [         R                  " U SSS9$ )Nx   z... )widthsubsequent_indent)textwrapwrap)ss    r   r   !_CFG.pretty_printer.<locals>.wrap   s    ==#HHr   c                 Z   Sn[        U 5      U:  a)  [        [        U 5      5      nSR                  U S U U5      n [        R
                  " U 5      n U R                  SS5      n U R                  SS5      n U R                  SS5      n U R                  S	S
5      n U R                  SS5      n U $ )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   clean"_CFG.pretty_printer.<locals>.clean   s     A1vza\$++AbqE26AA		%*A		%*A		$(A		#w'A		#w'AHr   z\l... dot_json)r   utf-8objects)r   labelrU   _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                   > TR                  U 5      nUGb>  UR                  5       nUGb)  [        U5      S:X  d   U5       eUS   nTR                  US5      nUb  TR                  U5      nUb  [        UR                  5       5      S:X  d   U5       eUR                  5       u  pxUT:w  d  UT:w  a  TR                  (       a5  Sn	XXx4-  n
TR                  TS   TT" U
5      5      nUR                  U5        TR                  (       aF  [        U5      TS-   -
  nTUS-      nTR                  TS   TT" U5      5      nUR                  U5        Xx4$ ggggg)zo
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   rl   )	r   r   r   getrm   r   appendrl   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_interleave0_CFG.pretty_printer.<locals>.metadata_interleavei  st   
 *//2&(A}"1v{-A-{!"1%'VVFD%9
%1 "0!5!5j!AB!~'*299;'71'< @b @'<,.IIK	 $(8#3sg~'2';';/N48D;N4N	-0ZZ8h8=i8H.J(1(8(8(<'2'9'9 034yK!O/L6>tax6H-0ZZ8h8=k8J.L(1(8(8(<+/9$4% 8F  .	 2	 % '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.typedra   typesrb   collectionsrc   rT   rW   rU   get_llvm_strr   rl   getsourcelinesrV   rX   r   Sourcepipeloadsdecoder   r   r   r   ri   r   r   r   joinr#   rm   rd   searchre   rh   rg   rf   rj   rk   r   rt   edgerender)Yr[   r   r   render_formatr0   
interleavestrip_irshow_keyr   r   r   r%   ra   rb   rc   _default
_highlightr|   r\   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   rU   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_tabrz   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   sY                                                                              @@@@@@@@@@@@@@r   pretty_printer_CFG.pretty_printerc   sf    	*$)+$H+3,4+3,4-56>3;>
 &XI	46 	Z+[*- )88898"8!7'98"-' YY##DII.99))+	 (#	$ DIIx8 ZZ-
N3**%<=4M2JJ?@	ZZ 01
ZZ 01
jj0**%9:::n5::CDJJ12		I
	,  $+$:$:4<<$H!Hk
 %%b)11(B?YYw',,J,?
zz*++G45	?C !'HgLEv;Dw<D!HTN !BKEKK&E I, H I &&uRy1G L"(+${{3/|,-&&#%h<bmDFF'C$2$8$8$=$D$D$FMFE"JJug6EOOELL$FG ( GGH-	  %Sbz5IY--bmX.3LO4I4I4K.LN O/C)5 )5 )5V "!"% ??1%% '';+=+=':1i'H$'3,<)' $$):):1)=)=\F&&:+<+<Q+?+?\F''K,>,>q,A,A	]F&&8??1+=+=[F''I,<,<Q,?,?\F11o6L6LQ6O6O 34F..3C3J3J13M3M 01F	]F
 I.hh!%(^!((FHa)HI ,K &T   !5!5i!@A '')$CHKHKM c* FF4uF%c #h d?WG}XXj$/"&v,Vb!A & #..*JD$DG$DDG$D7D$FF4 + G
1 !0171? # FF5 "0178H1I  K
 4#3HHh-HH vvUv##r   c                 b    U R                   " SXUS.U R                  D6nUR                  S5      $ )ac  
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   r6  rZ   r  )r[   r   r   r   rawbyts        r   display_CFG.display  s<     $$ Jh39J=A[[J}}W%%r   c                 X    U R                   " S0 U R                  D6R                  S5      $ )Nr   r   r9  r[   s    r   
_repr_svg__CFG._repr_svg_  s%    ""1T[[188AAr   c                     U R                   $ rS   )rY   r>  s    r   __repr___CFG.__repr__  s    xxr   )rT   rY   rZ   rU   rV   )NNNTFFT
   )NpdfF)__name__
__module____qualname____firstlineno____doc__r]   r6  r;  r?  rB  __static_attributes__r   r   r   rP   rP   S   s3     FJ!%BF "L$\&Br   rP   c                       \ rS rSrSrSrSrSrSSS\4S jr	\
S 5       r\
S	 5       r\
S
 5       r\
S 5       rS rS rS rS r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       rS rS rS rSrg)CodeLibraryi  z
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
CPUCodegenrU   c                     Xl         X l        U R                  R                   SU R                  < S3n[	        U5      U l        / U l        g )N())_codegen_name	__class__rF  r   _recorded_timings_dynamic_globals)r[   rN  rU   ptc_names       r   r]   CodeLibrary.__init__  sB    
nn--.a

~Q?!6x!@ "r   c                 R    U R                  5         [        U R                  5      S:  $ )Nr   )_ensure_finalizedr   rW  r>  s    r   has_dynamic_globalsCodeLibrary.has_dynamic_globals  s$     4(()A--r   c                     U R                   $ rS   )rV  r>  s    r   recorded_timingsCodeLibrary.recorded_timings  s    %%%r   c                     U R                   $ )z)
The codegen object owning this library.
)rS  r>  s    r   rN  CodeLibrary.codegen"  s    
 }}r   c                     U R                   $ rS   )rT  r>  s    r   rU   CodeLibrary.name)  s    zzr   c                 6    SU R                   [        U 5      4-  $ )Nz<Library %r at 0x%x>)rU   idr>  s    r   rB  CodeLibrary.__repr__-  s    %BtH(===r   c                 D    U R                   (       a  [        SU < 35      eg )Nz)operation impossible on finalized object )
_finalizedRuntimeErrorr>  s    r   _raise_if_finalizedCodeLibrary._raise_if_finalized0  s#    ??"& ) * * r   c                 H    U R                   (       d  U R                  5         g g rS   )ri  finalizer>  s    r   r[  CodeLibrary._ensure_finalized5  s    MMO r   c                 \    U R                  5         U R                  R                  U5      nU$ )z3
Create an LLVM IR module for use by this library.
)rk  rS  _create_empty_moduler[   rU   	ir_modules      r   create_ir_moduleCodeLibrary.create_ir_module9  s*     	  "MM66t<	r   c                     g)zS
Add a library for linking into this library, without losing
the original library.
Nr   r[   librarys     r   add_linking_libraryCodeLibrary.add_linking_libraryA      r   c                     g)z3
Add an LLVM IR module's contents to this library.
Nr   )r[   rs  s     r   add_ir_moduleCodeLibrary.add_ir_moduleH  r{  r   c                     g)z
Finalize the library.  After this call, nothing can be added anymore.
Finalization involves various stages of code optimization and
linking.
Nr   r>  s    r   rn  CodeLibrary.finalizeN  r{  r   c                     g)z%
Return the function named ``name``.
Nr   r[   rU   s     r   rW   CodeLibrary.get_functionV  r{  r   c                     g)z1
Get the human-readable form of the LLVM module.
Nr   r>  s    r   r   CodeLibrary.get_llvm_str\  r{  r   c                     g)z"
Get the human-readable assembly.
Nr   r>  s    r   get_asm_strCodeLibrary.get_asm_strb  r{  r   c                 .    SU l         S U l        SU l        g )NTF)_object_caching_enabled_compiled_object	_compiledr>  s    r   enable_object_caching!CodeLibrary.enable_object_cachingl  s    '+$ $r   c                     U R                   (       d  [        SU < 35      eU R                  c  [        SU < 35      eU R                  $ )Nobject caching not enabled in zno compiled object yet for )r  rE   r  rj  r>  s    r   _get_compiled_object CodeLibrary._get_compiled_objectq  s?    ++4IJJ  ($HII$$$r   c                     U R                   (       d  [        SU < 35      eU R                  (       a  [        SU < 35      eXl        SU l        g )Nr  zlibrary already compiled: T)r  rE   r  r  _disable_inspection)r[   r,  s     r   _set_compiled_object CodeLibrary._set_compiled_objectx  s<    ++4IJJ>>tEFF %#' r   )rS  r  r  r  rW  rT  r  rV  N)rF  rG  rH  rI  rJ  ri  r  r  r   r]   propertyr\  r_  rN  rU   rB  rk  r[  rt  r   ry  r}  rn  rW   r   r  r  r  r  rK  r   r   r   rM  rM    s    J## #C # . . & &    >*
    
    
  
  
%(r   rM  )	metaclassc                      ^  \ rS rSrU 4S jrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rSS jrS r\S 5       r\S 5       r\S 5       rS rS r\S 5       rSrU =r$ )CPUCodeLibraryi  c                 ,  > [         TU ]  X5        / U l        [        R                  " [        U R                  R                  U R                  5      5      5      U l	        [        R                  " U R                  5      U R                  l        S U l        g rS   )superr]   _linking_librariesr%   parse_assemblyr   rS  rq  rU   _final_moduler   normalize_ir_text_shared_module)r[   rN  rU   rU  s      r   r]   CPUCodeLibrary.__init__  sl    '"$..22499=>@")";";DII"F"r   c                    U R                   R                  Ul        U R                   R                  U5       nUR                   Hh  nSUR
                  < 3nU R                  R                  U5         UR                  5         UR                  U5        UR                  5         SSS5        Mj     SSS5        g! , (       d  f       M  = f! , (       d  f       g= f)z@
Internal: run function-level optimizations inside *ll_module*.
zFunction passes on N)rS  _data_layoutdata_layout_function_pass_manager	functionsrU   rV  record
initializerunrn  )r[   	ll_modulefpmfuncrz   s        r   _optimize_functions"CPUCodeLibrary._optimize_functions  s    
 !% : :	]]11)< "++)$))7++2215NN$GGDMLLN 65 , =<
 65 =<s#   ;C22B9$C9
CC
Cc                 f   U R                   R                  U R                   R                  SU R                   R                  SS9nU R                   R                  5       nSnU R                  R                  U5         UR                  U R                  5        SSS5        [        R                  (       d  [        U R                  5      U l        SnU R                  R                  U5         UR                  U R                  5        SSS5        g! , (       d  f       N= f! , (       d  f       g= f)z1
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))rS  _module_pass_manager	_loopvect
_opt_levelrV  r  r  r  r   LLVM_REFPRUNE_PASSr	   )r[   	mpm_cheapmpm_full
cheap_name	full_names        r   _optimize_final_module%CPUCodeLibrary._optimize_final_module  s    
 MM66dmmF]F]16'+}}'?'?(/ 7 1	
 ==557F
##**:6 MM$,,- 7
 ((!;D<N<N!OD7	##**95LL++, 65 76 65s   <D,D"
D"
D0c                    U R                  5         U R                  b  U R                  $ U R                  n/ nSnUR                   H`  nUS-  nUR                  (       a  M  UR
                  [        R                  R                  :X  d  ME  UR                  UR                  5        Mb     US:X  a  [        SU < 35      eU(       a/  UR                  5       nU H  nSUR                  U5      l        M     Xl        U$ )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
r   r   z5library unfit for linking: no available functions in linkonce_odr)r[  r  r  r  is_declarationlinkager%   Linkageexternalr   rU   rj  clonerW   )r[   modto_fixnfuncsr\   rU   s         r   _get_module_for_linking&CPUCodeLibrary._get_module_for_linking  s     	 *&&&  --BaKF$$$rzz7J7J)Jbgg&   Q; "& ) * * ))+C 2@  &.  "
r   c                 Z    UR                  5         U R                  R                  U5        g rS   )r[  r  r   rw  s     r   ry  "CPUCodeLibrary.add_linking_library  s"    !!#&&w/r   c                 4   U R                  5         [        U[        R                  5      (       d   e[        R
                  " [        U5      5      n[        R                  " U5      nUR                  Ul	        UR                  5         U R                  U5        g rS   )rk  ro   llvmirModuler   r  r   r%   r  rU   verifyadd_llvm_module)r[   rs  irr  s       r   r}  CPUCodeLibrary.add_ir_module  sn      ")V]]3333&&s9~6%%b)	"	Y'r   c                     U R                  U5        [        R                  (       d  [        U5      nU R                  R                  U5        g rS   )r  r   r  r	   r  link_in)r[   r  s     r   r  CPUCodeLibrary.add_llvm_module  s7      +((29=I""9-r   c                    [        5         U R                  R                  5         U R                  5         [        R
                  (       a(  [        SU R                  -  U R                  5       S5        [        5       nU R                   HC  nX!;  d  M
  UR                  U5        U R                  R                  UR                  5       SS9  ME     U R                  5         U R                  R!                  5         U R#                  5         g )NzFUNCTION OPTIMIZED DUMP %sr5   T)preserve)r   rS  _check_llvm_bugsrk  r   DUMP_FUNC_OPTrN   rU   r   ru   r  addr  r  r  r  r  _finalize_final_module)r[   seenrx  s      r   rn  CPUCodeLibrary.finalize  s    $& 	&&(  "-		9""$f. u..G"!""**335 +  / 	##%!!###%r   c                     U R                   R                   HJ  nUR                  R                  S5      (       d  M%  U R                  R                  UR                  5        ML     g )Nznumba.dynamic.globals)r  global_variablesrU   
startswithrW  r   )r[   r   s     r   _finalize_dynamic_globals(CPUCodeLibrary._finalize_dynamic_globals  sF    $$55Bww!!"9::%%,,RWW5 6r   c                     U R                   R                   H\  nUR                  (       d  M  UR                  R	                  S5      (       d  M8  Sn[        UR                  UR                  5      5      e   g )N	_ZN5numbazSymbol {} not linked properly)r  r  r  rU   r  AssertionErrorr   )r[   r\   rM   s      r   _verify_declare_only_symbols+CPUCodeLibrary._verify_declare_only_symbols  sU    $$..B   RWW%7%7%D%D5$SZZ%899	 /r   c                 6   U R                  5         U R                  5         [        R                  " U 5      U R                  l        U R                  R                  U R                  5      nU(       a  [        R                  " X5        U R                  5         SU l
        [        R                  (       a(  [        SU R                  -  U R                  5       S5        [        R                   (       a)  [        SU R                  -  U R#                  5       S5        gg)z/
Make the underlying LLVM module ready to use.
TzOPTIMIZED DUMP %sr5   zASSEMBLY %sr6   N)r  r  weakrefproxyr  _CPUCodeLibrary__libraryrS  _add_modulern  _finalize_specificri  r   DUMP_OPTIMIZEDrN   rU   r   DUMP_ASSEMBLYr  )r[   cleanups     r   r  %CPUCodeLibrary._finalize_final_module  s     	&&())+ (/}}T':$
 --++D,>,>?T+!  $tyy0$2C2C2EvN*D,<,<,>F  r   c              #   x   #    U R                   nUR                   H  nUR                  (       a  M  Uv   M     g7f)zR
Get all functions defined in the library.  The library must have
been finalized.
N)r  r  r  )r[   r  r\   s      r   get_defined_functions$CPUCodeLibrary.get_defined_functions/  s1     
   --B$$$  s   +:	:c                 8    U R                   R                  U5      $ rS   )r  rW   r  s     r   rW   CPUCodeLibrary.get_function9  s    !!..t44r   c                 T    U R                   (       a  [        R                  " S5        g g )Nz@Inspection disabled for cached code. Invalid result is returned.)r  r)   r*   r>  s    r    _sentry_cache_disable_inspection/CPUCodeLibrary._sentry_cache_disable_inspection<  s!    ##MM 8 9 $r   c                 L    U R                  5         [        U R                  5      $ rS   )r  r   r  r>  s    r   r   CPUCodeLibrary.get_llvm_strA  s    --/4%%&&r   c                     U R                  5         [        U R                  R                  R	                  U R
                  5      5      $ rS   )r  r   rS  _tmemit_assemblyr  r>  s    r   r  CPUCodeLibrary.get_asm_strE  s4    --/4==$$2243E3EFGGr   c                 <    U R                  5         [        XU40 UD6$ )z-
Get control-flow graph of the LLVM function
)r  rP   )r[   rU   rV   rZ   s       r   rX   CPUCodeLibrary.get_function_cfgI  s"     	--/D2622r   c                 8    U R                  5       n[        X!5      $ )a)  
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.
)r  r   )r[   mangled_nameelfs      r   get_disasm_cfgCPUCodeLibrary.get_disasm_cfgP  s     '')%c88r   c                    SSK Jn  SSKJn  SSKJn  U" U" U5      5      n[        S5        UR                  5        H  nUS   S:X  d  M  [        UR                  5       S S	9n[        S
5        U Hq  nUR                  (       d  M  [        SUR                  R                  5       US   US   UR                  US   S   5      UR                  US   S   5      4-  5        Ms     M     [        5         g)z_
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                     U R                   $ rS   rU   )syms    r   r   *CPUCodeLibrary._dump_elf.<locals>.<lambda>j  s    SXXr   )keyz    symbols:z/    - %r: size=%d, value=0x%x, type=%s, bind=%sst_sizest_valuest_inforv   bindN)elftools.elf.elffiler
  elftools.elfr  ior  r9   iter_sectionssortediter_symbolsrU   r  describe_symbol_typedescribe_symbol_bind)	clsbufr
  r  r  r   secsymbolsr  s	            r   	_dump_elfCPUCodeLibrary._dump_elf]  s     	1-GCL!k??$C9~- !1!1!39MNn%"C88 K XX__. ^ _)>>s9~f?UV)>>s9~f?UV	   #	 % 	r   c                 |     UR                   nUR                  (       a  SUl        X#l        gg! [         a     gf = f)z2
`ll_module` was compiled into object code `buf`.
NT)r  r(   r  r  r  )r   r  r!  r[   s       r   _object_compiled_hook$CPUCodeLibrary._object_compiled_hookx  sC    
	&&D ''!DN$'! (  		s   . 
;;c                      UR                   nUR                  (       a'  UR                  (       a  UR                  nSUl        U$ gg! [         a     gf = f)z.
Return a cached object code for `ll_module`.
N)r  r(   r  r  )r   r  r[   r!  s       r   _object_getbuffer_hook%CPUCodeLibrary._object_getbuffer_hook  sZ    
	&&D ''D,A,A''C$(D!J -B'  		s   A 
AAc                 p    U R                  5         U R                  SU R                  R                  5       4$ )zH
Serialize this library using its bitcode as the cached representation.
bitcode)r[  rU   r  
as_bitcoder>  s    r   serialize_using_bitcode&CPUCodeLibrary.serialize_using_bitcode  s0     	 		9d&8&8&C&C&EFFr   c                     U R                  5         U R                  5       U R                  5       R                  5       4nU R                  SU4$ )z
Serialize this library using its object code as the cached
representation.  We also include its bitcode for further inlining
with other libraries.
object)r[  r  r  r.  rU   )r[   datas     r   serialize_using_object_code*CPUCodeLibrary.serialize_using_object_code  sI     	 ))+,,.99;=		8T**r   c                    Uu  p4nUR                  U5      n[        X`5      (       d   eUS:X  a-  [        R                  " U5      Ul        UR                  5         U$ US:X  a  Uu  pxUR                  5         UR                  U5        [        R                  " U5      Ul        UR                  5         UR                  R                  R                  UR                  5        U$ [        SU< 35      e)Nr-  r2  zunsupported serialization kind )create_libraryro   r%   parse_bitcoder  r  r  r  r  rS  _engine_load_defined_symbolsrE   )	r   rN  staterU   kindr3  r[   object_codeshared_bitcodes	            r   _unserializeCPUCodeLibrary._unserialize  s     D%%d+$$$$$9!#!1!1$!7D'')KX*.'K&&(%%k2"$"2"2>"BD'')MM!!778K8KLKDJKKr   )r  r  r  ri  r  r  rS   )rF  rG  rH  rI  r]   r  r  r  ry  r}  r  rn  r  r  r  r  rW   r  r   r  rX   r  classmethodr$  r'  r*  r/  r4  r?  rK  __classcell__)rU  s   @r   r  r    s    ## -2!F0(.&86:G459
'H39  4 
( 
(  G	+ L Lr   r  c                   &    \ rS rSrS rS rS rSrg)AOTCodeLibraryi  c                     U R                  5         U R                  R                  R                  U R                  5      $ )z
Return this library as a native object (a bytestring) -- for example
ELF under Linux.

This function implicitly calls .finalize().
)r[  rS  r  emit_objectr  r>  s    r   emit_native_object!AOTCodeLibrary.emit_native_object  s1     	 }}  ,,T-?-?@@r   c                 V    U R                  5         U R                  R                  5       $ )zb
Return this library as LLVM bitcode (a bytestring).

This function implicitly calls .finalize().
)r[  r  r.  r>  s    r   emit_bitcodeAOTCodeLibrary.emit_bitcode  s%     	 !!,,..r   c                     g rS   r   r>  s    r   r  !AOTCodeLibrary._finalize_specific      r   r   N)rF  rG  rH  rI  rG  rJ  r  rK  r   r   r   rD  rD    s    A/r   rD  c                        \ rS rSrS rS rSrg)JITCodeLibraryi  c                     U R                  5         U R                  R                  nUR                  U5      (       d  gU R                  R                  R	                  U5      $ )a8  
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   )r[  rS  r9  is_symbol_definedget_function_address)r[   rU   ees      r   get_pointer_to_function&JITCodeLibrary.get_pointer_to_function  sN     	 ]]""##D))==((==dCCr   c                     U R                   R                  U R                  5        U R                  R	                  S5         U R                   R
                  R                  5         S S S 5        g ! , (       d  f       g = f)NzFinalize object)rS  _scan_and_fix_unresolved_refsr  rV  r  r9  finalize_objectr>  s    r   r  !JITCodeLibrary._finalize_specific  sQ    33D4F4FG##**+<=MM!!113 >==s   %A//
A=r   N)rF  rG  rH  rI  rU  r  rK  r   r   r   rP  rP    s    D*4r   rP  c                   4    \ rS rSrSrSrS rS rS rS r	Sr
g	)
RuntimeLinkeri  zH
For tracking unresolved symbols generated at runtime due to recursion.
z.numba.unresolved$c                 d    [         R                  " 5       U l        [        5       U l        / U l        g rS   )r   
UniqueDict_unresolvedru   _defined	_resolvedr>  s    r   r]   RuntimeLinker.__init__  s#     ++-r   c                    U R                   nUR                   H  nUR                  R                  U5      (       d  M%  UR                  [	        U5      S nUR                  UR                  5      (       a  M_  [        R                  R                  S5      n[        R                  " U5      nUR                  U[        R                  " U5      5        XpR                  U'   M     g)zZ
Scan and track all unresolved external symbols in the module and
allocate memory for it.
Nnrt_unresolved_abort)PREFIXr  rU   r  r   rR  r
   rx  rU  ctypesc_void_padd_global_mapping	addressofr_  )r[   moduleengineprefixr   r  abortfnptrs           r   scan_unresolved_symbols%RuntimeLinker.scan_unresolved_symbols  s    
 ))Bww!!&))ggc&kl+++BGG44--??@VWoog.))"f.>.>s.CD(+  % *r   c                     UR                    H;  nUR                  (       a  M  U R                  R                  UR                  5        M=     g)z%
Scan and track all defined symbols.
N)r  r  r`  r  rU   )r[   rj  r\   s      r   scan_defined_symbols"RuntimeLinker.scan_defined_symbols  s6     ""B$$$!!"''* #r   c                    U R                    Vs/ s H  o"U R                  ;   d  M  UPM     nnU HR  nUR                  U5      nU R                   U   nXEl        U R                  R                  X%45        U R                   U	 MT     gs  snf )z-
Fix unresolved symbols if they are defined.
N)r_  r`  rS  r,  ra  r   )r[   rk  rU   pendingfnptrrn  s         r   resolveRuntimeLinker.resolve  s    
 %)$4$4N$4D8M4$4ND//5E""4(CINN!!4+.  &  Os
   BB)r`  ra  r_  N)rF  rG  rH  rI  rJ  re  r]   ro  rr  rw  rK  r   r   r   r\  r\    s"     "F
,&+'r   r\  c                 F   ^  [         R                  " T 5      U 4S j5       nU$ )Nc                 0   > T" U R                   /UQ70 UD6$ rS   )_ee)r[   argsrZ   olds      r   wrapper_proxy.<locals>.wrapper*  s    488-d-f--r   )	functoolswraps)r}  r~  s   ` r   _proxyr  )  s#    __S. .Nr   c                      \ rS rSrSrS rS rS rS rS r	\
" \R                  R                  5      r\
" \R                  R                  5      r\
" \R                  R                  5      r\
" \R                  R                   5      rSrg	)
	JitEnginei0  zWraps 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                 .    Xl         [        5       U l        g rS   )r{  ru   _defined_symbols)r[   rT  s     r   r]   JitEngine.__init__5  s     !$r   c                     XR                   ;   $ )z/Is the symbol defined in this session?
        )r  r  s     r   rR  JitEngine.is_symbol_definedB  s     ,,,,r   c                     UR                   UR                  4 HF  nU =R                  U Vs1 s H"  nUR                  (       a  M  UR                  iM$     sn-  sl        MH     gs  snf )z(Extract symbols from the module
        N)r  r  r  r  rU   )r[   r  gsetsr   s       r   r:  JitEngine._load_defined_symbolsG  s^     mmS%9%9:E!! &@"-/->-> '.bgg &@ @! ;&@s   A$
A$
c                 Z    U R                  U5        U R                  R                  U5      $ )zHOverride ExecutionEngine.add_module
to keep info about defined symbols.
)r:  r{  
add_moduler[   rj  s     r   r  JitEngine.add_moduleN  s'     	""6*xx""6**r   c                     U R                   R                  UR                  5        U R                  R	                  X5      $ )zPOverride ExecutionEngine.add_global_mapping
to keep info about defined symbols.
)r  r  rU   r{  rh  )r[   r   addrs      r   rh  JitEngine.add_global_mappingU  s1     	!!"''*xx**244r   )r  r{  N)rF  rG  rH  rI  rJ  r]   rR  r:  r  rh  r  r%   ExecutionEngineset_object_cacherY  rS  get_global_value_addressrK  r   r   r   r  r  0  s    &-
@+5 b00AABR//??@O!""4"4"I"IJ%
33 
r   r  c                   T    \ rS rSrSr\S 5       r\S 5       r\S 5       r	S r
S rSrg	)
Codegenig  a5  
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                     g)z4
Create a new empty module suitable for the target.
Nr   r  s     r   rq  Codegen._create_empty_moduler  r{  r   c                     g)z]
Add a module to the execution engine. Ownership of the module is
transferred to the engine.
Nr   r  s     r   r  Codegen._add_modulex  r{  r   c                     U R                   $ )z:
The LLVM "target data" object for this codegen instance.
)_target_datar>  s    r   target_dataCodegen.target_data  s    
    r   c                 (    U R                   " X40 UD6$ )zJ
Create a :class:`CodeLibrary` object for use with this codegen
instance.
)_library_class)r[   rU   rZ   s      r   r7  Codegen.create_library  s    
 ""4888r   c                 8    U R                   R                  X5      $ rS   )r  r?  )r[   
serializeds     r   unserialize_libraryCodegen.unserialize_library  s    ""//AAr   r   N)rF  rG  rH  rI  rJ  r   rq  r  r  r  r7  r  rK  r   r   r   r  r  g  sN      
   ! !9Br   r  c                   \    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rSrg)rO  i  c                    [        5         S U l        [        R                  " [	        U R                  U5      5      5      U l        SU R                  l        [        5       U l	        U R                  U R                  5        g )Nglobal_codegen_module)initialize_llvmr  r%   r  r   rq  _llvm_modulerU   r\  	_rtlinker_init)r[   module_names     r   r]   CPUCodegen.__init__  s_     --))+679!8&

4$$%r   c                 \   [        UR                  5      / :X  d   S5       e[        R                  R	                  [        R
                  " 5       5      n[        [        R                  S9nU R                  5       U l
        U R                  U5        UR                  " S0 UD6n[        R                  n[        R                  " XUS9n[        R                  (       a  UR!                  5         X@l        [%        U5      U l        UR(                  U l        [-        U R*                  5      U l        [        R                  R0                  (       a  SU l        SU l        OSU l        SU l        U R&                  R7                  U R8                  R:                  U R8                  R<                  5        g )	NzModule isn't empty)r  )use_lmmT   Fr   r   )listr  r%   Targetfrom_tripleget_process_triplers   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  r  r9  r  r  r   r  
is_opt_maxr  r  r  r  r'  r*  )r[   llvm_moduler+  
tm_optionstmr  rk  s          r   r  CPUCodegen._init  s?   K001R7M9MM7&&r'<'<'>?fjj)
 779"":.))7J744))+7K""$$& (".. 1 12::   "DNDO #DNDO%%d&9&9&O&O&*&9&9&P&P	Rr   c                     [         R                  " [        R                  " U5      5      n[        R
                  " 5       Ul        U R                  (       a  U R                  Ul        U$ rS   )	r  r  r   r  r%   r  r   r  r  rr  s      r   rq  CPUCodegen._create_empty_module  sI    MM'";";D"AB	002	$($5$5I!r   c                 B   [         R                  " 5       nUR                  [         R                  " 5       5        U R                  R                  U5        UR                  SS 5      nU R                  " S0 UD6 nUR                  U5        S S S 5        UbJ  US:X  aD  [        R                  S:w  a0  UR                  5         UR                  5         UR                  5         [        R                  (       a  UR                  [!        5       5        U$ ! , (       d  f       N= f)Nr  r  r   r   )r%   create_module_pass_manageradd_target_library_infor  r  add_analysis_passespop_pass_manager_builderpopulater   r  add_loop_rotate_passadd_instruction_combining_passadd_jump_threading_passr  add_refprune_passr.   )r[   rZ   pmr  pmbs        r   r  CPUCodegen._module_pass_manager  s    **,
""2#8#8#:;$$R(zz&$'''1&1SLL 2 FJJ!O ##%--/&&($$  !6!89	 21s   9D
Dc                 t   [         R                  " U5      nUR                  UR                  5        U R                  R                  U5        U R                  " S0 UD6 nUR                  U5        S S S 5        [        R                  (       a  UR                  [        5       5        U$ ! , (       d  f       N>= f)Nr   )r%   create_function_pass_managerr  r   r  r  r  r  r   r  r  r.   )r[   r  rZ   r  r  s        r   r  !CPUCodegen._function_pass_manager  s    ,,[9
"";#5#56$$R(''1&1SLL 2$$  !6!89		 21s   B))
B7c                     UR                  S[        R                  5      nUR                  S[        R                  5      nUR                  S[        R                  5      n[        SUUUS.UD6nU$ )z
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   r  LOOP_VECTORIZESLP_VECTORIZEr   )r[   rZ   	opt_levelr  r  r  s         r   r   CPUCodegen._pass_manager_builder  sm     JJufjj1	$4f6K6KL

?F4H4HI) 4i9G8E4 -34
 
r   c                     Sn[         R                  " U5      n[        U5      nSU;   d  SU;   a  gSU;   a%  [        R                  " 5       n[        SU< S35      e[        SU< S	35      e)
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	getlocalerj  r  )r[   r  r  ir_outlocs        r   r  CPUCodegen._check_llvm_bugs  sr     #SVv/F?""$C
 	  v?@@r   c                 d    U R                   R                  U R                  5       U R                  4$ )z@
Return a tuple unambiguously describing the codegen behaviour.
)r  r   _get_host_cpu_namer  r>  s    r   magic_tupleCPUCodegen.magic_tuple  s1     !!(($*A*A*C!!# 	#r   c                     U R                   R                  XR                  5        U R                   R                  U5        U R                   R	                  U R                  5        g rS   )r  ro  r9  rr  rw  r  s     r   rX  (CPUCodegen._scan_and_fix_unresolved_refs$  s@    ..v||D++F3t||,r   c                 n   [         R                  " S5      R                  5       nU R                  R                  U-   nUR
                  n UR                  U5      nUR                  UR                  U5      UR                  5       5      $ ! [         a    [         R                  " XdUS9nSUl	         NWf = f)N   r  r  )r  IntType
as_pointerr  re  rj  
get_globalKeyErrorGlobalVariabler  bitcastload)r[   builderfntyrU   voidptrptrnamellvm_modrv  s           r   insert_unresolved_ref CPUCodegen.insert_unresolved_ref)  s    ..#..0..''$.>>	'''0E
 w||E2DOO4EFF	  	'))('JE&EM	's   B &B43B4c                 n    [         R                  c  [        R                  " 5       $ [         R                  $ rS   )r   CPU_NAMEr%   get_host_cpu_namer>  s    r   r  CPUCodegen._get_host_cpu_name5  s+    ??* $$& 	&__	&r   c                 X    [         R                  b  [         R                  $ [        5       $ rS   )r   CPU_FEATURESget_host_cpu_featuresr>  s    r   _get_host_cpu_features!CPUCodegen._get_host_cpu_features:  s#    *&&&$&&r   )	r  r9  r  r  r  r  r  r  r  N)rF  rG  rH  rI  r]   r  rq  r  r  r  r  r  rX  r  r  r  rK  r   r   r   rO  rO    sB    &&RP*(A<#-

G&
'r   rO  c                   8    \ rS rSrSr\rS	S jrS rS r	S r
Srg)
AOTCPUCodegeni@  zd
A codegen implementation suitable for Ahead-Of-Time compilation
(e.g. generation of object files).
Nc                 N    U=(       d    SU l         [        R                  X5        g Nr   )	_cpu_namerO  r]   )r[   r  cpu_names      r   r]   AOTCPUCodegen.__init__H  s    !RD.r   c                     U R                   nUS:X  a  U R                  5       nX!S'   SUS'   SUS'   U R                  US'   g )Nhostcpupicrelocr   	codemodelfeatures)r  r  r  )r[   optionsr	  s      r   r  #AOTCPUCodegen._customize_tm_optionsM  sL    >>v..0H! ("//
r   c                     gr  r   r>  s    r   r  $AOTCPUCodegen._customize_tm_featuresV  s     r   c                     g rS   r   r  s     r   r  AOTCPUCodegen._add_module[  rN  r   )r  rS   )rF  rG  rH  rI  rJ  rD  r  r]   r  r  r  rK  r   r   r   r  r  @  s"    
 $N/
0
r   r  c                   4    \ rS rSrSr\rS rS rS r	S r
Srg)	JITCPUCodegeni_  zA
A codegen implementation suitable for Just-In-Time compilation.
c                    U R                  5       US'   [        R                  R                  5       R                  nUR                  S5      (       a  SnOUR                  S5      (       a  SnOSnX1S'   SUS	'   U R                  US
'   [        R                  " [        R                  R                  5      nSUR                  ;   a  SUS'   g g )Nr  r   staticppcr  r   r  
jitdefaultr  r  jitT)r  r%   r  from_default_triplerU   r  r  r   pysignaturer  
parameters)r[   r  r   reloc_modelsigs        r   r  #JITCPUCodegen._customize_tm_optionsf  s     002 yy,,.33??5!!"K__U##K#K&+ #//
 		 ? ?@CNN"!GEN #r   c                 "    U R                  5       $ rS   )r  r>  s    r   r  $JITCPUCodegen._customize_tm_features  s    **,,r   c                 :    U R                   R                  U5        g rS   )r9  r  r  s     r   r  JITCPUCodegen._add_module  s    'r   c                     U R                   R                  U5      n[        R                  S-  R	                  U5      n[        R                  " [        U5      5      US'   g)zbSet the environment address.

Update the GlobalVariable named *env_name* to the address of *env*.
r   r   N)r9  r  rf  rg  from_addressrf  )r[   env_nameenvgvaddrenvptrs        r   set_envJITCPUCodegen.set_env  sG    
 66x@//A%33F;OOBsG,q	r   r   N)rF  rG  rH  rI  rJ  rP  r  r  r  r  r/  rK  r   r   r   r  r  _  s"     $N"6-(-r   r  c                      [         R                  " 5         [         R                  " 5         [         R                  " 5         g)z Safe to use multiple times.
    N)r%   r  initialize_native_targetinitialize_native_asmprinterr   r   r   r  r    s%     MMO!##%r   c                       [         R                  " 5       n [        R                  (       d%  U  H  nUR	                  S5      (       d  M  SX'   M!     U R                  5       $ ! [         a     gf = f)zrGet 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  flattenrj  )r  rz   s     r   r  r    se    "++-   <<&&"'HK 
 !!  s   A! !
A.-A.)6r)   r  r  r  rf  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.   rN   r2  rP   rM  r  rD  rP  r\  r  r  r  rO  r  r  r  r  r   r   r   <module>rD     s            ' - - @ @ $ A 7 8 >  & '
06p6 pfx(G x(vxL[ xLv	^ 24^ 4:5'F 5'n4
 4
n'B 'BTl' l'^J >5-J 5-p&"r   