
    6|h                        d dl mZmZmZmZ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Zd dlmZ d dlmZ ed    Z e	d	d
      Z G d d	e      Z G d de      ZddZd Zd Zd Zd Z G d de      Z G d dej>                        Z  G d de       Z! G d de       Z"ejF                  ejH                  jJ                  _&        ejN                  gejH                  jP                  _)        ejF                  ejH                  jP                  _&        ejF                  gejH                  jT                  _)        ejF                  ejN                  gejH                  jV                  _)        eejH                  jV                  _&        ejF                  ejN                  eeegejH                  jX                  _)        eejH                  jX                  _&        ejF                  gejH                  jZ                  _)        eejH                  jZ                  _&        ejF                  gejH                  j\                  _)        eejH                  j\                  _&        ejF                  ej^                  gejH                  j`                  _)        eejH                  j`                  _&        ejF                  ej^                  eeegejH                  jb                  _)        eejH                  jb                  _&        ejF                  gejH                  jd                  _)        ejF                  gejH                  jf                  _)        ejF                  gejH                  jh                  _)        ejF                  gejH                  jj                  _)        ejF                  gejH                  jl                  _)        ejF                  gejH                  jn                  _)        ejF                  gejH                  jp                  _)        ejF                  egejH                  jr                  _)        ejF                  egejH                  jt                  _)        ejF                  gejH                  jv                  _)        ejF                  gejH                  jx                  _)        ejF                  gejH                  jz                  _)        ejF                  gejH                  j|                  _)        ejF                  gejH                  j~                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  egejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        edk  r&ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  eegejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        edk  r&ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  egejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  egejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  egejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  egejH                  j                  _)        ejF                  gejH                  j                  _)        ejF                  eegejH                  j                  _)         ee      egejH                  j                  _)        y)    )c_boolc_char_pc_intc_size_t	StructurebyrefPOINTER)
namedtuple)IntFlag)ffi)llvm_version_infoN)mkstemp)_encode_string
PruneStatsz&basicblock diamond fanout fanout_raisec                       e Zd ZdZd Zd Zy)r   z4 Holds statistics from reference count pruning.
    c                 @   t        |t              s%d}t        |j                  t	        |                  t        | j
                  |j
                  z   | j                  |j                  z   | j                  |j                  z   | j                  |j                  z         S )Nz;PruneStats can only be added to another PruneStats, got {}.	
