o
    "ѹg                     @   s  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	 d	eZG dd deZd"ddZdd Zdd Zdd Zdd ZG dd deZG dd dejZ G dd de Z!G dd  d e Z"ej#ej$j%_&ej'gej$j(_)ej#ej$j(_&ej#gej$j*_)ej#ej'gej$j+_)eej$j+_&ej#ej'eeegej$j,_)eej$j,_&ej#gej$j-_)eej$j-_&ej#gej$j._)eej$j._&ej#ej/gej$j0_)eej$j0_&ej#ej/eeegej$j1_)eej$j1_&ej#gej$j2_)ej#gej$j3_)ej#gej$j4_)ej#gej$j5_)ej#gej$j6_)ej#gej$j7_)ej#gej$j8_)ej#egej$j9_)ej#egej$j:_)ej#gej$j;_)ej#gej$j<_)ej#gej$j=_)ej#gej$j>_)ej#gej$j?_)ej#gej$j@_)ej#gej$jA_)ej#gej$jB_)ej#gej$jC_)ej#egej$jD_)ej#gej$jE_)ej#gej$jF_)ej#gej$jG_)ed!k rej#gej$jH_)ej#gej$jI_)ej#gej$jJ_)ej#gej$jK_)ej#gej$jL_)ej#gej$jM_)ej#gej$jN_)ej#gej$jO_)ej#gej$jP_)ej#gej$jQ_)ej#eegej$jR_)ej#gej$jS_)ej#gej$jT_)ej#gej$jU_)ej#gej$jV_)ej#gej$jW_)ej#gej$jX_)ej#gej$jY_)ed!k r'ej#gej$jZ_)ej#gej$j[_)ej#gej$j\_)ej#gej$j]_)ej#egej$j^_)ej#gej$j__)ej#gej$j`_)ej#gej$ja_)ej#gej$jb_)ej#gej$jc_)ej#egej$jd_)ej#gej$je_)ej#egej$jf_)ej#gej$jg_)ej#gej$jh_)ej#gej$ji_)ej#gej$jj_)ej#gej$jk_)ej#gej$jl_)ej#gej$jm_)ej#gej$jn_)ej#gej$jo_)ej#gej$jp_)ej#gej$jq_)ej#gej$jr_)ej#egej$js_)ej#gej$jt_)ej#eegej$ju_)eeegej$jv_)dS )#    )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                   @   s    e Zd ZdZdd Zdd ZdS )r   z4 Holds statistics from reference count pruning.
    c                 C   sN   t |tsd}t|t|t| j|j | j|j | j|j | j|j S )Nz;PruneStats can only be added to another PruneStats, got {}.	
isinstancer   	TypeErrorformattype
basicblockdiamondfanoutfanout_raiseselfothermsg r   a/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/site-packages/llvmlite/binding/passmanagers.py__add__   s   



zPruneStats.__add__c                 C   sN   t |tsd}t|t|t| j|j | j|j | j|j | j|j S )NzBPruneStats can only be subtracted from another PruneStats, got {}.r   r   r   r   r   __sub__   s   



