U
    9%el                     @   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!eegej"js_'eeegej"jt_'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   \/var/www/html/Darija-Ai-API/env/lib/python3.8/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   Z_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   s4   t  "} t j|  t| W  5 Q R  S Q R X 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    
r/   c                   C   s   t  S N)ModulePassManagerr   r   r   r   create_module_pass_managerX   s    r2   c                 C   s   t | S r0   )FunctionPassManager)moduler   r   r   create_function_pass_manager\   s    r5   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   r6   `   s
   r6   c                   @   sN  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 ZGeHjIdfddZJdS )PassManagerzPassManager
    c                 C   s   | j |  d S r0   )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_AddDotPostDomPrinterPassrO   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_AddJumpThreadingPassrq   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 r0   )r   r&   LLVMPY_AddTargetLibraryInfoPassr   )r   Ztripler   r   r   add_target_library_info~  s    z#PassManager.add_target_library_infoi  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)r6   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)re   )r   )FF)F)Kr!   r"   r#   r$   r?   rA   rC   rE   rG   rI   rK   rM   rP   rR   rT   rV   rX   rZ   r\   r^   r`   rb   rd   rg   ri   rk   rm   ro   rs   ru   rw   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   r6   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 )r1   Nc                 C   s"   |d krt j }t| | d S r0   )r   r&   LLVMPY_CreatePassManagerr<   __init__)r   ptrr   r   r   r     s    
zModulePassManager.__init__yaml c                 C   sR   |dk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   r4   remarks_fileremarks_formatremarks_filterrr   r   r   run  s      zModulePassManager.runc              
   C   s   t  \}}zlt|d W 5 Q R X | ||||}|dkrDtdt|"}t|| fW  5 Q R  W S Q R X W 5 t| X 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   r   r   N	r   osunlinkfdopenr   r   openboolread)r   r4   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   r1     s   
  
  r1   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 )r3   c                 C   s(   t j|}|| _d|_t| | d S )NT)r   r&    LLVMPY_CreateFunctionPassManager_moduleZ_ownedr<   r   )r   r4   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k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  \}}zlt|d W 5 Q R X | ||||}|dkrDtdt|"}t|| fW  5 Q R  W S Q R X W 5 t| X 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   r   r   Nr   )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   r3     s     
  r3   )F)uctypesr   r   r   r   r   r   r   r	   collectionsr
   enumr   Zllvmlite.bindingr   r   tempfiler   Zllvmlite.binding.commonr   Z_prunestatsr   r%   r)   r+   r/   r2   r5   r6   Z	ObjectRefr<   r1   r3   ZLLVMPassManagerRefr&   r   restypeZLLVMModuleRefr   Zargtypesr=   r   r   r   r   ZLLVMValueRefr   r   r@   rB   rD   rF   rH   rJ   rL   rN   rQ   rS   ZLLVMPY_AddInstructionCountPassrU   rY   rW   r[   r]   r_   ra   rc   rf   rh   rj   rl   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   rn   rp   rt   rv   rx   rz   r   r   r   r   r   r   r   r   r   r   r'   r   r   r   r   <module>   s  (
    1>T







    







 