isinstancer   	TypeErrorformattype
basicblockdiamondfanoutfanout_raiseselfothermsgs      \/var/www/html/test/engine/venv/lib/python3.12/site-packages/llvmlite/binding/passmanagers.py__add__zPruneStats.__add__   s}    %,OCCJJtE{344$//E,<,<<,,6++4++e.@.@@B 	B    c                 @   t        |t              s%d}t        |j                  t	        |                  t        | j
                  |j
                  z
  | j                  |j                  z
  | j                  |j                  z
  | j                  |j                  z
        S )NzBPruneStats can only be subtracted from another PruneStats, got {}.r   r   s      r    __sub__zPruneStats.__sub__   s    %,CCJJtE{344$//E,<,<<,,6++4++e.@.@@B 	Br"   N)__name__
__module____qualname____doc__r!   r$    r"   r    r   r      s    BBr"   c                   (    e Zd ZdefdefdefdefgZy)_c_PruneStatsr   r   r   r   N)r%   r&   r'   r   _fields_r)   r"   r    r+   r+   )   s)    	x 	H	8	"	$Hr"   r+   c                     t        dddd      }t        |       }t        j                  j	                  t        |      |       t        |j                  |j                  |j                  |j                        S )z Returns a namedtuple containing the current values for the refop pruning
    statistics. If kwarg `printout` is True the stats are printed to stderr,
    default is False.
    r   )r+   r   r   libLLVMPY_DumpRefPruneStatsr   r   r   r   r   r   )printoutstatsdo_prints      r    dump_refprune_statsr3   1   s`     !Q1%EhHGG$$U5\8<e&&u||((* *r"   c                 T    t         j                  j                  t        |              y)zEnable or disable the pass timers.

    Parameters
    ----------
    enable : bool
        Set to True to enable the pass timers.
        Set to False to disable the pass timers.
    N)r   r.   LLVMPY_SetTimePassesr   )enables    r    set_time_passesr7   ?   s     GG  0r"   c                      t        j                         5 } t         j                  j                  |        t	        |       cddd       S # 1 sw Y   yxY w)a  Returns the pass timings report and resets the LLVM internal timers.

    Pass timers are enabled by ``set_time_passes()``. If the timers are not
    enabled, this function will return an empty string.

    Returns
    -------
    res : str
        LLVM generated timing report.
    N)r   OutputStringr.   LLVMPY_ReportAndResetTimingsstr)bufs    r    report_and_reset_timingsr=   K   s@     
			 s,,S13x  s   *A		Ac                      t               S N)ModulePassManagerr)   r"   r    create_module_pass_managerrA   [   s    r"   c                     t        |       S r?   )FunctionPassManager)modules    r    create_function_pass_managerrE   _   s    v&&r"   c                   2    e Zd ZdZdZdZdZeez  ez  ez  Zy)RefPruneSubpasses            N)r%   r&   r'   PER_BBDIAMONDFANOUTFANOUT_RAISEALLr)   r"   r    rG   rG   c   s*    FGFL
7
V
#l
2Cr"   rG   c                      e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 ZdJd
ZdJdZd Zd Zd Zd Zd Zd Zd Zd ZdKdZdLd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#dMd"Z$d# Z%d$ Z&d% Z'd& Z(d' Z)d( Z*d) Z+d* Z,d+ Z-d, Z.d- Z/d. Z0	 	 dNd/Z1d0 Z2d1 Z3d2 Z4d3 Z5d4 Z6d5 Z7d6 Z8d7 Z9d8 Z:d9 Z;d: Z<d; Z=dJd<Z>d= Z?d> Z@d? ZAd@ ZBdA ZCdB ZDdC ZEdD ZFdE ZGdF ZHeIj                  dGfdHZKyI)OPassManagerzPassManager
    c                 :    | j                   j                  |        y r?   )_capiLLVMPY_DisposePassManagerr   s    r    _disposezPassManager._disposeo   s    

,,T2r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#aa-eval-exhaustive-alias-analysis-precision-evaluator

        LLVM 14: `llvm::createAAEvalPass`
        N)r   r.   LLVMPY_AddAAEvalPassrV   s    r    add_aa_eval_passzPassManager.add_aa_eval_passr        	$$T*r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#basic-aa-basic-alias-analysis-stateless-aa-impl

        LLVM 14: `llvm::createBasicAAWrapperPass`
        N)r   r.   LLVMPY_AddBasicAAWrapperPassrV   s    r    add_basic_aa_passzPassManager.add_basic_aa_passz        	,,T2r"   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/Passes.html#constmerge-merge-duplicate-global-constants

        LLVM 14: `LLVMAddConstantMergePass`
        N)r   r.   LLVMPY_AddConstantMergePassrV   s    r    add_constant_merge_passz#PassManager.add_constant_merge_pass        	++D1r"   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/Passes.html#deadargelim-dead-argument-elimination

        LLVM 14: `LLVMAddDeadArgEliminationPass`
        N)r   r.    LLVMPY_AddDeadArgEliminationPassrV   s    r    add_dead_arg_elimination_passz)PassManager.add_dead_arg_elimination_pass        	006r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#da-dependence-analysis

        LLVM 14: `llvm::createDependenceAnalysisWrapperPass`
        N)r   r.    LLVMPY_AddDependenceAnalysisPassrV   s    r    add_dependence_analysis_passz(PassManager.add_dependence_analysis_pass   rg   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#dot-callgraph-print-call-graph-to-dot-file

        LLVM 14: `llvm::createCallGraphDOTPrinterPass`
        N)r   r.   !LLVMPY_AddCallGraphDOTPrinterPassrV   s    r    add_dot_call_graph_passz#PassManager.add_dot_call_graph_pass        	11$7r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#dot-cfg-print-cfg-of-function-to-dot-file

        LLVM 14: `llvm::createCFGPrinterLegacyPassPass`
        N)r   r.   LLVMPY_AddCFGPrinterPassrV   s    r    add_dot_cfg_printer_passz$PassManager.add_dot_cfg_printer_pass        	((.r"   c                 D    t         j                  j                  | |       y)z
        See https://llvm.org/docs/Passes.html#dot-dom-print-dominance-tree-of-function-to-dot-file

        LLVM 14: `llvm::createDomPrinterPass` and `llvm::createDomOnlyPrinterPass`
        N)r   r.   LLVMPY_AddDotDomPrinterPassr   	show_bodys     r    add_dot_dom_printer_passz$PassManager.add_dot_dom_printer_pass        	++D)<r"   c                 D    t         j                  j                  | |       y)z
        See https://llvm.org/docs/Passes.html#dot-postdom-print-postdominance-tree-of-function-to-dot-file

        LLVM 14: `llvm::createPostDomPrinterPass` and `llvm::createPostDomOnlyPrinterPass`
        N)r   r.   LLVMPY_AddDotPostDomPrinterPassru   s     r    add_dot_postdom_printer_passz(PassManager.add_dot_postdom_printer_pass   s     	//i@r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#globalsmodref-aa-simple-mod-ref-analysis-for-globals

        LLVM 14: `llvm::createGlobalsAAWrapperPass`
        N)r   r.   LLVMPY_AddGlobalsModRefAAPassrV   s    r    add_globals_mod_ref_aa_passz'PassManager.add_globals_mod_ref_aa_pass        	--d3r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#iv-users-induction-variable-users

        LLVM 14: `llvm::createIVUsersPass`
        N)r   r.   LLVMPY_AddIVUsersPassrV   s    r    add_iv_users_passzPassManager.add_iv_users_pass   s     	%%d+r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#lint-statically-lint-checks-llvm-ir

        LLVM 14: `llvm::createLintLegacyPassPass`
        N)r   r.   LLVMPY_AddLintPassrV   s    r    add_lint_passzPassManager.add_lint_pass        	""4(r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#lazy-value-info-lazy-value-information-analysis

        LLVM 14: `llvm::createLazyValueInfoPass`
        N)r   r.   LLVMPY_AddLazyValueInfoPassrV   s    r    add_lazy_value_info_passz$PassManager.add_lazy_value_info_pass   rc   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#module-debuginfo-decodes-module-level-debug-info

        LLVM 14: `llvm::createModuleDebugInfoPrinterPass`
        N)r   r.   $LLVMPY_AddModuleDebugInfoPrinterPassrV   s    r    add_module_debug_info_passz&PassManager.add_module_debug_info_pass        	44T:r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#regions-detect-single-entry-single-exit-regions

        LLVM 14: `llvm::createRegionInfoPass`
        N)r   r.   LLVMPY_AddRegionInfoPassrV   s    r    add_region_info_passz PassManager.add_region_info_pass   rr   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#scev-aa-scalarevolution-based-alias-analysis

        LLVM 14: `llvm::createSCEVAAWrapperPass`
        N)r   r.   LLVMPY_AddScalarEvolutionAAPassrV   s    r    add_scalar_evolution_aa_passz(PassManager.add_scalar_evolution_aa_pass        	//5r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#adce-aggressive-dead-code-elimination

        LLVM 14: `llvm::createAggressiveDCEPass`
        N)r   r.   LLVMPY_AddAggressiveDCEPassrV   s    r    )add_aggressive_dead_code_elimination_passz5PassManager.add_aggressive_dead_code_elimination_pass   rc   r"   c                 D    t         j                  j                  | |       y)z
        See https://llvm.org/docs/Passes.html#always-inline-inliner-for-always-inline-functions

        LLVM 14: `llvm::createAlwaysInlinerLegacyPass`
        N)r   r.   LLVMPY_AddAlwaysInlinerPass)r   insert_lifetimes     r    add_always_inliner_passz#PassManager.add_always_inliner_pass   s     	++D/Br"   c                     t        d      )z
        See https://llvm.org/docs/Passes.html#argpromotion-promote-by-reference-arguments-to-scalars

        LLVM 14: `llvm::createArgumentPromotionPass`
        z.ArgumentPromotionPass unavailable in LLVM > 14)RuntimeError)r   max_elementss     r    add_arg_promotion_passz"PassManager.add_arg_promotion_pass  s     KLLr"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#break-crit-edges-break-critical-edges-in-cfg

        LLVM 14: `llvm::createBreakCriticalEdgesPass`
        N)r   r.    LLVMPY_AddBreakCriticalEdgesPassrV   s    r    add_break_critical_edges_passz)PassManager.add_break_critical_edges_pass
  rg   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#dse-dead-store-elimination

        LLVM 14: `llvm::createDeadStoreEliminationPass`
        N)r   r.   "LLVMPY_AddDeadStoreEliminationPassrV   s    r    add_dead_store_elimination_passz+PassManager.add_dead_store_elimination_pass       	2248r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#function-attrs-deduce-function-attributes

        LLVM 14: `llvm::createReversePostOrderFunctionAttrsPass`
        N)r   r.   +LLVMPY_AddReversePostOrderFunctionAttrsPassrV   s    r    *add_reverse_post_order_function_attrs_passz6PassManager.add_reverse_post_order_function_attrs_pass  s     	;;DAr"   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/Passes.html#functionattrs-deduce-function-attributes

        LLVM 14: `LLVMAddFunctionAttrsPass`
        N)r   r.   LLVMPY_AddFunctionAttrsPassrV   s    r    add_function_attrs_passz#PassManager.add_function_attrs_pass"  rc   r"   c                 D    t         j                  j                  | |       y)z
        See http://llvm.org/docs/Passes.html#inline-function-integration-inlining

        LLVM 14: `createFunctionInliningPass`
        N)r   r.   LLVMPY_AddFunctionInliningPassr   	thresholds     r    add_function_inlining_passz&PassManager.add_function_inlining_pass*  s     	..tY?r"   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/Passes.html#globaldce-dead-global-elimination

        LLVM 14: `LLVMAddGlobalDCEPass`
        N)r   r.   LLVMPY_AddGlobalDCEPassrV   s    r    add_global_dce_passzPassManager.add_global_dce_pass2  s     	''-r"   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/Passes.html#globalopt-global-variable-optimizer

        LLVM 14: `LLVMAddGlobalOptimizerPass`
        N)r   r.   LLVMPY_AddGlobalOptimizerPassrV   s    r    add_global_optimizer_passz%PassManager.add_global_optimizer_pass:  r   r"   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/Passes.html#ipsccp-interprocedural-sparse-conditional-constant-propagation

        LLVM 14: `LLVMAddIPSCCPPass`
        N)r   r.   LLVMPY_AddIPSCCPPassrV   s    r    add_ipsccp_passzPassManager.add_ipsccp_passB  r[   r"   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/Passes.html#dce-dead-code-elimination
        LLVM 14: `llvm::createDeadCodeEliminationPass`
        N)r   r.   !LLVMPY_AddDeadCodeEliminationPassrV   s    r    add_dead_code_elimination_passz*PassManager.add_dead_code_elimination_passJ  s    
 	11$7r"   c                 n    t         dkD  rd}t        |      t        j                  j	                  |        y)z
        See https://llvm.org/docs/Passes.html#aggressive-instcombine-combine-expression-patterns

        LLVM 14: `llvm::createAggressiveInstCombinerPass`
           z4AggressiveInstrCombinerPass unavailable in LLVM > 15N)llvm_version_majorr   r   r.   ,LLVMPY_AddAggressiveInstructionCombiningPass)r   r   s     r    )add_aggressive_instruction_combining_passz5PassManager.add_aggressive_instruction_combining_passQ  s.     "HCs##<<TBr"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#internalize-internalize-global-symbols

        LLVM 14: `llvm::createInternalizePass`
        N)r   r.   LLVMPY_AddInternalizePassrV   s    r    add_internalize_passz PassManager.add_internalize_pass]       	))$/r"   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/Passes.html#simplifycfg-simplify-the-cfg

        LLVM 14: `LLVMAddCFGSimplificationPass`
        N)r   r.   LLVMPY_AddCFGSimplificationPassrV   s    r    add_cfg_simplification_passz'PassManager.add_cfg_simplification_passe  r   r"   c                 D    t         j                  j                  | |       y)z
        See https://llvm.org/docs/Passes.html#jump-threading-jump-threading

        LLVM 14: `llvm::createJumpThreadingPass`
        N)r   r.   LLVMPY_AddJumpThreadingPassr   s     r    add_jump_threading_passz#PassManager.add_jump_threading_passm  rx   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#lcssa-loop-closed-ssa-form-pass

        LLVM 14: `llvm::createLCSSAPass`
        N)r   r.   LLVMPY_AddLCSSAPassrV   s    r    add_lcssa_passzPassManager.add_lcssa_passu  s     	##D)r"   c                 B    t         j                  j                  |        y)zt
        See http://llvm.org/docs/Passes.html#gvn-global-value-numbering

        LLVM 14: `LLVMAddGVNPass`
        N)r   r.   LLVMPY_AddGVNPassrV   s    r    add_gvn_passzPassManager.add_gvn_pass}  s     	!!$'r"   c                 B    t         j                  j                  |        y)z}
        See http://llvm.org/docs/Passes.html#passes-instcombine

        LLVM 14: `LLVMAddInstructionCombiningPass`
        N)r   r.   "LLVMPY_AddInstructionCombiningPassrV   s    r    add_instruction_combining_passz*PassManager.add_instruction_combining_pass  r   r"   c                 B    t         j                  j                  |        y)zz
        See http://llvm.org/docs/Passes.html#licm-loop-invariant-code-motion

        LLVM 14: `LLVMAddLICMPass`
        N)r   r.   LLVMPY_AddLICMPassrV   s    r    add_licm_passzPassManager.add_licm_pass  r   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#loop-deletion-delete-dead-loops

        LLVM 14: `llvm::createLoopDeletionPass`
        N)r   r.   LLVMPY_AddLoopDeletionPassrV   s    r    add_loop_deletion_passz"PassManager.add_loop_deletion_pass       	**40r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#loop-extract-extract-loops-into-new-functions

        LLVM 14: `llvm::createLoopExtractorPass`
        N)r   r.   LLVMPY_AddLoopExtractorPassrV   s    r    add_loop_extractor_passz#PassManager.add_loop_extractor_pass  rc   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#loop-extract-single-extract-at-most-one-loop-into-a-new-function

        LLVM 14: `llvm::createSingleLoopExtractorPass`
        N)r   r.   !LLVMPY_AddSingleLoopExtractorPassrV   s    r    add_single_loop_extractor_passz*PassManager.add_single_loop_extractor_pass  rn   r"   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/Passes.html#sccp-sparse-conditional-constant-propagation

        LLVM 14: `LLVMAddSCCPPass`
        N)r   r.   LLVMPY_AddSCCPPassrV   s    r    add_sccp_passzPassManager.add_sccp_pass  r   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#loop-reduce-loop-strength-reduction

        LLVM 14: `llvm::createLoopStrengthReducePass`
        N)r   r.    LLVMPY_AddLoopStrengthReducePassrV   s    r    add_loop_strength_reduce_passz)PassManager.add_loop_strength_reduce_pass  rg   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#loop-simplify-canonicalize-natural-loops

        LLVM 14: `llvm::createLoopSimplifyPass`
        N)r   r.    LLVMPY_AddLoopSimplificationPassrV   s    r    add_loop_simplification_passz(PassManager.add_loop_simplification_pass  rg   r"   c                 B    t         j                  j                  |        y)zz
        See https://llvm.org/docs/Passes.html#loop-unroll-unroll-loops

        LLVM 14: `LLVMAddLoopUnrollPass`
        N)r   r.   LLVMPY_AddLoopUnrollPassrV   s    r    add_loop_unroll_passz PassManager.add_loop_unroll_pass  rr   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#loop-unroll-and-jam-unroll-and-jam-loops

        LLVM 14: `LLVMAddLoopUnrollAndJamPass`
        N)r   r.   LLVMPY_AddLoopUnrollAndJamPassrV   s    r    add_loop_unroll_and_jam_passz(PassManager.add_loop_unroll_and_jam_pass       	..t4r"   c                 F    t         j                  j                  | ||       y)z
        See https://llvm.org/docs/Passes.html#loop-unswitch-unswitch-loops

        LLVM 14: `llvm::createLoopUnswitchPass`
        LLVM 15: `llvm::createSimpleLoopUnswitchLegacyPass`
        N)r   r.   LLVMPY_AddLoopUnswitchPass)r   optimize_for_sizehas_branch_divergences      r    add_loop_unswitch_passz"PassManager.add_loop_unswitch_pass  s     	**41B+@	Br"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#loweratomic-lower-atomic-intrinsics-to-non-atomic-form

        LLVM 14: `llvm::createLowerAtomicPass`
        N)r   r.   LLVMPY_AddLowerAtomicPassrV   s    r    add_lower_atomic_passz!PassManager.add_lower_atomic_pass  r   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#lowerinvoke-lower-invokes-to-calls-for-unwindless-code-generators

        LLVM 14: `llvm::createLowerInvokePass`
        N)r   r.   LLVMPY_AddLowerInvokePassrV   s    r    add_lower_invoke_passz!PassManager.add_lower_invoke_pass  r   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#lowerswitch-lower-switchinsts-to-branches

        LLVM 14: `llvm::createLowerSwitchPass`
        N)r   r.   LLVMPY_AddLowerSwitchPassrV   s    r    add_lower_switch_passz!PassManager.add_lower_switch_pass  r   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#memcpyopt-memcpy-optimization

        LLVM 14: `llvm::createMemCpyOptPass`
        N)r   r.    LLVMPY_AddMemCpyOptimizationPassrV   s    r    add_memcpy_optimization_passz(PassManager.add_memcpy_optimization_pass  rg   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#mergefunc-merge-functions

        LLVM 14: `llvm::createMergeFunctionsPass`
        N)r   r.   LLVMPY_AddMergeFunctionsPassrV   s    r    add_merge_functions_passz$PassManager.add_merge_functions_pass  r_   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#mergereturn-unify-function-exit-nodes

        LLVM 14: `llvm::createUnifyFunctionExitNodesPass`
        N)r   r.   LLVMPY_AddMergeReturnsPassrV   s    r    add_merge_returns_passz"PassManager.add_merge_returns_pass	  r   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#partial-inliner-partial-inliner

        LLVM 14: `llvm::createPartialInliningPass`
        N)r   r.   LLVMPY_AddPartialInliningPassrV   s    r    add_partial_inlining_passz%PassManager.add_partial_inlining_pass  r   r"   c                 j    t         dkD  rt        d      t        j                  j	                  |        y)z
        See https://llvm.org/docs/Passes.html#prune-eh-remove-unused-exception-handling-info

        LLVM 14: `llvm::createPruneEHPass`
        r   z$PruneEHPass unavailable in LLVM > 15N)r   r   r   r.   $LLVMPY_AddPruneExceptionHandlingPassrV   s    r    !add_prune_exception_handling_passz-PassManager.add_prune_exception_handling_pass  s*     "EFF44T:r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#reassociate-reassociate-expressions

        LLVM 14: `llvm::createReassociatePass`
        N)r   r.   LLVMPY_AddReassociatePassrV   s    r     add_reassociate_expressions_passz,PassManager.add_reassociate_expressions_pass#  r   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#rel-lookup-table-converter-relative-lookup-table-converter

        LLVM 14: `llvm::createDemoteRegisterToMemoryPass`
        N)r   r.   $LLVMPY_AddDemoteRegisterToMemoryPassrV   s    r    "add_demote_register_to_memory_passz.PassManager.add_demote_register_to_memory_pass+  r   r"   c                 B    t         j                  j                  |        y)a   
        See http://llvm.org/docs/Passes.html#scalarrepl-scalar-replacement-of-aggregates-dt
        Note that this pass corresponds to the ``opt -sroa`` command-line option,
        despite the link above.

        LLVM 14: `llvm::createSROAPass`
        N)r   r.   LLVMPY_AddSROAPassrV   s    r    add_sroa_passzPassManager.add_sroa_pass3  s     	""4(r"   c                 B    t         j                  j                  |        y)zu
        See https://llvm.org/docs/Passes.html#sink-code-sinking

        LLVM 14: `llvm::createSinkingPass`
        N)r   r.   LLVMPY_AddSinkPassrV   s    r    add_sink_passzPassManager.add_sink_pass=  r   r"   c                 D    t         j                  j                  | |       y)z
        See https://llvm.org/docs/Passes.html#strip-strip-all-symbols-from-a-module

        LLVM 14: `llvm::createStripSymbolsPass`
        N)r   r.   LLVMPY_AddStripSymbolsPass)r   
only_debugs     r    add_strip_symbols_passz"PassManager.add_strip_symbols_passE  s     	**4<r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#strip-dead-debug-info-strip-debug-info-for-unused-symbols

        LLVM 14: `llvm::createStripDeadDebugInfoPass`
        N)r   r.    LLVMPY_AddStripDeadDebugInfoPassrV   s    r    add_strip_dead_debug_info_passz*PassManager.add_strip_dead_debug_info_passM  rg   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#strip-dead-prototypes-strip-unused-function-prototypes

        LLVM 14: `llvm::createStripDeadPrototypesPass`
        N)r   r.   !LLVMPY_AddStripDeadPrototypesPassrV   s    r    add_strip_dead_prototypes_passz*PassManager.add_strip_dead_prototypes_passU  rn   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#strip-debug-declare-strip-all-llvm-dbg-declare-intrinsics

        LLVM 14: `llvm::createStripDebugDeclarePass`
        N)r   r.   )LLVMPY_AddStripDebugDeclarePrototypesPassrV   s    r    add_strip_debug_declare_passz(PassManager.add_strip_debug_declare_pass]  s     	99$?r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#strip-nondebug-strip-all-symbols-except-dbg-symbols-from-a-module

        LLVM 14: `llvm::createStripNonDebugSymbolsPass`
        N)r   r.   "LLVMPY_AddStripNondebugSymbolsPassrV   s    r    add_strip_nondebug_symbols_passz+PassManager.add_strip_nondebug_symbols_passe  r   r"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#tailcallelim-tail-call-elimination

        LLVM 14: `llvm::createTailCallEliminationPass`
        N)r   r.   !LLVMPY_AddTailCallEliminationPassrV   s    r    add_tail_call_elimination_passz*PassManager.add_tail_call_elimination_passm  rn   r"   c                 B    t         j                  j                  |        y)z>
        LLVM 14: `LLVMAddTypeBasedAliasAnalysisPass`
        N)r   r.   $LLVMPY_AddTypeBasedAliasAnalysisPassrV   s    r    "add_type_based_alias_analysis_passz.PassManager.add_type_based_alias_analysis_passu  s     	44T:r"   c                 B    t         j                  j                  |        y)z
        See http://llvm.org/docs/AliasAnalysis.html#the-basicaa-pass

        LLVM 14: `LLVMAddBasicAliasAnalysisPass`
        N)r   r.    LLVMPY_AddBasicAliasAnalysisPassrV   s    r    add_basic_alias_analysis_passz)PassManager.add_basic_alias_analysis_pass{  rg   r"   c                 B    t         j                  j                  |        y)z:http://llvm.org/docs/Passes.html#loop-rotate-rotate-loops.N)r   r.   LLVMPY_AddLoopRotatePassrV   s    r    add_loop_rotate_passz PassManager.add_loop_rotate_pass  s    ((.r"   c                 V    t         j                  j                  | t        |             y r?   )r   r.   LLVMPY_AddTargetLibraryInfoPassr   )r   triples     r    add_target_library_infoz#PassManager.add_target_library_info  s    //nV6LMr"   c                 B    t         j                  j                  |        y)z
        See https://llvm.org/docs/Passes.html#instnamer-assign-names-to-anonymous-instructions.

        LLVM 14: `llvm::createInstructionNamerPass`
        N)r   r.   LLVMPY_AddInstructionNamerPassrV   s    r    add_instruction_namer_passz&PassManager.add_instruction_namer_pass  r   r"   i  c                 \    t        |      }t        j                  j                  | ||       y)a  Add Numba specific Reference count pruning pass.

        Parameters
        ----------
        subpasses_flags : RefPruneSubpasses
            A bitmask to control the subpasses to be enabled.
        subgraph_limit : int
            Limit the fanout pruners to working on a subgraph no bigger than
            this number of basic-blocks to avoid spending too much time in very
            large graphs. Default is 1000. Subject to change in future
            versions.
        N)rG   r   r.   LLVMPY_AddLegacyRefPrunePass)r   subpasses_flagssubgraph_limitiflagss       r    add_refprune_passzPassManager.add_refprune_pass  s$     #?3,,T6>Jr"   NF)T)   ))FF)Lr%   r&   r'   r(   rW   rZ   r^   rb   rf   rj   rm   rq   rw   r{   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r	  r  r  r  r  r  r  r  r"  r%  r(  r+  r.  r1  r4  r7  r;  r>  rG   rP   rD  r)   r"   r    rR   rR   k   s   3+32778/=A4,)2;/62CM79B2@.4+8
C06=*(9)128)77/5 275:
B0007314;0;))=78@98;7/N5 1B0E0E)-Kr"   rR   c                   ,    e Zd ZddZ	 	 ddZ	 	 ddZy)r@   Nc                 p    |t         j                  j                         }t        j	                  | |       y r?   )r   r.   LLVMPY_CreatePassManagerrR   __init__)r   ptrs     r    rK  zModulePassManager.__init__  s)    ;''224CT3'r"   c           	          | t         j                  j                  | |      S t         j                  j                  | |t	        |      t	        |      t	        |            }|dk(  rt        d      |dkD  S )a  
        Run optimization passes on the given module.

        Parameters
        ----------
        module : llvmlite.binding.ModuleRef
            The module to be optimized inplace
        remarks_file : str; optional
            If not `None`, it is the file to store the optimization remarks.
        remarks_format : str; optional
            The format to write; YAML is default
        remarks_filter : str; optional
            The filter that should be applied to the remarks output.
        rG  "Failed to initialize remarks file.r   )r   r.   LLVMPY_RunPassManager LLVMPY_RunPassManagerWithRemarksr   IOError)r   rD   remarks_fileremarks_formatremarks_filterrs         r    runzModulePassManager.run  so      7700v>>88fn^<~.|,.A BwBCCq5Lr"   c                    t               \  }}	 t        j                  |d      5  	 ddd       | j                  ||||      }|dk(  rt	        d      t        |      5 }t        |      |j                         fcddd       t        j                  |       S # 1 sw Y   rxY w# 1 sw Y   nxY w	 t        j                  |       y# t        j                  |       w xY w)a  
        Run optimization passes on the given module and returns the result and
        the remarks data.

        Parameters
        ----------
        module : llvmlite.binding.ModuleRef
            The module to be optimized
        remarks_format : str
            The remarks output; YAML is the default
        remarks_filter : str; optional
            The filter that should be applied to the remarks output.
        rU  NrG  rN  	r   osfdopenrV  rQ  openboolreadunlink)r   rD   rS  rT  
remarkdesc
remarkfilerU  fs           r    run_with_remarksz"ModulePassManager.run_with_remarks  s     ")
J		":s+ ^^LABwBCCj! )QAw() ) IIj! 
) ) ) IIj!BIIj!9   C B7C B$9	C B!C $B-)C Cr?   Nyaml re  rf  )r%   r&   r'   rK  rV  rb  r)   r"   r    r@   r@     s"    (
 =C6 7=(*"r"   r@   c                   6    e Zd Zd Zd Zd Z	 	 ddZ	 	 ddZy)	rC   c                     t         j                  j                  |      }|| _        d|_        t
        j                  | |       y )NT)r   r.    LLVMPY_CreateFunctionPassManager_module_ownedrR   rK  )r   rD   rL  s      r    rK  zFunctionPassManager.__init__  s4    gg66v>T3'r"   c                 @    t         j                  j                  |       S )zk
        Initialize the FunctionPassManager.  Returns True if it produced
        any changes (?).
        )r   r.   $LLVMPY_InitializeFunctionPassManagerrV   s    r    
initializezFunctionPassManager.initialize  s    
 ww;;DAAr"   c                 @    t         j                  j                  |       S )zi
        Finalize the FunctionPassManager.  Returns True if it produced
        any changes (?).
        )r   r.   "LLVMPY_FinalizeFunctionPassManagerrV   s    r    finalizezFunctionPassManager.finalize  s    
 ww99$??r"   Nc           	          | t         j                  j                  | |      S t         j                  j                  | |t	        |      t	        |      t	        |            }|dk(  rt        d      t        |      S )a  
        Run optimization passes on the given function.

        Parameters
        ----------
        function : llvmlite.binding.FunctionRef
            The function to be optimized inplace
        remarks_file : str; optional
            If not `None`, it is the file to store the optimization remarks.
        remarks_format : str; optional
            The format of the remarks file; the default is YAML
        remarks_filter : str; optional
            The filter that should be applied to the remarks output.
        rG  rN  )r   r.   LLVMPY_RunFunctionPassManager(LLVMPY_RunFunctionPassManagerWithRemarksr   rQ  r\  )r   functionrR  rS  rT  rU  s         r    rV  zFunctionPassManager.run  so      7788xHH@@h~ >~.|,.A BwBCC7Nr"   c                    t               \  }}	 t        j                  |d      5  	 ddd       | j                  ||||      }|dk(  rt	        d      t        |      5 }t        |      |j                         fcddd       t        j                  |       S # 1 sw Y   rxY w# 1 sw Y   nxY w	 t        j                  |       y# t        j                  |       w xY w)a  
        Run optimization passes on the given function and returns the result
        and the remarks data.

        Parameters
        ----------
        function : llvmlite.binding.FunctionRef
            The function to be optimized inplace
        remarks_format : str; optional
            The format of the remarks file; the default is YAML
        remarks_filter : str; optional
            The filter that should be applied to the remarks output.
        rU  NrG  rN  rX  )r   rv  rS  rT  r_  r`  rU  ra  s           r    rb  z$FunctionPassManager.run_with_remarks  s    " ")