zPruneStats.__sub__N)__name__
__module____qualname____doc__r   r    r   r   r   r   r      s    	c                   @   s(   e Zd ZdefdefdefdefgZdS )_c_PruneStatsr   r   r   r   N)r!   r"   r#   r   _fields_r   r   r   r   r%   )   s    r%   Fc                 C   s>   t dddd}t| }t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   N)r%   r   r   libLLVMPY_DumpRefPruneStatsr   r   r   r   r   r   )ZprintoutstatsZdo_printr   r   r   dump_refprune_stats1   s   r*   c                 C   s   t jt|  dS )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'   ZLLVMPY_SetTimePassesr   )enabler   r   r   set_time_passes?   s   	r,   c                  C   s@   t  } t j|  t| W  d   S 1 sw   Y  dS )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'   ZLLVMPY_ReportAndResetTimingsstr)bufr   r   r   report_and_reset_timingsK   s   
$r0   c                   C   s   t  S N)ModulePassManagerr   r   r   r   create_module_pass_manager[   s   r3   c                 C   s   t | S r1   )FunctionPassManager)moduler   r   r   create_function_pass_manager_   s   r6   c                   @   s,   e Zd ZdZdZdZdZeeB eB eB ZdS )RefPruneSubpasses            N)r!   r"   r#   ZPER_BBZDIAMONDZFANOUTZFANOUT_RAISEALLr   r   r   r   r7   c   s    r7   c                   @   sZ  e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd ZdddZdddZdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zdd(d)Zdd+d,Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Z d?d@ Z!dAdB Z"dCdD Z#ddFdGZ$dHdI Z%dJdK Z&dLdM Z'dNdO Z(dPdQ Z)dRdS Z*dTdU Z+dVdW Z,dXdY Z-dZd[ Z.d\d] Z/d^d_ Z0		dd`daZ1dbdc Z2ddde Z3dfdg Z4dhdi Z5djdk Z6dldm Z7dndo Z8dpdq Z9drds Z:dtdu Z;dvdw Z<dxdy Z=ddzd{Z>d|d} Z?d~d Z@dd ZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHeIjJdfddZKdS )PassManagerzPassManager
    c                 C   s   | j |  d S r1   )Z_capiLLVMPY_DisposePassManagerr   r   r   r   _disposeo   s   zPassManager._disposec                 C      t j|  dS )z
        See https://llvm.org/docs/Passes.html#aa-eval-exhaustive-alias-analysis-precision-evaluator

        LLVM 14: `llvm::createAAEvalPass`
        N)r   r'   LLVMPY_AddAAEvalPassr?   r   r   r   add_aa_eval_passr      zPassManager.add_aa_eval_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#basic-aa-basic-alias-analysis-stateless-aa-impl

        LLVM 14: `llvm::createBasicAAWrapperPass`
        N)r   r'   LLVMPY_AddBasicAAWrapperPassr?   r   r   r   add_basic_aa_passz   rD   zPassManager.add_basic_aa_passc                 C   rA   )z
        See http://llvm.org/docs/Passes.html#constmerge-merge-duplicate-global-constants

        LLVM 14: `LLVMAddConstantMergePass`
        N)r   r'   LLVMPY_AddConstantMergePassr?   r   r   r   add_constant_merge_pass   rD   z#PassManager.add_constant_merge_passc                 C   rA   )z
        See http://llvm.org/docs/Passes.html#deadargelim-dead-argument-elimination

        LLVM 14: `LLVMAddDeadArgEliminationPass`
        N)r   r'    LLVMPY_AddDeadArgEliminationPassr?   r   r   r   add_dead_arg_elimination_pass   rD   z)PassManager.add_dead_arg_elimination_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#da-dependence-analysis

        LLVM 14: `llvm::createDependenceAnalysisWrapperPass`
        N)r   r'    LLVMPY_AddDependenceAnalysisPassr?   r   r   r   add_dependence_analysis_pass   rD   z(PassManager.add_dependence_analysis_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#dot-callgraph-print-call-graph-to-dot-file

        LLVM 14: `llvm::createCallGraphDOTPrinterPass`
        N)r   r'   !LLVMPY_AddCallGraphDOTPrinterPassr?   r   r   r   add_dot_call_graph_pass   rD   z#PassManager.add_dot_call_graph_passc                 C   rA   )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_AddCFGPrinterPassr?   r   r   r   add_dot_cfg_printer_pass   rD   z$PassManager.add_dot_cfg_printer_passFc                 C      t j| | dS )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   Z	show_bodyr   r   r   add_dot_dom_printer_pass      z$PassManager.add_dot_dom_printer_passc                 C   rQ   )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_AddDotPostDomPrinterPassrS   r   r   r   add_dot_postdom_printer_pass   rU   z(PassManager.add_dot_postdom_printer_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#globalsmodref-aa-simple-mod-ref-analysis-for-globals

        LLVM 14: `llvm::createGlobalsAAWrapperPass`
        N)r   r'   LLVMPY_AddGlobalsModRefAAPassr?   r   r   r   add_globals_mod_ref_aa_pass   rD   z'PassManager.add_globals_mod_ref_aa_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#iv-users-induction-variable-users

        LLVM 14: `llvm::createIVUsersPass`
        N)r   r'   LLVMPY_AddIVUsersPassr?   r   r   r   add_iv_users_pass   rD   zPassManager.add_iv_users_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#lint-statically-lint-checks-llvm-ir

        LLVM 14: `llvm::createLintLegacyPassPass`
        N)r   r'   LLVMPY_AddLintPassr?   r   r   r   add_lint_pass   rD   zPassManager.add_lint_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#lazy-value-info-lazy-value-information-analysis

        LLVM 14: `llvm::createLazyValueInfoPass`
        N)r   r'   LLVMPY_AddLazyValueInfoPassr?   r   r   r   add_lazy_value_info_pass   rD   z$PassManager.add_lazy_value_info_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#module-debuginfo-decodes-module-level-debug-info

        LLVM 14: `llvm::createModuleDebugInfoPrinterPass`
        N)r   r'   $LLVMPY_AddModuleDebugInfoPrinterPassr?   r   r   r   add_module_debug_info_pass   rD   z&PassManager.add_module_debug_info_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#regions-detect-single-entry-single-exit-regions

        LLVM 14: `llvm::createRegionInfoPass`
        N)r   r'   LLVMPY_AddRegionInfoPassr?   r   r   r   add_region_info_pass   rD   z PassManager.add_region_info_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#scev-aa-scalarevolution-based-alias-analysis

        LLVM 14: `llvm::createSCEVAAWrapperPass`
        N)r   r'   LLVMPY_AddScalarEvolutionAAPassr?   r   r   r   add_scalar_evolution_aa_pass   rD   z(PassManager.add_scalar_evolution_aa_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#adce-aggressive-dead-code-elimination

        LLVM 14: `llvm::createAggressiveDCEPass`
        N)r   r'   LLVMPY_AddAggressiveDCEPassr?   r   r   r   )add_aggressive_dead_code_elimination_pass   rD   z5PassManager.add_aggressive_dead_code_elimination_passTc                 C   rQ   )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   Zinsert_lifetimer   r   r   add_always_inliner_pass   rU   z#PassManager.add_always_inliner_pass   c                 C   s   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 > 14N)RuntimeError)r   Zmax_elementsr   r   r   add_arg_promotion_pass  s   z"PassManager.add_arg_promotion_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#break-crit-edges-break-critical-edges-in-cfg

        LLVM 14: `llvm::createBreakCriticalEdgesPass`
        N)r   r'    LLVMPY_AddBreakCriticalEdgesPassr?   r   r   r   add_break_critical_edges_pass
  rD   z)PassManager.add_break_critical_edges_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#dse-dead-store-elimination

        LLVM 14: `llvm::createDeadStoreEliminationPass`
        N)r   r'   "LLVMPY_AddDeadStoreEliminationPassr?   r   r   r   add_dead_store_elimination_pass  rD   z+PassManager.add_dead_store_elimination_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#function-attrs-deduce-function-attributes

        LLVM 14: `llvm::createReversePostOrderFunctionAttrsPass`
        N)r   r'   +LLVMPY_AddReversePostOrderFunctionAttrsPassr?   r   r   r   *add_reverse_post_order_function_attrs_pass  rD   z6PassManager.add_reverse_post_order_function_attrs_passc                 C   rA   )z
        See http://llvm.org/docs/Passes.html#functionattrs-deduce-function-attributes

        LLVM 14: `LLVMAddFunctionAttrsPass`
        N)r   r'   LLVMPY_AddFunctionAttrsPassr?   r   r   r   add_function_attrs_pass"  rD   z#PassManager.add_function_attrs_passc                 C   rQ   )z
        See http://llvm.org/docs/Passes.html#inline-function-integration-inlining

        LLVM 14: `createFunctionInliningPass`
        N)r   r'   LLVMPY_AddFunctionInliningPassr   	thresholdr   r   r   add_function_inlining_pass*  rU   z&PassManager.add_function_inlining_passc                 C   rA   )z
        See http://llvm.org/docs/Passes.html#globaldce-dead-global-elimination

        LLVM 14: `LLVMAddGlobalDCEPass`
        N)r   r'   LLVMPY_AddGlobalDCEPassr?   r   r   r   add_global_dce_pass2  rD   zPassManager.add_global_dce_passc                 C   rA   )z
        See http://llvm.org/docs/Passes.html#globalopt-global-variable-optimizer

        LLVM 14: `LLVMAddGlobalOptimizerPass`
        N)r   r'   LLVMPY_AddGlobalOptimizerPassr?   r   r   r   add_global_optimizer_pass:  rD   z%PassManager.add_global_optimizer_passc                 C   rA   )z
        See http://llvm.org/docs/Passes.html#ipsccp-interprocedural-sparse-conditional-constant-propagation

        LLVM 14: `LLVMAddIPSCCPPass`
        N)r   r'   LLVMPY_AddIPSCCPPassr?   r   r   r   add_ipsccp_passB  rD   zPassManager.add_ipsccp_passc                 C   rA   )z
        See http://llvm.org/docs/Passes.html#dce-dead-code-elimination
        LLVM 14: `llvm::createDeadCodeEliminationPass`
        N)r   r'   !LLVMPY_AddDeadCodeEliminationPassr?   r   r   r   add_dead_code_elimination_passJ  s   z*PassManager.add_dead_code_elimination_passc                 C   s$   t dkr
