|
from ctypes import c_uint, c_bool |
|
from llvmlite.binding import ffi |
|
from llvmlite.binding import passmanagers |
|
|
|
|
|
def create_pass_manager_builder(): |
|
return PassManagerBuilder() |
|
|
|
|
|
class PassManagerBuilder(ffi.ObjectRef): |
|
__slots__ = () |
|
|
|
def __init__(self, ptr=None): |
|
if ptr is None: |
|
ptr = ffi.lib.LLVMPY_PassManagerBuilderCreate() |
|
ffi.ObjectRef.__init__(self, ptr) |
|
|
|
@property |
|
def opt_level(self): |
|
""" |
|
The general optimization level as an integer between 0 and 3. |
|
""" |
|
return ffi.lib.LLVMPY_PassManagerBuilderGetOptLevel(self) |
|
|
|
@opt_level.setter |
|
def opt_level(self, level): |
|
ffi.lib.LLVMPY_PassManagerBuilderSetOptLevel(self, level) |
|
|
|
@property |
|
def size_level(self): |
|
""" |
|
Whether and how much to optimize for size. An integer between 0 and 2. |
|
""" |
|
return ffi.lib.LLVMPY_PassManagerBuilderGetSizeLevel(self) |
|
|
|
@size_level.setter |
|
def size_level(self, size): |
|
ffi.lib.LLVMPY_PassManagerBuilderSetSizeLevel(self, size) |
|
|
|
@property |
|
def inlining_threshold(self): |
|
""" |
|
The integer threshold for inlining a function into another. The higher, |
|
the more likely inlining a function is. This attribute is write-only. |
|
""" |
|
raise NotImplementedError("inlining_threshold is write-only") |
|
|
|
@inlining_threshold.setter |
|
def inlining_threshold(self, threshold): |
|
ffi.lib.LLVMPY_PassManagerBuilderUseInlinerWithThreshold( |
|
self, threshold) |
|
|
|
@property |
|
def disable_unroll_loops(self): |
|
""" |
|
If true, disable loop unrolling. |
|
""" |
|
return ffi.lib.LLVMPY_PassManagerBuilderGetDisableUnrollLoops(self) |
|
|
|
@disable_unroll_loops.setter |
|
def disable_unroll_loops(self, disable=True): |
|
ffi.lib.LLVMPY_PassManagerBuilderSetDisableUnrollLoops(self, disable) |
|
|
|
@property |
|
def loop_vectorize(self): |
|
""" |
|
If true, allow vectorizing loops. |
|
""" |
|
return ffi.lib.LLVMPY_PassManagerBuilderGetLoopVectorize(self) |
|
|
|
@loop_vectorize.setter |
|
def loop_vectorize(self, enable=True): |
|
return ffi.lib.LLVMPY_PassManagerBuilderSetLoopVectorize(self, enable) |
|
|
|
@property |
|
def slp_vectorize(self): |
|
""" |
|
If true, enable the "SLP vectorizer", which uses a different algorithm |
|
from the loop vectorizer. Both may be enabled at the same time. |
|
""" |
|
return ffi.lib.LLVMPY_PassManagerBuilderGetSLPVectorize(self) |
|
|
|
@slp_vectorize.setter |
|
def slp_vectorize(self, enable=True): |
|
return ffi.lib.LLVMPY_PassManagerBuilderSetSLPVectorize(self, enable) |
|
|
|
def _populate_module_pm(self, pm): |
|
ffi.lib.LLVMPY_PassManagerBuilderPopulateModulePassManager(self, pm) |
|
|
|
def _populate_function_pm(self, pm): |
|
ffi.lib.LLVMPY_PassManagerBuilderPopulateFunctionPassManager(self, pm) |
|
|
|
def populate(self, pm): |
|
if isinstance(pm, passmanagers.ModulePassManager): |
|
self._populate_module_pm(pm) |
|
elif isinstance(pm, passmanagers.FunctionPassManager): |
|
self._populate_function_pm(pm) |
|
else: |
|
raise TypeError(pm) |
|
|
|
def _dispose(self): |
|
self._capi.LLVMPY_PassManagerBuilderDispose(self) |
|
|
|
|
|
|
|
|
|
|
|
ffi.lib.LLVMPY_PassManagerBuilderCreate.restype = ffi.LLVMPassManagerBuilderRef |
|
|
|
ffi.lib.LLVMPY_PassManagerBuilderDispose.argtypes = [ |
|
ffi.LLVMPassManagerBuilderRef, |
|
] |
|
|
|
ffi.lib.LLVMPY_PassManagerBuilderPopulateModulePassManager.argtypes = [ |
|
ffi.LLVMPassManagerBuilderRef, |
|
ffi.LLVMPassManagerRef, |
|
] |
|
|
|
ffi.lib.LLVMPY_PassManagerBuilderPopulateFunctionPassManager.argtypes = [ |
|
ffi.LLVMPassManagerBuilderRef, |
|
ffi.LLVMPassManagerRef, |
|
] |
|
|
|
|
|
|
|
for _func in (ffi.lib.LLVMPY_PassManagerBuilderSetOptLevel, |
|
ffi.lib.LLVMPY_PassManagerBuilderSetSizeLevel, |
|
ffi.lib.LLVMPY_PassManagerBuilderUseInlinerWithThreshold, |
|
): |
|
_func.argtypes = [ffi.LLVMPassManagerBuilderRef, c_uint] |
|
|
|
for _func in (ffi.lib.LLVMPY_PassManagerBuilderGetOptLevel, |
|
ffi.lib.LLVMPY_PassManagerBuilderGetSizeLevel, |
|
): |
|
_func.argtypes = [ffi.LLVMPassManagerBuilderRef] |
|
_func.restype = c_uint |
|
|
|
|
|
|
|
for _func in (ffi.lib.LLVMPY_PassManagerBuilderSetDisableUnrollLoops, |
|
ffi.lib.LLVMPY_PassManagerBuilderSetLoopVectorize, |
|
ffi.lib.LLVMPY_PassManagerBuilderSetSLPVectorize, |
|
): |
|
_func.argtypes = [ffi.LLVMPassManagerBuilderRef, c_bool] |
|
|
|
for _func in (ffi.lib.LLVMPY_PassManagerBuilderGetDisableUnrollLoops, |
|
ffi.lib.LLVMPY_PassManagerBuilderGetLoopVectorize, |
|
ffi.lib.LLVMPY_PassManagerBuilderGetSLPVectorize, |
|
): |
|
_func.argtypes = [ffi.LLVMPassManagerBuilderRef] |
|
_func.restype = c_bool |
|
|