a
    Dfч                     @   s  d dl mZ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Zd dlmZ d dlm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"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"j0_'ej!g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!egej"j7_'ej!egej"j8_'ej!gej"j9_'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"j@_'ej!gej"jA_'ej!egej"jB_'ej!egej"jC_'ej!gej"jD_'ej!gej"jE_'ej!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!eegej"jQ_'ej!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j!gej"jZ_'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"j`_'ej!gej"ja_'ej!gej"jb_'ej!egej"jc_'ej!gej"jd_'ej!egej"je_'ej!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!egej"jr_'ej!gej"js_'ej!eegej"jt_'eeegej"ju_'dS )!    )c_boolc_char_pc_intc_size_tc_uint	StructurebyrefPOINTER)
namedtuple)IntFlag)ffiN)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   j/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/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   )ZprintoutstatsZdo_printr   r   r   dump_refprune_stats.   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 s20    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_timingsH   s    
r0   c                   C   s   t  S N)ModulePassManagerr   r   r   r   create_module_pass_managerX   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   `   s
   r7   c                   @   sV  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_ Z0dd`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   _disposel   s    zPassManager._disposec                 C   s   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_passo   s    zPassManager.add_aa_eval_passc                 C   s   t j|  dS )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_passw   s    zPassManager.add_basic_aa_passc                 C   s   t j|  dS )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   s    z#PassManager.add_constant_merge_passc                 C   s   t j|  dS )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   s    z)PassManager.add_dead_arg_elimination_passc                 C   s   t j|  dS )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   s    z(PassManager.add_dependence_analysis_passc                 C   s   t j|  dS )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   s    z#PassManager.add_dot_call_graph_passc                 C   s   t j|  dS )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   s    z$PassManager.add_dot_cfg_printer_passFc                 C   s   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   s    z$PassManager.add_dot_dom_printer_passc                 C   s   t j| | dS )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_AddDotPostDomPrinterPassrP   r   r   r   add_dot_postdom_printer_pass   s    z(PassManager.add_dot_postdom_printer_passc                 C   s   t j|  dS )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   s    z'PassManager.add_globals_mod_ref_aa_passc                 C   s   t j|  dS )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   s    zPassManager.add_iv_users_passc                 C   s   t j|  dS )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   s    zPassManager.add_lint_passc                 C   s   t j|  dS )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   s    z$PassManager.add_lazy_value_info_passc                 C   s   t j|  dS )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   s    z&PassManager.add_module_debug_info_passc                 C   s   t j|  dS )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   s    z PassManager.add_region_info_passc                 C   s   t j|  dS )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   s    z(PassManager.add_scalar_evolution_aa_passc                 C   s   t j|  dS )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   s    z5PassManager.add_aggressive_dead_code_elimination_passTc                 C   s   t j| | dS )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   s    z#PassManager.add_always_inliner_pass   c                 C   s   t j| | dS )z
        See https://llvm.org/docs/Passes.html#argpromotion-promote-by-reference-arguments-to-scalars

        LLVM 14: `llvm::createArgumentPromotionPass`
        N)r   r'   LLVMPY_AddArgPromotionPass)r   Zmax_elementsr   r   r   add_arg_promotion_pass   s    z"PassManager.add_arg_promotion_passc                 C   s   t j|  dS )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  s    z)PassManager.add_break_critical_edges_passc                 C   s   t j|  dS )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  s    z+PassManager.add_dead_store_elimination_passc                 C   s   t j|  dS )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  s    z6PassManager.add_reverse_post_order_function_attrs_passc                 C   s   t j|  dS )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  s    z#PassManager.add_function_attrs_passc                 C   s   t j| | dS )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'  s    z&PassManager.add_function_inlining_passc                 C   s   t j|  dS )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_pass/  s    zPassManager.add_global_dce_passc                 C   s   t j|  dS )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_pass7  s    z%PassManager.add_global_optimizer_passc                 C   s   t j|  dS )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_pass?  s    zPassManager.add_ipsccp_passc                 C   s   t j|  dS )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_passG  s    z*PassManager.add_dead_code_elimination_passc                 C   s   t j|  dS )z
        See https://llvm.org/docs/Passes.html#aggressive-instcombine-combine-expression-patterns

        LLVM 14: `llvm::createAggressiveInstCombinerPass`
        N)r   r'   ,LLVMPY_AddAggressiveInstructionCombiningPassr?   r   r   r   )add_aggressive_instruction_combining_passN  s    z5PassManager.add_aggressive_instruction_combining_passc                 C   s   t j|  dS )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_passV  s    z PassManager.add_internalize_passc                 C   s   t j|  dS )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_pass^  s    z'PassManager.add_cfg_simplification_passc                 C   s   t j| | dS )z
        See https://llvm.org/docs/Passes.html#jump-threading-jump-threading

        LLVM 14: `llvm::createJumpThreadingPass`
        N)r   r'   LLVMPY_AddJumpThreadingPassrr   r   r   r   add_jump_threading_passf  s    z#PassManager.add_jump_threading_passc                 C   s   t j|  dS )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_passn  s    zPassManager.add_lcssa_passc                 C   s   t j|  dS )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_passv  s    zPassManager.add_gvn_passc                 C   s   t j|  dS )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~  s    z*PassManager.add_instruction_combining_passc                 C   s   t j|  dS )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  s    zPassManager.add_licm_passc                 C   s   t j|  dS )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  s    z"PassManager.add_loop_deletion_passc                 C   s   t j|  dS )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  s    z#PassManager.add_loop_extractor_passc                 C   s   t j|  dS )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  s    z*PassManager.add_single_loop_extractor_passc                 C   s   t j|  dS )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  s    zPassManager.add_sccp_passc                 C   s   t j|  dS )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  s    z)PassManager.add_loop_strength_reduce_passc                 C   s   t j|  dS )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  s    z(PassManager.add_loop_simplification_passc                 C   s   t j|  dS )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  s    z PassManager.add_loop_unroll_passc                 C   s   t j|  dS )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  s    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`
        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   s   t j|  dS )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  s    z!PassManager.add_lower_atomic_passc                 C   s   t j|  dS )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  s    z!PassManager.add_lower_invoke_passc                 C   s   t j|  dS )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  s    z!PassManager.add_lower_switch_passc                 C   s   t j|  dS )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  s    z(PassManager.add_memcpy_optimization_passc                 C   s   t j|  dS )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  s    z$PassManager.add_merge_functions_passc                 C   s   t j|  dS )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  s    z"PassManager.add_merge_returns_passc                 C   s   t j|  dS )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
  s    z%PassManager.add_partial_inlining_passc                 C   s   t j|  dS )z
        See https://llvm.org/docs/Passes.html#prune-eh-remove-unused-exception-handling-info

        LLVM 14: `llvm::createPruneEHPass`
        N)r   r'   $LLVMPY_AddPruneExceptionHandlingPassr?   r   r   r   !add_prune_exception_handling_pass  s    z-PassManager.add_prune_exception_handling_passc                 C   s   t j|  dS )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  s    z,PassManager.add_reassociate_expressions_passc                 C   s   t j|  dS )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"  s    z.PassManager.add_demote_register_to_memory_passc                 C   s   t j|  dS )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_pass*  s    zPassManager.add_sroa_passc                 C   s   t j|  dS )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_pass4  s    zPassManager.add_sink_passc                 C   s   t j| | dS )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_pass<  s    z"PassManager.add_strip_symbols_passc                 C   s   t j|  dS )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_passD  s    z*PassManager.add_strip_dead_debug_info_passc                 C   s   t j|  dS )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_passL  s    z*PassManager.add_strip_dead_prototypes_passc                 C   s   t j|  dS )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_passT  s    z(PassManager.add_strip_debug_declare_passc                 C   s   t j|  dS )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_pass\  s    z+PassManager.add_strip_nondebug_symbols_passc                 C   s   t j|  dS )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_passd  s    z*PassManager.add_tail_call_elimination_passc                 C   s   t j|  dS )z>
        LLVM 14: `LLVMAddTypeBasedAliasAnalysisPass`
        N)r   r'   $LLVMPY_AddTypeBasedAliasAnalysisPassr?   r   r   r   "add_type_based_alias_analysis_passl  s    z.PassManager.add_type_based_alias_analysis_passc                 C   s   t j|  dS )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_passr  s    z)PassManager.add_basic_alias_analysis_passc                 C   s   t j|  dS )z:http://llvm.org/docs/Passes.html#loop-rotate-rotate-loops.N)r   r'   ZLLVMPY_LLVMAddLoopRotatePassr?   r   r   r   add_loop_rotate_passz  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   s   t j|  dS )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  s    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_AddRefPrunePass)r   Zsubpasses_flagsZsubgraph_limitZiflagsr   r   r   add_refprune_pass  s    zPassManager.add_refprune_passN)F)F)T)rf   )r   )FF)F)Lr!   r"   r#   r$   r@   rB   rD   rF   rH   rJ   rL   rN   rQ   rS   rU   rW   rY   r[   r]   r_   ra   rc   re   rh   rj   rl   rn   rp   rt   rv   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   r7   r<   r   r   r   r   r   r=   h   s   




	  



