o
    yi                     @   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 Zdd Zd	d
 Zd)d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G dd deZG dd dZG dd dejeZG d d! d!ejeZG d"d# d#ejZG d$d% d%ejZG d&d' d'ejZeeegej j!_"egej j#_"eegej j$_"ej%ej j&_'ej%e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 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%gej j7_"ej%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%gej jB_"ej%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%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%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%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%eegej ji_"ejjej jk_'ejjejlej)gej jm_"ejjgej jn_"ejjgej jo_"ejjgej jp_"ejjgej jq_"ejjegej jr_"ejjgej js_"ejjgej jt_"ejjgej ju_"ejjgej jv_"ejjgej jw_"ejjgej jx_"ejjgej jy_"ejjgej jz_"ejjgej j{_"ejjgej j|_"ejjgej j}_"ejjgej j~_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjgej j_"ejjeegej j_"ejej j_'eej j_'ejgej j_"ejegej j_"eej j_'ejgej j_"ejegej j_"eej j_'ejgej j_"ejegej j_"eej j_'ejgej j_"ejegej j_"eej j_'ejegej j_"ejgej j_"ej)ej j_'ejejgej j_"ej)gej j_"ejej j_'ejgej j_"ej)ejgej j_"ejeegej j_"ej%ej j_'ej)eegej j_"ejjej j_'ej)eegej j_"d(S )+    )c_boolc_intc_size_tPOINTER	Structurebyrefc_char_p)
namedtuple)IntFlag)ffic                   C      t  S N)ModulePassManager r   r   c/home/ubuntu/maya3_transcribe/venv/lib/python3.10/site-packages/llvmlite/binding/newpassmanagers.pycreate_new_module_pass_manager      r   c                   C   r   r   )FunctionPassManagerr   r   r   r    create_new_function_pass_manager   r   r   c                 C   
   t | |S r   )PassBuilder)tmptor   r   r   create_pass_builder      