d}t|tj|  dS )z
        See https://llvm.org/docs/Passes.html#aggressive-instcombine-combine-expression-patterns

        LLVM 14: `llvm::createAggressiveInstCombinerPass`
           z4AggressiveInstrCombinerPass unavailable in LLVM > 15N)llvm_version_majorrk   r   r'   ,LLVMPY_AddAggressiveInstructionCombiningPass)r   r   r   r   r   )add_aggressive_instruction_combining_passQ  s   z5PassManager.add_aggressive_instruction_combining_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#internalize-internalize-global-symbols

        LLVM 14: `llvm::createInternalizePass`
        N)r   r'   LLVMPY_AddInternalizePassr?   r   r   r   add_internalize_pass]  rD   z PassManager.add_internalize_passc                 C   rA   )z
        See http://llvm.org/docs/Passes.html#simplifycfg-simplify-the-cfg

        LLVM 14: `LLVMAddCFGSimplificationPass`
        N)r   r'   LLVMPY_AddCFGSimplificationPassr?   r   r   r   add_cfg_simplification_passe  rD   z'PassManager.add_cfg_simplification_passc                 C   rQ   )z
        See https://llvm.org/docs/Passes.html#jump-threading-jump-threading

        LLVM 14: `llvm::createJumpThreadingPass`
        N)r   r'   LLVMPY_AddJumpThreadingPassrv   r   r   r   add_jump_threading_passm  rU   z#PassManager.add_jump_threading_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#lcssa-loop-closed-ssa-form-pass

        LLVM 14: `llvm::createLCSSAPass`
        N)r   r'   LLVMPY_AddLCSSAPassr?   r   r   r   add_lcssa_passu  rD   zPassManager.add_lcssa_passc                 C   rA   )zt
        See http://llvm.org/docs/Passes.html#gvn-global-value-numbering

        LLVM 14: `LLVMAddGVNPass`
        N)r   r'   LLVMPY_AddGVNPassr?   r   r   r   add_gvn_pass}  rD   zPassManager.add_gvn_passc                 C   rA   )z}
        See http://llvm.org/docs/Passes.html#passes-instcombine

        LLVM 14: `LLVMAddInstructionCombiningPass`
        N)r   r'   "LLVMPY_AddInstructionCombiningPassr?   r   r   r   add_instruction_combining_pass  rD   z*PassManager.add_instruction_combining_passc                 C   rA   )zz
        See http://llvm.org/docs/Passes.html#licm-loop-invariant-code-motion

        LLVM 14: `LLVMAddLICMPass`
        N)r   r'   LLVMPY_AddLICMPassr?   r   r   r   add_licm_pass  rD   zPassManager.add_licm_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#loop-deletion-delete-dead-loops

        LLVM 14: `llvm::createLoopDeletionPass`
        N)r   r'   LLVMPY_AddLoopDeletionPassr?   r   r   r   add_loop_deletion_pass  rD   z"PassManager.add_loop_deletion_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#loop-extract-extract-loops-into-new-functions

        LLVM 14: `llvm::createLoopExtractorPass`
        N)r   r'   LLVMPY_AddLoopExtractorPassr?   r   r   r   add_loop_extractor_pass  rD   z#PassManager.add_loop_extractor_passc                 C   rA   )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_AddSingleLoopExtractorPassr?   r   r   r   add_single_loop_extractor_pass  rD   z*PassManager.add_single_loop_extractor_passc                 C   rA   )z
        See http://llvm.org/docs/Passes.html#sccp-sparse-conditional-constant-propagation

        LLVM 14: `LLVMAddSCCPPass`
        N)r   r'   LLVMPY_AddSCCPPassr?   r   r   r   add_sccp_pass  rD   zPassManager.add_sccp_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#loop-reduce-loop-strength-reduction

        LLVM 14: `llvm::createLoopStrengthReducePass`
        N)r   r'    LLVMPY_AddLoopStrengthReducePassr?   r   r   r   add_loop_strength_reduce_pass  rD   z)PassManager.add_loop_strength_reduce_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#loop-simplify-canonicalize-natural-loops

        LLVM 14: `llvm::createLoopSimplifyPass`
        N)r   r'    LLVMPY_AddLoopSimplificationPassr?   r   r   r   add_loop_simplification_pass  rD   z(PassManager.add_loop_simplification_passc                 C   rA   )zz
        See https://llvm.org/docs/Passes.html#loop-unroll-unroll-loops

        LLVM 14: `LLVMAddLoopUnrollPass`
        N)r   r'   LLVMPY_AddLoopUnrollPassr?   r   r   r   add_loop_unroll_pass  rD   z PassManager.add_loop_unroll_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#loop-unroll-and-jam-unroll-and-jam-loops

        LLVM 14: `LLVMAddLoopUnrollAndJamPass`
        N)r   r'   LLVMPY_AddLoopUnrollAndJamPassr?   r   r   r   add_loop_unroll_and_jam_pass  rD   z(PassManager.add_loop_unroll_and_jam_passc                 C   s   t j| || dS )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   Zoptimize_for_sizeZhas_branch_divergencer   r   r   add_loop_unswitch_pass  s   
	z"PassManager.add_loop_unswitch_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#loweratomic-lower-atomic-intrinsics-to-non-atomic-form

        LLVM 14: `llvm::createLowerAtomicPass`
        N)r   r'   LLVMPY_AddLowerAtomicPassr?   r   r   r   add_lower_atomic_pass  rD   z!PassManager.add_lower_atomic_passc                 C   rA   )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_AddLowerInvokePassr?   r   r   r   add_lower_invoke_pass  rD   z!PassManager.add_lower_invoke_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#lowerswitch-lower-switchinsts-to-branches

        LLVM 14: `llvm::createLowerSwitchPass`
        N)r   r'   LLVMPY_AddLowerSwitchPassr?   r   r   r   add_lower_switch_pass  rD   z!PassManager.add_lower_switch_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#memcpyopt-memcpy-optimization

        LLVM 14: `llvm::createMemCpyOptPass`
        N)r   r'    LLVMPY_AddMemCpyOptimizationPassr?   r   r   r   add_memcpy_optimization_pass  rD   z(PassManager.add_memcpy_optimization_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#mergefunc-merge-functions

        LLVM 14: `llvm::createMergeFunctionsPass`
        N)r   r'   LLVMPY_AddMergeFunctionsPassr?   r   r   r   add_merge_functions_pass  rD   z$PassManager.add_merge_functions_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#mergereturn-unify-function-exit-nodes

        LLVM 14: `llvm::createUnifyFunctionExitNodesPass`
        N)r   r'   LLVMPY_AddMergeReturnsPassr?   r   r   r   add_merge_returns_pass	  rD   z"PassManager.add_merge_returns_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#partial-inliner-partial-inliner

        LLVM 14: `llvm::createPartialInliningPass`
        N)r   r'   LLVMPY_AddPartialInliningPassr?   r   r   r   add_partial_inlining_pass  rD   z%PassManager.add_partial_inlining_passc                 C   s    t dkrtdtj|  dS )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   rk   r   r'   $LLVMPY_AddPruneExceptionHandlingPassr?   r   r   r   !add_prune_exception_handling_pass  s   z-PassManager.add_prune_exception_handling_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#reassociate-reassociate-expressions

        LLVM 14: `llvm::createReassociatePass`
        N)r   r'   LLVMPY_AddReassociatePassr?   r   r   r    add_reassociate_expressions_pass#  rD   z,PassManager.add_reassociate_expressions_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#rel-lookup-table-converter-relative-lookup-table-converter

        LLVM 14: `llvm::createDemoteRegisterToMemoryPass`
        N)r   r'   $LLVMPY_AddDemoteRegisterToMemoryPassr?   r   r   r   "add_demote_register_to_memory_pass+  rD   z.PassManager.add_demote_register_to_memory_passc                 C   rA   )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_AddSROAPassr?   r   r   r   add_sroa_pass3  s   zPassManager.add_sroa_passc                 C   rA   )zu
        See https://llvm.org/docs/Passes.html#sink-code-sinking

        LLVM 14: `llvm::createSinkingPass`
        N)r   r'   LLVMPY_AddSinkPassr?   r   r   r   add_sink_pass=  rD   zPassManager.add_sink_passc                 C   rQ   )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   Z
