B
    Ꮚ\                 @   s  d dl mZmZ d dlmZmZ ddlmZ dd Zdd 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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gejj_ejgejj_ejgejj_ejegejj_ejgejj_ejgejj _ejgej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j(_ejgejj)_ejgejj*_dS )    )print_functionabsolute_import)c_boolc_int   )ffic               C   s   t  S )N)ModulePassManager r	   r	   <lib/python3.7/site-packages/llvmlite/binding/passmanagers.pycreate_module_pass_manager   s    r   c             C   s   t | S )N)FunctionPassManager)moduler	   r	   r
   create_function_pass_manager
   s    r   c               @   s   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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$S )%PassManagerzPassManager
    c             C   s   | j |  d S )N)Z_capiLLVMPY_DisposePassManager)selfr	   r	   r
   _dispose   s    zPassManager._disposec             C   s   t j|  dS )zQSee http://llvm.org/docs/Passes.html#constmerge-merge-duplicate-global-constants.N)r   libLLVMPY_AddConstantMergePass)r   r	   r	   r
   add_constant_merge_pass   s    z#PassManager.add_constant_merge_passc             C   s   t j|  dS )zKSee http://llvm.org/docs/Passes.html#deadargelim-dead-argument-elimination.N)r   r    LLVMPY_AddDeadArgEliminationPass)r   r	   r	   r
   add_dead_arg_elimination_pass   s    z)PassManager.add_dead_arg_elimination_passc             C   s   t j|  dS )zNSee http://llvm.org/docs/Passes.html#functionattrs-deduce-function-attributes.N)r   r   LLVMPY_AddFunctionAttrsPass)r   r	   r	   r
   add_function_attrs_pass   s    z#PassManager.add_function_attrs_passc             C   s   t j| | dS )zJSee http://llvm.org/docs/Passes.html#inline-function-integration-inlining.N)r   r   LLVMPY_AddFunctionInliningPass)r   Z	thresholdr	   r	   r
   add_function_inlining_pass!   s    z&PassManager.add_function_inlining_passc             C   s   t j|  dS )zGSee http://llvm.org/docs/Passes.html#globaldce-dead-global-elimination.N)r   r   LLVMPY_AddGlobalDCEPass)r   r	   r	   r
   add_global_dce_pass%   s    zPassManager.add_global_dce_passc             C   s   t j|  dS )zISee http://llvm.org/docs/Passes.html#globalopt-global-variable-optimizer.N)r   r   LLVMPY_AddGlobalOptimizerPass)r   r	   r	   r
   add_global_optimizer_pass)   s    z%PassManager.add_global_optimizer_passc             C   s   t j|  dS )zdSee http://llvm.org/docs/Passes.html#ipsccp-interprocedural-sparse-conditional-constant-propagation.N)r   r   LLVMPY_AddIPSCCPPass)r   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.N)r   r   !LLVMPY_AddDeadCodeEliminationPass)r   r	   r	   r
   add_dead_code_elimination_pass1   s    z*PassManager.add_dead_code_elimination_passc             C   s   t j|  dS )zBSee http://llvm.org/docs/Passes.html#simplifycfg-simplify-the-cfg.N)r   r   LLVMPY_AddCFGSimplificationPass)r   r	   r	   r
   add_cfg_simplification_pass5   s    z'PassManager.add_cfg_simplification_passc             C   s   t j|  dS )z@See http://llvm.org/docs/Passes.html#gvn-global-value-numbering.N)r   r   LLVMPY_AddGVNPass)r   r	   r	   r
   add_gvn_pass9   s    zPassManager.add_gvn_passc             C   s   t j|  dS )z8See http://llvm.org/docs/Passes.html#passes-instcombine.N)r   r   "LLVMPY_AddInstructionCombiningPass)r   r	   r	   r
   add_instruction_combining_pass=   s    z*PassManager.add_instruction_combining_passc             C   s   t j|  dS )zESee http://llvm.org/docs/Passes.html#licm-loop-invariant-code-motion.N)r   r   LLVMPY_AddLICMPass)r   r	   r	   r
   add_licm_passA   s    zPassManager.add_licm_passc             C   s   t j|  dS )zRSee http://llvm.org/docs/Passes.html#sccp-sparse-conditional-constant-propagation.N)r   r   LLVMPY_AddSCCPPass)r   r	   r	   r
   add_sccp_passE   s    zPassManager.add_sccp_passc             C   s   t j|  dS )zSee 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.N)r   r   LLVMPY_AddSROAPass)r   r	   r	   r
   add_sroa_passI   s    zPassManager.add_sroa_passc             C   s   t j|  d S )N)r   r   $LLVMPY_AddTypeBasedAliasAnalysisPass)r   r	   r	   r
   "add_type_based_alias_analysis_passO   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.N)r   r    LLVMPY_AddBasicAliasAnalysisPass)r   r	   r	   r
   add_basic_alias_analysis_passR   s    z)PassManager.add_basic_alias_analysis_passN)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r!   r#   r%   r'   r)   r+   r-   r/   r1   r3   r	   r	   r	   r
   r      s$   r   c               @   s   e Zd ZdddZdd ZdS )r   Nc             C   s"   |d krt j }t| | d S )N)r   r   LLVMPY_CreatePassManagerr   __init__)r   ptrr	   r	   r
   r9   Y   s    
zModulePassManager.__init__c             C   s   t j| |S )z>
        Run optimization passes on the given module.
        )r   r   LLVMPY_RunPassManager)r   r   r	   r	   r
   run^   s    zModulePassManager.run)N)r4   r5   r6   r9   r<   r	   r	   r	   r
   r   W   s   
r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r   c             C   s(   t j|}|| _d|_t| | d S )NT)r   r    LLVMPY_CreateFunctionPassManager_moduleZ_ownedr   r9   )r   r   r:   r	   r	   r
   r9   g   s    zFunctionPassManager.__init__c             C   s   t j| S )zk
        Initialize the FunctionPassManager.  Returns True if it produced
        any changes (?).
        )r   r   $LLVMPY_InitializeFunctionPassManager)r   r	   r	   r
   
initializem   s    zFunctionPassManager.initializec             C   s   t j| S )zi
        Finalize the FunctionPassManager.  Returns True if it produced
        any changes (?).
        )r   r   "LLVMPY_FinalizeFunctionPassManager)r   r	   r	   r
   finalizet   s    zFunctionPassManager.finalizec             C   s   t j| |S )z@
        Run optimization passes on the given function.
        )r   r   LLVMPY_RunFunctionPassManager)r   Zfunctionr	   r	   r
   r<   {   s    zFunctionPassManager.runN)r4   r5   r6   r9   r@   rB   r<   r	   r	   r	   r
   r   e   s   r   N)+Z
__future__r   r   Zctypesr   r    r   r   r   Z	ObjectRefr   r   r   ZLLVMPassManagerRefr   r8   ZrestypeZLLVMModuleRefr=   Zargtypesr   r;   r?   rA   ZLLVMValueRefrC   r   r   r   r   r   r   r    r"   r$   r&   r(   r*   r,   r.   r0   r2   r	   r	   r	   r
   <module>   sJ   I 