r      c                 C   r   r   )PipelineTuningOptions)speed_level
size_levelr   r   r   create_pipeline_tuning_options   r   r   
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msgr   r   r   __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)r0   r1   r2   r   _fields_r   r   r   r   r4   3   s    r4   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   )r4   r   r   libLLVMPY_DumpRefPruneStatsr   r    r&   r'   r(   r)   )printoutstats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   r6   LLVMPY_SetTimePassesr   )enabler   r   r   set_time_passesN   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   OutputStringr6   LLVMPY_ReportAndResetTimingsstr)bufr   r   r   report_and_reset_timingsZ   s   
$rC   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   r         N)r0   r1   r2   PER_BBDIAMONDFANOUTFANOUT_RAISEALLr   r   r   r   rD   j   s    rD   c                   @   sf  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdYd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d d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dDdE Z$dFdG Z%dHdI Z&dJdK Z'dLdM Z(dNdO Z)dPdQ Z*dRdS Z+dTdU Z,dVdW Z-dXS )ZNewPassManagerc                 C   s   t | tu r
tdd S )Nz*Cannot instantiate NewPassManager directly)r%   rM   r#   r+   r   r   r   __init__t   s   zNewPassManager.__init__c                 C   s2   t | trtj| || d S tj| || d S r   )r"   r   r   r6   LLVMPY_RunNewModulePassManager LLVMPY_RunNewFunctionPassManager)r+   IRpbr   r   r   runx   s   
zNewPassManager.runc                 C   *   t | trtj|  d S tj|  d S r   )r"   r   r   r6   LLVMPY_module_AddAAEvaluatorLLVMPY_function_AddAAEvaluatorrN   r   r   r   add_aa_eval_pass~      
zNewPassManager.add_aa_eval_passc                 C   rU   r   )r"   r   r   r6    LLVMPY_module_AddSimplifyCFGPass"LLVMPY_function_AddSimplifyCFGPassrN   r   r   r   add_simplify_cfg_pass   rY   z$NewPassManager.add_simplify_cfg_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddLoopUnrollPass!LLVMPY_function_AddLoopUnrollPassrN   r   r   r   add_loop_unroll_pass   rY   z#NewPassManager.add_loop_unroll_passc                 C   rU   r   )r"   r   r   r6    LLVMPY_module_AddInstCombinePass"LLVMPY_function_AddInstCombinePassrN   r   r   r   add_instruction_combine_pass   rY   z+NewPassManager.add_instruction_combine_passc                 C   s.   t | trtj| | d S tj| | d S r   )r"   r   r   r6   "LLVMPY_AddJumpThreadingPass_module$LLVMPY_AddJumpThreadingPass_function)r+   	thresholdr   r   r   add_jump_threading_pass   s   
z&NewPassManager.add_jump_threading_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddCFGPrinterPass!LLVMPY_function_AddCFGPrinterPassrN   r   r   r   add_cfg_printer_pass   rY   z#NewPassManager.add_cfg_printer_passc                 C   rU   r   )r"   r   r   r6   #LLVMPY_module_AddCFGOnlyPrinterPass%LLVMPY_function_AddCFGOnlyPrinterPassrN   r   r   r   add_cfg_only_printer_pass   rY   z(NewPassManager.add_cfg_only_printer_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddDomPrinterLLVMPY_function_AddDomPrinterrN   r   r   r   add_dom_printer_pass   rY   z#NewPassManager.add_dom_printer_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddDomOnlyPrinter!LLVMPY_function_AddDomOnlyPrinterrN   r   r   r   add_dom_only_printer_pass   rY   z(NewPassManager.add_dom_only_printer_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddPostDomPrinter!LLVMPY_function_AddPostDomPrinterrN   r   r   r   add_post_dom_printer_pass   rY   z(NewPassManager.add_post_dom_printer_passc                 C   rU   r   )r"   r   r   r6   #LLVMPY_module_AddPostDomOnlyPrinter%LLVMPY_function_AddPostDomOnlyPrinterrN   r   r   r   add_post_dom_only_printer_pass   rY   z-NewPassManager.add_post_dom_only_printer_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddDomViewerLLVMPY_function_AddDomViewerrN   r   r   r   add_dom_viewer_pass   rY   z"NewPassManager.add_dom_viewer_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddDomOnlyViewer LLVMPY_function_AddDomOnlyViewerrN   r   r   r   add_dom_only_viewer_pass   rY   z'NewPassManager.add_dom_only_viewer_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddPostDomViewer LLVMPY_function_AddPostDomViewerrN   r   r   r   add_post_dom_viewer_pass   rY   z'NewPassManager.add_post_dom_viewer_passc                 C   rU   r   )r"   r   r   r6   "LLVMPY_module_AddPostDomOnlyViewer$LLVMPY_function_AddPostDomOnlyViewerrN   r   r   r   add_post_dom_only_viewer_pass   rY   z,NewPassManager.add_post_dom_only_viewer_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddLintPassLLVMPY_function_AddLintPassrN   r   r   r   add_lint_pass   rY   zNewPassManager.add_lint_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddADCEPassLLVMPY_function_AddADCEPassrN   r   r   r   add_aggressive_dce_pass   rY   z&NewPassManager.add_aggressive_dce_passc                 C   rU   r   )r"   r   r   r6   'LLVMPY_module_AddBreakCriticalEdgesPass)LLVMPY_function_AddBreakCriticalEdgesPassrN   r   r   r   add_break_critical_edges_pass   rY   z,NewPassManager.add_break_critical_edges_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddDSEPassLLVMPY_function_AddDSEPassrN   r   r   r   add_dead_store_elimination_pass   rY   z.NewPassManager.add_dead_store_elimination_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddDCEPassLLVMPY_function_AddDCEPassrN   r   r   r   add_dead_code_elimination_pass   rY   z-NewPassManager.add_dead_code_elimination_passc                 C   rU   r   )r"   r   r   r6   *LLVMPY_module_AddAggressiveInstCombinePass,LLVMPY_function_AddAggressiveInstCombinePassrN   r   r   r   add_aggressive_instcombine_pass   rY   z.NewPassManager.add_aggressive_instcombine_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddLCSSAPassLLVMPY_function_AddLCSSAPassrN   r   r   r   add_lcssa_pass   rY   zNewPassManager.add_lcssa_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddNewGVNPassLLVMPY_function_AddNewGVNPassrN   r   r   r   add_new_gvn_pass  rY   zNewPassManager.add_new_gvn_passc                 C   rU   r   )r"   r   r   r6   !LLVMPY_module_AddLoopSimplifyPass#LLVMPY_function_AddLoopSimplifyPassrN   r   r   r   add_loop_simplify_pass  rY   z%NewPassManager.add_loop_simplify_passc                 C   rU   r   )r"   r   r   r6   %LLVMPY_module_AddLoopUnrollAndJamPass'LLVMPY_function_AddLoopUnrollAndJamPassrN   r   r   r   add_loop_unroll_and_jam_pass  rY   z+NewPassManager.add_loop_unroll_and_jam_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddSCCPPassLLVMPY_function_AddSCCPPassrN   r   r   r   add_sccp_pass  rY   zNewPassManager.add_sccp_passc                 C   rU   r   )r"   r   r   r6    LLVMPY_module_AddLowerAtomicPass"LLVMPY_function_AddLowerAtomicPassrN   r   r   r   add_lower_atomic_pass  rY   z$NewPassManager.add_lower_atomic_passc                 C   rU   r   )r"   r   r   r6    LLVMPY_module_AddLowerInvokePass"LLVMPY_function_AddLowerInvokePassrN   r   r   r   add_lower_invoke_pass   rY   z$NewPassManager.add_lower_invoke_passc                 C   rU   r   )r"   r   r   r6    LLVMPY_module_AddLowerSwitchPass"LLVMPY_function_AddLowerSwitchPassrN   r   r   r   add_lower_switch_pass&  rY   z$NewPassManager.add_lower_switch_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddMemCpyOptPass LLVMPY_function_AddMemCpyOptPassrN   r   r   r   add_mem_copy_opt_pass,  rY   z$NewPassManager.add_mem_copy_opt_passc                 C   rU   r   )r"   r   r   r6   +LLVMPY_module_AddUnifyFunctionExitNodesPass-LLVMPY_function_AddUnifyFunctionExitNodesPassrN   r   r   r   "add_unify_function_exit_nodes_pass2  rY   z1NewPassManager.add_unify_function_exit_nodes_passc                 C   rU   r   )r"   r   r   r6    LLVMPY_module_AddReassociatePass"LLVMPY_function_AddReassociatePassrN   r   r   r   add_reassociate_pass8  rY   z#NewPassManager.add_reassociate_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddRegToMemPassLLVMPY_function_AddRegToMemPassrN   r   r   r   add_register_to_memory_pass>  rY   z*NewPassManager.add_register_to_memory_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddSROAPassLLVMPY_function_AddSROAPassrN   r   r   r   add_sroa_passD  rY   zNewPassManager.add_sroa_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddSinkingPassLLVMPY_function_AddSinkingPassrN   r   r   r   add_sinking_passJ  rY   zNewPassManager.add_sinking_passc                 C   rU   r   )r"   r   r   r6   !LLVMPY_module_AddTailCallElimPass#LLVMPY_function_AddTailCallElimPassrN   r   r   r   add_tail_call_elimination_passP  rY   z-NewPassManager.add_tail_call_elimination_passc                 C   rU   r   )r"   r   r   r6   %LLVMPY_module_AddInstructionNamerPass'LLVMPY_function_AddInstructionNamerPassrN   r   r   r   add_instruction_namer_passV  rY   z)NewPassManager.add_instruction_namer_passc                 C   rU   r   )r"   r   r   r6   !LLVMPY_module_AddLoopDeletionPass#LLVMPY_function_AddLoopDeletionPassrN   r   r   r   add_loop_deletion_pass\  rY   z%NewPassManager.add_loop_deletion_passc                 C   rU   r   )r"   r   r   r6   'LLVMPY_module_AddLoopStrengthReducePass)LLVMPY_function_AddLoopStrengthReducePassrN   r   r   r   add_loop_strength_reduce_passb  rY   z,NewPassManager.add_loop_strength_reduce_passc                 C   rU   r   )r"   r   r   r6   LLVMPY_module_AddLoopRotatePass!LLVMPY_function_AddLoopRotatePassrN   r   r   r   add_loop_rotate_passh  rY   z#NewPassManager.add_loop_rotate_passc                 C   rU   r   )r"   r   r   r6   !LLVMPY_DisposeNewModulePassManger#LLVMPY_DisposeNewFunctionPassMangerrN   r   r   r   _disposen  rY   zNewPassManager._disposeN)rc   ).r0   r1   r2   rO   rT   rX   r\   r_   rb   rg   rj   rm   rp   rs   rv   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   rM   r   sX    
rM   c                       s   e Zd Zd1 fd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d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d&d' Zd(d) Zd*d+ Zd,d- Zejd.fd/d0Z  ZS )2r   Nc                    "   |d u r	t j }t | d S r   )r   r6   !LLVMPY_CreateNewModulePassManagersuperrO   r+   ptr	__class__r   r   rO   w     
zModulePassManager.__init__c                 C      t j|  d S r   )r   r6   LLVMPY_module_AddVerifierPassrN   r   r   r   add_verifier|     zModulePassManager.add_verifierc                 C   r   r   )r   r6   "LLVMPY_module_AddConstantMergePassrN   r   r   r   add_constant_merge_pass  r   z)ModulePassManager.add_constant_merge_passc                 C   r   r   )r   r6   ,LLVMPY_module_AddDeadArgumentEliminationPassrN   r   r   r   add_dead_arg_elimination_pass  r   z/ModulePassManager.add_dead_arg_elimination_passc                 C   r   r   )r   r6   (LLVMPY_module_AddCallGraphDOTPrinterPassrN   r   r   r   add_dot_call_graph_printer_pass  r   z1ModulePassManager.add_dot_call_graph_printer_passc                 C   r   r   )r   r6   +LLVMPY_module_AddModuleDebugInfoPrinterPassrN   r   r   r   add_module_debug_info_pass  r   z,ModulePassManager.add_module_debug_info_passc                 C   r   r   )r   r6   "LLVMPY_module_AddAlwaysInlinerPassrN   r   r   r   add_always_inliner_pass  r   z)ModulePassManager.add_always_inliner_passc                 C   r   r   )r   r6   2LLVMPY_module_AddReversePostOrderFunctionAttrsPassrN   r   r   r   add_rpo_function_attrs_pass  r   z-ModulePassManager.add_rpo_function_attrs_passc                 C   r   r   )r   r6   LLVMPY_module_AddGlobalDCEPassrN   r   r   r   #add_global_dead_code_eliminate_pass  r   z5ModulePassManager.add_global_dead_code_eliminate_passc                 C   r   r   )r   r6   LLVMPY_module_AddGlobalOptPassrN   r   r   r   add_global_opt_pass  r   z%ModulePassManager.add_global_opt_passc                 C   r   r   )r   r6   LLVMPY_module_AddIPSCCPPassrN   r   r   r   add_ipsccp_pass  r   z!ModulePassManager.add_ipsccp_passc                 C   r   r   )r   r6    LLVMPY_module_AddInternalizePassrN   r   r   r   add_internalize_pass  r   z&ModulePassManager.add_internalize_passc                 C   r   r   )r   r6   "LLVMPY_module_AddLoopExtractorPassrN   r   r   r   add_loop_extract_pass  r   z'ModulePassManager.add_loop_extract_passc                 C   r   r   )r   r6   #LLVMPY_module_AddMergeFunctionsPassrN   r   r   r   add_merge_functions_pass  r   z*ModulePassManager.add_merge_functions_passc                 C   r   r   )r   r6   #LLVMPY_module_AddPartialInlinerPassrN   r   r   r   add_partial_inliner_pass  r   z*ModulePassManager.add_partial_inliner_passc                 C   r   r   )r   r6   !LLVMPY_module_AddStripSymbolsPassrN   r   r   r   add_strip_symbols_pass  r   z(ModulePassManager.add_strip_symbols_passc                 C   r   r   )r   r6   'LLVMPY_module_AddStripDeadDebugInfoPassrN   r   r   r   add_strip_dead_debug_info_pass  r   z0ModulePassManager.add_strip_dead_debug_info_passc                 C   r   r   )r   r6   (LLVMPY_module_AddStripDeadPrototypesPassrN   r   r   r   add_strip_dead_prototype_pass  r   z/ModulePassManager.add_strip_dead_prototype_passc                 C   r   r   )r   r6   &LLVMPY_module_AddStripDebugDeclarePassrN   r   r   r   add_strip_debug_declare_pass  r   z.ModulePassManager.add_strip_debug_declare_passc                 C   r   r   )r   r6   )LLVMPY_module_AddStripNonDebugSymbolsPassrN   r   r   r    add_strip_non_debug_symbols_pass  r   z2ModulePassManager.add_strip_non_debug_symbols_passc                 C   r   r   )r   r6   &LLVMPY_module_AddArgumentPromotionPassrN   r   r   r   add_argument_promotion_pass  r   z-ModulePassManager.add_argument_promotion_passc                 C   r   r   )r   r6   +LLVMPY_module_AddPostOrderFunctionAttrsPassrN   r   r   r   'add_post_order_function_attributes_pass  r   z9ModulePassManager.add_post_order_function_attributes_pass  c                 C      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)rD   r   r6   LLVMPY_AddRefPrunePass_moduler+   subpasses_flagssubgraph_limitiflagsr   r   r   add_refprune_pass     z#ModulePassManager.add_refprune_passr   )r0   r1   r2   rO   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  rD   rL   r  __classcell__r   r   r   r   r   u  s4    r   c                       s.   e Zd Zd fdd	ZejdfddZ  ZS )r   Nc                    r   r   )r   r6   #LLVMPY_CreateNewFunctionPassManagerr   rO   r   r   r   r   rO     r   zFunctionPassManager.__init__r  c                 C   r	  r
  )rD   r   r6   LLVMPY_AddRefPrunePass_functionr  r   r   r   r    r  z%FunctionPassManager.add_refprune_passr   )r0   r1   r2   rO   rD   rL   r  r  r   r   r   r   r     s
    r   c                       s   e Zd Zd fdd	Zedd Zejdd Zedd	 Zejd