only_debugr   r   r   add_strip_symbols_passE  rU   z"PassManager.add_strip_symbols_passc                 C   rA   )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_AddStripDeadDebugInfoPassr?   r   r   r   add_strip_dead_debug_info_passM  rD   z*PassManager.add_strip_dead_debug_info_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#strip-dead-prototypes-strip-unused-function-prototypes

        LLVM 14: `llvm::createStripDeadPrototypesPass`
        N)r   r'   !LLVMPY_AddStripDeadPrototypesPassr?   r   r   r   add_strip_dead_prototypes_passU  rD   z*PassManager.add_strip_dead_prototypes_passc                 C   rA   )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_AddStripDebugDeclarePrototypesPassr?   r   r   r   add_strip_debug_declare_pass]  rD   z(PassManager.add_strip_debug_declare_passc                 C   rA   )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_AddStripNondebugSymbolsPassr?   r   r   r   add_strip_nondebug_symbols_passe  rD   z+PassManager.add_strip_nondebug_symbols_passc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#tailcallelim-tail-call-elimination

        LLVM 14: `llvm::createTailCallEliminationPass`
        N)r   r'   !LLVMPY_AddTailCallEliminationPassr?   r   r   r   add_tail_call_elimination_passm  rD   z*PassManager.add_tail_call_elimination_passc                 C   rA   )z>
        LLVM 14: `LLVMAddTypeBasedAliasAnalysisPass`
        N)r   r'   $LLVMPY_AddTypeBasedAliasAnalysisPassr?   r   r   r   "add_type_based_alias_analysis_passu  s   z.PassManager.add_type_based_alias_analysis_passc                 C   rA   )z
        See http://llvm.org/docs/AliasAnalysis.html#the-basicaa-pass

        LLVM 14: `LLVMAddBasicAliasAnalysisPass`
        N)r   r'    LLVMPY_AddBasicAliasAnalysisPassr?   r   r   r   add_basic_alias_analysis_pass{  rD   z)PassManager.add_basic_alias_analysis_passc                 C   rA   )z:http://llvm.org/docs/Passes.html#loop-rotate-rotate-loops.N)r   r'   ZLLVMPY_AddLoopRotatePassr?   r   r   r   add_loop_rotate_pass  s   z PassManager.add_loop_rotate_passc                 C   s   t j| t| d S r1   )r   r'   LLVMPY_AddTargetLibraryInfoPassr   )r   Ztripler   r   r   add_target_library_info  s   z#PassManager.add_target_library_infoc                 C   rA   )z
        See https://llvm.org/docs/Passes.html#instnamer-assign-names-to-anonymous-instructions.

        LLVM 14: `llvm::createInstructionNamerPass`
        N)r   r'   LLVMPY_AddInstructionNamerPassr?   r   r   r   add_instruction_namer_pass  rD   z&PassManager.add_instruction_namer_passi  c                 C   s   t |}tj| || dS )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)r7   r   r'   LLVMPY_AddLegacyRefPrunePass)r   Zsubpasses_flagsZsubgraph_limitZiflagsr   r   r   add_refprune_pass  s   zPassManager.add_refprune_passNF)T)rj   )r   )FF)Lr!   r"   r#   r$   r@   rC   rF   rH   rJ   rL   rN   rP   rT   rW   rY   r[   r]   r_   ra   rc   re   rg   ri   rl   rn   rp   rr   rt   rx   rz   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   r7   r<   r   r   r   r   r   r=   k   s    




	




