File size: 4,947 Bytes
c65f48d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
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
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,
]
# Unsigned int PassManagerBuilder properties
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
# Boolean PassManagerBuilder properties
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
|