d	 Zedd Zejdd Zedd Z	e	jdd Z	edd Z
e
jdd Z
edd Zejdd Zedd Zejdd Zdd Z  ZS )r   r   r   c                    s.   d | _ d | _|| _|| _t tj  d S r   )	_speed_level_size_levelr   r   r   rO   r   r6   "LLVMPY_CreatePipelineTuningOptions)r+   r   r   r   r   r   rO     s
   zPipelineTuningOptions.__init__c                 C      | j S r   )r  rN   r   r   r   r        z!PipelineTuningOptions.speed_levelc                 C   s.   d|  krdkst d t d|| _d S )Nr      z4Optimization level for speed should be 0, 1, 2, or 3)
ValueErrorr  r+   valuer   r   r   r     s   
c                 C   r  r   )r  rN   r   r   r   r     r  z PipelineTuningOptions.size_levelc                 C   sH   d|  krdkst d t d|dkr| jdkrt d|| _d S )Nr   r   z0Optimization level for size should be 0, 1, or 2z=Optimization for size should be encoded with speed level == 2)r  r   r  r  r   r   r   r     s   
c                 C      t j| S r   )r   r6   LLVMPY_PTOGetLoopInterleavingrN   r   r   r   loop_interleaving     z'PipelineTuningOptions.loop_interleavingc                 C      t j| | d S r   )r   r6   LLVMPY_PTOSetLoopInterleavingr  r   r   r   r        c                 C   r  r   )r   r6   LLVMPY_PTOGetLoopVectorizationrN   r   r   r   loop_vectorization  r!  z(PipelineTuningOptions.loop_vectorizationc                 C   r"  r   )r   r6   LLVMPY_PTOSetLoopVectorizationr  r   r   r   r&    r$  c                 C   r  r   )r   r6   LLVMPY_PTOGetSLPVectorizationrN   r   r   r   slp_vectorization  r!  z'PipelineTuningOptions.slp_vectorizationc                 C   r"  r   )r   r6   LLVMPY_PTOSetSLPVectorizationr  r   r   r   r)    r$  c                 C   r  r   )r   r6   LLVMPY_PTOGetLoopUnrollingrN   r   r   r   loop_unrolling#  r!  z$PipelineTuningOptions.loop_unrollingc                 C   r"  r   )r   r6   LLVMPY_PTOSetLoopUnrollingr  r   r   r   r,  '  r$  c                 C   r  r   )r   r6   LLVMPY_PTOGetInlinerThresholdrN   r   r   r   inlining_threshold+  r!  z(PipelineTuningOptions.inlining_thresholdc                 C   r"  r   )r   r6   LLVMPY_PTOSetInlinerThresholdr  r   r   r   r/  /  r$  c                 C   r   r   )r   r6   #LLVMPY_DisposePipelineTuningOptionsrN   r   r   r   r   3  r   zPipelineTuningOptions._disposer   r   )r0   r1   r2   rO   propertyr   setterr   r   r&  r)  r,  r/  r   r  r   r   r   r   r     s>    