r=   c                   @   s2   e Zd Zd
ddZ		dddZ		ddd	ZdS )r2   Nc                 C   s"   |d u r	t j }t| | d S r1   )r   r'   LLVMPY_CreatePassManagerr=   __init__)r   ptrr   r   r   r     s   
zModulePassManager.__init__yaml c                 C   sN   |du rt j| |S t j| |t|t|t|}|dkr#td|dk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.
        Nr   "Failed to initialize remarks file.r   )r   r'   LLVMPY_RunPassManager LLVMPY_RunPassManagerWithRemarksr   IOError)r   r5   remarks_fileremarks_formatremarks_filterrr   r   r   run     
zModulePassManager.runc              	   C      t  \}}zPt|d W d   n1 sw   Y  | ||||}|dkr,tdt|}t|| fW  d   W t| S 1 sIw   Y  W t| dS t| 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.
        r   Nr   r   	r   osfdopenr   r   openboolreadunlink)r   r5   r   r   
remarkdesc
remarkfiler   fr   r   r   run_with_remarks  s   

z"ModulePassManager.run_with_remarksr1   Nr   r   r   r   )r!   r"   r#   r   r   r   r   r   r   r   r2     s    

r2   c                   @   s@   e Zd Zdd Zdd Zdd Z			dd
dZ			dddZdS )r4   c                 C   s(   t j|}|| _d|_t| | d S )NT)r   r'    LLVMPY_CreateFunctionPassManager_moduleZ_ownedr=   r   )r   r5   r   r   r   r   r     s   zFunctionPassManager.__init__c                 C      t j| S )zk
        Initialize the FunctionPassManager.  Returns True if it produced
        any changes (?).
        N)r   r'   $LLVMPY_InitializeFunctionPassManagerr?   r   r   r   
