o
    D2h                     @   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   q/var/www/html/alexa/alex_system/speach-to-text/venv/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   )r%   r   r   libLLVMPY_DumpRefPruneStatsr   r   r   r   r   r   )printoutstats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'   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'   LLVMPY_ReportAndResetTimingsstr)bufr   r   r   report_and_reset_timingsK   s   
$r4   c                   C   s   t  S N)ModulePassManagerr   r   r   r   create_module_pass_manager[   s   r7   c                 C   s   t | S r5   )FunctionPassManager)moduler   r   r   create_function_pass_manager_   s   r:   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#   PER_BBDIAMONDFANOUTFANOUT_RAISEALLr   r   r   r   r;   c   s    r;   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 r5   )_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_AddAAEvalPassrH   r   r   r   add_aa_eval_passr      zPassManager.add_aa_eval_passc                 C   rJ   )z
        See https://llvm.org/docs/Passes.html#basic-aa-basic-alias-analysis-stateless-aa-impl

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

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

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

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

        LLVM 14: `llvm::createCallGraphDOTPrinterPass`
        N)r   r'   !LLVMPY_AddCallGraphDOTPrinterPassrH   r   r   r   add_dot_call_graph_pass   rM   z#PassManager.add_dot_call_graph_passc                 C   rJ   )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_AddCFGPrinterPassrH   r   r   r   add_dot_cfg_printer_pass   rM   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   	show_bodyr   r   r   add_dot_dom_printer_pass      z$PassManager.add_dot_dom_printer_passc                 C   rZ   )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_AddDotPostDomPrinterPassr\   r   r   r   add_dot_postdom_printer_pass   r_   z(PassManager.add_dot_postdom_printer_passc                 C   rJ   )z
        See https://llvm.org/docs/Passes.html#globalsmodref-aa-simple-mod-ref-analysis-for-globals

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

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

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

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

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

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

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

        LLVM 14: `llvm::createAggressiveDCEPass`
        N)r   r'   LLVMPY_AddAggressiveDCEPassrH   r   r   r   )add_aggressive_dead_code_elimination_pass   rM   z5PassManager.add_aggressive_dead_code_elimination_passTc                 C   rZ   )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_lifetimer   r   r   add_always_inliner_pass   r_   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 > 14)RuntimeError)r   max_elementsr   r   r   add_arg_promotion_pass  s   z"PassManager.add_arg_promotion_passc                 C   rJ   )z
        See https://llvm.org/docs/Passes.html#break-crit-edges-break-critical-edges-in-cfg

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

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

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

        LLVM 14: `LLVMAddFunctionAttrsPass`
        N)r   r'   LLVMPY_AddFunctionAttrsPassrH   r   r   r   add_function_attrs_pass"  rM   z#PassManager.add_function_attrs_passc                 C   rZ   )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*  r_   z&PassManager.add_function_inlining_passc                 C   rJ   )z
        See http://llvm.org/docs/Passes.html#globaldce-dead-global-elimination

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

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

        LLVM 14: `LLVMAddIPSCCPPass`
        N)r   r'   LLVMPY_AddIPSCCPPassrH   r   r   r   add_ipsccp_passB  rM   zPassManager.add_ipsccp_passc                 C   rJ   )z
        See http://llvm.org/docs/Passes.html#dce-dead-code-elimination
        LLVM 14: `llvm::createDeadCodeEliminationPass`
        N)r   r'   !LLVMPY_AddDeadCodeEliminationPassrH   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_majorrv   r   r'   ,LLVMPY_AddAggressiveInstructionCombiningPass)r   r   r   r   r   )add_aggressive_instruction_combining_passQ  s   z5PassManager.add_aggressive_instruction_combining_passc                 C   rJ   )z
        See https://llvm.org/docs/Passes.html#internalize-internalize-global-symbols

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

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

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

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

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

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

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

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

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

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

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

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

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

        LLVM 14: `LLVMAddLoopUnrollAndJamPass`
        N)r   r'   LLVMPY_AddLoopUnrollAndJamPassrH   r   r   r   add_loop_unroll_and_jam_pass  rM   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   optimize_for_sizehas_branch_divergencer   r   r   add_loop_unswitch_pass  s   
	z"PassManager.add_loop_unswitch_passc                 C   rJ   )z
        See https://llvm.org/docs/Passes.html#loweratomic-lower-atomic-intrinsics-to-non-atomic-form

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

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

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

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

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

        LLVM 14: `llvm::createPartialInliningPass`
        N)r   r'   LLVMPY_AddPartialInliningPassrH   r   r   r   add_partial_inlining_pass  rM   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   rv   r   r'   $LLVMPY_AddPruneExceptionHandlingPassrH   r   r   r   !add_prune_exception_handling_pass  s   z-PassManager.add_prune_exception_handling_passc                 C   rJ   )z
        See https://llvm.org/docs/Passes.html#reassociate-reassociate-expressions

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

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

        LLVM 14: `llvm::createSinkingPass`
        N)r   r'   LLVMPY_AddSinkPassrH   r   r   r   add_sink_pass=  rM   zPassManager.add_sink_passc                 C   rZ   )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_debugr   r   r   add_strip_symbols_passE  r_   z"PassManager.add_strip_symbols_passc                 C   rJ   )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_AddStripDeadDebugInfoPassrH   r   r   r   add_strip_dead_debug_info_passM  rM   z*PassManager.add_strip_dead_debug_info_passc                 C   rJ   )z
        See https://llvm.org/docs/Passes.html#strip-dead-prototypes-strip-unused-function-prototypes

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

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

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

        LLVM 14: `llvm::createInstructionNamerPass`
        N)r   r'   LLVMPY_AddInstructionNamerPassrH   r   r   r   add_instruction_namer_pass  rM   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)r;   r   r'   LLVMPY_AddLegacyRefPrunePass)r   subpasses_flagssubgraph_limitiflagsr   r   r   add_refprune_pass  s   zPassManager.add_refprune_passNF)T)ru   )r   )FF)Lr!   r"   r#   r$   rI   rL   rO   rQ   rS   rU   rW   rY   r^   ra   rc   re   rg   ri   rk   rm   ro   rq   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   r   r   r   r   r   r;   rD   r   r   r   r   r   rE   k   s    




	