r   c                       s$   e Zd Z fddZdd Z  ZS )TimePassesHandlerc                    s   t  tj  d S r   )r   rO   r   r6   LLVMPY_CreateTimePassesHandlerrN   r   r   r   rO   8  s   zTimePassesHandler.__init__c                 C   r   r   )r   r6   LLVMPY_DisposeTimePassesHandlerrN   r   r   r   r   ;  r   zTimePassesHandler._dispose)r0   r1   r2   rO   r   r  r   r   r   r   r5  7  s    r5  c                       sD   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Z  Z	S )r   c                    s,   t  tj|| || _|| _d | _d S r   )r   rO   r   r6   LLVMPY_CreatePassBuilder_pto_tm_time_passes_handler)r+   r   r   r   r   r   rO   A  s   
zPassBuilder.__init__c                 C      t tj| | jj| jjS r   )r   r   r6   $LLVMPY_buildPerModuleDefaultPipeliner9  r   r   rN   r   r   r   getModulePassManagerG  
   z PassBuilder.getModulePassManagerc                 C   r<  r   )r   r   r6   *LLVMPY_buildFunctionSimplificationPipeliner9  r   r   rN   r   r   r   getFunctionPassManagerM  r?  z"PassBuilder.getFunctionPassManagerc                 C   s*   | j rtdt | _ tj| | j  dS )zEnable the pass timers.

        Raises
        ------
        RuntimeError
            If pass timing is already enabled.
        z!Pass timing can only be done onceN)r;  RuntimeErrorr5  r   r6   LLVMPY_EnableTimePassesrN   r   r   r   start_pass_timingS  s   zPassBuilder.start_pass_timingc                 C   sR   | j stdt }tj| j | t|W  d   S 1 s"w   Y  dS )a:  Returns the pass timings report and disables the LLVM internal
        timers. Pass timers are enabled by ``start_pass_timing()``. If the
        timers are not enabled, this function will return an empty string.

        Returns
        -------
        res : str
            LLVM generated timing report.
        zPass timing is not enabledN)r;  rB  r   r?   r6   !LLVMPY_ReportAndDisableTimePassesrA   )r+   rB   r   r   r   finish_pass_timing`  s   
$zPassBuilder.finish_pass_timingc                 C   r   r   )r   r6   LLVMPY_DisposePassBuilderrN   r   r   r   r   s  r   zPassBuilder._dispose)
r0   r1   r2   rO   r>  rA  rD  rF  r   r  r   r   r   r   r   ?  s    r   Nr2  )F)ctypesr   r   r   r   r   r   r   collectionsr	   enumr
   llvmlite.bindingr   r   r   r   r   _prunestatsr    r4   r;   r>   rC   rD   rM   	ObjectRefr   r   r   r5  r   r6   r7   argtypesr<   r@   LLVMModulePassManagerRefr   restypeLLVMModuleRefLLVMPassBuilderRefrP   r   rV   rZ   r]   r   r`   rd   rh   rk   rn   rq   rt   rw   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  LLVMFunctionPassManagerRefr  LLVMValueRefrQ   rW   r[   r^   ra   re   ri   rl   ro   rr   ru   rx   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  LLVMPipelineTuningOptionsRefr  r  r#  r%  r'  r(  r*  r+  r-  r.  r0  r1  r8  LLVMTargetMachineRefrG  LLVMTimePassesHandlerRefr6  r7  rC  rE  r=  r@  r   r   r   r   <module>   sN  $ 

  [M;



























































































