J	" :s+ :~~NABwBCCj! )QAw() ) IIj! 
) ) ) IIj!BIIj!rc  rd  rg  )r%   r&   r'   rK  ro  rr  rV  rb  r)   r"   r    rC   rC     s.    (B@ ?E6 9?(*"r"   rC      rE  )wctypesr   r   r   r   r   r   r	   collectionsr
   enumr   llvmlite.bindingr   llvmlite.binding.initfinir   rY  tempfiler   llvmlite.binding.commonr   r   _prunestatsr   r+   r3   r7   r=   rA   rE   rG   	ObjectRefrR   r@   rC   LLVMPassManagerRefr.   rJ  restypeLLVMModuleRefrj  argtypesrU   rO  rP  rn  rq  LLVMValueRefrt  ru  rY   r]   ra   re   ri   rl   rp   rt   rz   r}   LLVMPY_AddInstructionCountPassr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  r!  r$  r'  r*  r-  r   r   r   r   r   r   r   r   r   r   r   r   r  r0  r3  r9  r=  r@  r/   r)   r"   r    <module>r     s 
     "    7 	  2&q) BEB B0$I $*	1 '3 3xK#-- xKv;" ;"|N"+ N"h ,/+A+A     (585F5F4G ( ( 1363I3I ( ( 0.1.D.D-E ! ! **-*@*@*-*;*;*=   &(.   %585K5K585F5F5=5=5=	5? ( ( 1
 49 ( ( 09<9O9O8P , , 57= , , 47:7M7M6N * * 35; * * 2252H2H252B2B2D % % .06 % % - C,,h(= 0 0 9 <A 0 0 8),)?)?(@   %141G1G0H $ $ -030F0F/G # # ,585K5K4L ( ( 1585K5K4L ( ( 1696L6L5M ) ) 2-0-C-C,D     )030F0F/O # # ,
4 ' ' 0 362H2H1I % % .363I3I2J & & /*-*@*@)A   &030F0F/G # # ,'*'='=&>   #9<9O9O8P , , 5-0-C-C,D     )474J4J3K ' ' 0030F0F/G # # ,030F0F/O # # ,585K5K4L ( ( 17 * * 3 @ 3 3 < E CGG88A /2.D.D-E ! ! *(+(>(>'?   $/2/E/E.F " " +030F0F/G # # ,696L6L5M ) ) 2585K5K4L ( ( 1585K5K4L ( ( 1-0-C-C,D     )363I3I2J & & //2/E/Ev/5/7 " " +.1.D.D-E ! ! *.1.D.D-E ! ! *.1.D.D-E ! ! *585K5K4L ( ( 1141G1G0H $ $ -/2/E/E.F " " +252H2H1I % % .=CGG009 /2.D.D-E ! ! *9<9O9O8P , , 5'*'='=&>   #/2/E/Ev.N " " +585K5K4L ( ( 1696L6L5M ) ) 2> 1 1 :7:7M7M6N * * 3696L6L5M ) ) 2030F0F/N # # ,030F0F/G # # ,E3# & & /,/,B,B+C   (252H2H1I % % .),)?)?(@   %696L6L5M ) ) 2474J4J3K ' ' 0&)&<&<%=   "7:7M7M6N * * 3'*'='=&>   #'*'='=&>   #'*'='=&>   #9<9O9O8P , , 5585K5K4L ( ( 1474J4J4<4> ' ' 0363I3I2J & & /141G1G191; $ $ - .5]-CV,L     )r"   