rE   c                   @   s2   e Zd Zd
ddZ		dddZ		ddd	ZdS )r6   Nc                 C   s"   |d u r	t j }t| | d S r5   )r   r'   LLVMPY_CreatePassManagerrE   __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   r9   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   r9   r   r   
remarkdesc
remarkfiler   fr   r   r   run_with_remarks  s   

z"ModulePassManager.run_with_remarksr5   Nr   r   r   r   )r!   r"   r#   r   r   r  r   r   r   r   r6     s    

r6   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 )r8   c                 C   s(   t j|}|| _d|_t| | d S )NT)r   r'    LLVMPY_CreateFunctionPassManager_module_ownedrE   r   )r   r9   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 (?).
        )r   r'   $LLVMPY_InitializeFunctionPassManagerrH   r   r   r   
initialize     zFunctionPassManager.initializec                 C   r
  )zi
        Finalize the FunctionPassManager.  Returns True if it produced
        any changes (?).
        )r   r'   "LLVMPY_FinalizeFunctionPassManagerrH   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   r8     s    
r8      r   )wctypesr   r   r   r   r   r   r   collectionsr	   enumr
   llvmlite.bindingr   llvmlite.binding.initfinir   r   tempfiler   llvmlite.binding.commonr   r   _prunestatsr   r%   r,   r/   r4   r7   r:   r;   	ObjectRefrE   r6   r8   LLVMPassManagerRefr'   r   restypeLLVMModuleRefr  argtypesrG   r   r   r  r  LLVMValueRefr  r  rK   rN   rP   rR   rT   rV   rX   r[   r`   rb   LLVMPY_AddInstructionCountPassrd   rh   rf   rj   rl   rn   rp   rr   ry   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   <module>   s  $ 
    ?>T









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

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