initialize     zFunctionPassManager.initializec                 C   r   )zi
        Finalize the FunctionPassManager.  Returns True if it produced
        any changes (?).
        N)r   r'   "LLVMPY_FinalizeFunctionPassManagerr?   r   r   r   finalize  r   zFunctionPassManager.finalizeNr   r   c                 C   sN   |du rt j| |S t 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.
        Nr   r   )r   r'   LLVMPY_RunFunctionPassManager(LLVMPY_RunFunctionPassManagerWithRemarksr   r   r   )r   functionr   r   r   r   r   r   r   r     r   zFunctionPassManager.runc              	   C   r   )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.
        r   Nr   r   r   )r   r   r   r   r   r   r   r   r   r   r   r     s   

z$FunctionPassManager.run_with_remarksr   r   )r!   r"   r#   r   r   r   r   r   r   r   r   r   r4     s    
r4      r   )wctypesr   r   r   r   r   r   r   collectionsr	   enumr
   Zllvmlite.bindingr   Zllvmlite.binding.initfinir   r   tempfiler   Zllvmlite.binding.commonr   r   Z_prunestatsr   r%   r*   r,   r0   r3   r6   r7   Z	ObjectRefr=   r2   r4   ZLLVMPassManagerRefr'   r   restypeZLLVMModuleRefr   argtypesr>   r   r   r   r   ZLLVMValueRefr   r   rB   rE   rG   rI   rK   rM   rO   rR   rV   rX   ZLLVMPY_AddInstructionCountPassrZ   r^   r\   r`   rb   rd   rf   rh   rm   ro   rq   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   rs   ru   ry   r{   r}   r   r   r   r   r   r   r   r   r   r   r   r   r(   r   r   r   r   <module>   s  $ 
    ?>T





