r=   c                   @   s*   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   sR   |du rt j| |S t j| |t|t|t|}|dkrFtd|dkS d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  s    
zModulePassManager.runc              	   C   s   t  \}}zt|d W d   n1 s.0    Y  | ||||}|dkrXtdt|,}t|| fW  d   W t| S 1 s0    Y  W t| nt| 0 dS )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_remarks)N)Nr   r   )r   r   )r!   r"   r#   r   r   r   r   r   r   r   r2     s   
  
  r2   c                   @   s8   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   s   t j| S )zk
        Initialize the FunctionPassManager.  Returns True if it produced
        any changes (?).
        )r   r'   $LLVMPY_InitializeFunctionPassManagerr?   r   r   r   
initialize  s    zFunctionPassManager.initializec                 C   s   t j| S )zi
        Finalize the FunctionPassManager.  Returns True if it produced
        any changes (?).
        )r   r'   "LLVMPY_FinalizeFunctionPassManagerr?   r   r   r   finalize  s    zFunctionPassManager.finalizeNr   r   c                 C   sR   |du rt j| |S t j| |t|t|t|}|dkrFtdt|S d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     s    
zFunctionPassManager.runc              	   C   s   t  \}}zt|d W d   n1 s.0    Y  | ||||}|dkrXtdt|,}t|| fW  d   W t| S 1 s0    Y  W t| nt| 0 dS )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_remarks)Nr   r   )r   r   )r!   r"   r#   r   r   r   r   r   r   r   r   r   r4     s     
  r4   )F)vctypesr   r   r   r   r   r   r   r	   collectionsr
   enumr   Zllvmlite.bindingr   r   tempfiler   Zllvmlite.binding.commonr   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   rA   rC   rE   rG   rI   rK   rM   rO   rR   rT   ZLLVMPY_AddInstructionCountPassrV   rZ   rX   r\   r^   r`   rb   rd   rg   ri   rk   rm   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   ro   rq   ru   rw   ry   r{   r   r   r   r   r   r   r   r   r   r   r   r(   r   r   r   r   <module>   s  (
    9>T


















