diff --git a/ffi/newpassmanagers.cpp b/ffi/newpassmanagers.cpp index 4d3cba987..dfbfaeac9 100644 --- a/ffi/newpassmanagers.cpp +++ b/ffi/newpassmanagers.cpp @@ -37,11 +37,6 @@ typedef OpaquePipelineTuningOptions *LLVMPipelineTuningOptionsRef; DEFINE_SIMPLE_CONVERSION_FUNCTIONS(PipelineTuningOptions, LLVMPipelineTuningOptionsRef) -struct OpaquePassInstrumentationCallbacks; -typedef OpaquePassInstrumentationCallbacks *LLVMPassInstrumentationCallbacksRef; -DEFINE_SIMPLE_CONVERSION_FUNCTIONS(PassInstrumentationCallbacks, - LLVMPassInstrumentationCallbacksRef) - struct OpaqueTimePassesHandler; typedef OpaqueTimePassesHandler *LLVMTimePassesHandlerRef; DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TimePassesHandler, LLVMTimePassesHandlerRef) @@ -290,17 +285,6 @@ LLVMPY_DisposePipelineTuningOptions(LLVMPipelineTuningOptionsRef PTO) { // PB -API_EXPORT(LLVMPassInstrumentationCallbacksRef) -LLVMPY_LLVMPassInstrumentationCallbacksCreate() { - return llvm::wrap(new PassInstrumentationCallbacks()); -} - -API_EXPORT(void) -LLVMPY_LLVMPassInstrumentationCallbacksDispose( - LLVMPassInstrumentationCallbacksRef PICRef) { - delete llvm::unwrap(PICRef); -} - API_EXPORT(LLVMTimePassesHandlerRef) LLVMPY_CreateLLVMTimePassesHandler() { return llvm::wrap(new TimePassesHandler(true)); @@ -312,11 +296,12 @@ LLVMPY_DisposeLLVMTimePassesHandler(LLVMTimePassesHandlerRef TimePassesRef) { } API_EXPORT(void) -LLVMPY_SetTimePassesNPM(LLVMTimePassesHandlerRef TimePassesRef, - LLVMPassInstrumentationCallbacksRef PICRef) { +LLVMPY_SetTimePassesNPM(LLVMPassBuilderRef PBRef, LLVMTimePassesHandlerRef TimePassesRef) { TimePassesHandler *TP = llvm::unwrap(TimePassesRef); TimePassesIsEnabled = true; - TP->registerCallbacks(*llvm::unwrap(PICRef)); + PassBuilder *PB = llvm::unwrap(PBRef); + PassInstrumentationCallbacks *PIC = PB->getPassInstrumentationCallbacks(); + TP->registerCallbacks(*PIC); } API_EXPORT(void) @@ -334,11 +319,10 @@ LLVMPY_ReportAndResetTimingsNPM(LLVMTimePassesHandlerRef TimePassesRef, API_EXPORT(LLVMPassBuilderRef) LLVMPY_CreatePassBuilder(LLVMTargetMachineRef TMRef, - LLVMPipelineTuningOptionsRef PTORef, - LLVMPassInstrumentationCallbacksRef PICRef) { + LLVMPipelineTuningOptionsRef PTORef) { TargetMachine *TM = llvm::unwrap(TMRef); PipelineTuningOptions *PTO = llvm::unwrap(PTORef); - PassInstrumentationCallbacks *PIC = llvm::unwrap(PICRef); + PassInstrumentationCallbacks *PIC = new PassInstrumentationCallbacks(); #if LLVM_VERSION_MAJOR < 16 return llvm::wrap(new PassBuilder(TM, *PTO, None, PIC)); #else diff --git a/llvmlite/binding/ffi.py b/llvmlite/binding/ffi.py index 7ec9dc242..a0008ae44 100644 --- a/llvmlite/binding/ffi.py +++ b/llvmlite/binding/ffi.py @@ -40,8 +40,6 @@ def _make_opaque_ref(name): LLVMSectionIteratorRef = _make_opaque_ref("LLVMSectionIterator") LLVMOrcLLJITRef = _make_opaque_ref("LLVMOrcLLJITRef") LLVMOrcDylibTrackerRef = _make_opaque_ref("LLVMOrcDylibTrackerRef") -LLVMPassInstrumentationCallbacksRef = \ - _make_opaque_ref("LLVMPassInstrumentationCallbacks") LLVMTimePassesHandlerRef = _make_opaque_ref("LLVMTimePassesHandler") LLVMPipelineTuningOptionsRef = _make_opaque_ref("LLVMPipeLineTuningOptions") LLVMModulePassManagerRef = _make_opaque_ref("LLVMModulePassManager") diff --git a/llvmlite/binding/newpassmanagers.py b/llvmlite/binding/newpassmanagers.py index 9b2dfc8b7..0902ee93f 100644 --- a/llvmlite/binding/newpassmanagers.py +++ b/llvmlite/binding/newpassmanagers.py @@ -208,32 +208,19 @@ def _dispose(self): ffi.lib.LLVMPY_DisposePipelineTuningOptions(self) -class TimePassesHandler(ffi.ObjectRef): - def __init__(self): - super().__init__(ffi.lib.LLVMPY_CreateLLVMTimePassesHandler()) - - def _dispose(self): - ffi.lib.LLVMPY_DisposeLLVMTimePassesHandler(self) - - -class PassInstrumentationCallbacks(ffi.ObjectRef): - def __init__(self): - super().__init__( - ffi.lib.LLVMPY_LLVMPassInstrumentationCallbacksCreate() - ) - - def _dispose(self): - ffi.lib.LLVMPY_LLVMPassInstrumentationCallbacksDispose(self) - - class PassBuilder(ffi.ObjectRef): + class TimePassesHandler(ffi.ObjectRef): + def __init__(self): + super().__init__(ffi.lib.LLVMPY_CreateLLVMTimePassesHandler()) + + def _dispose(self): + ffi.lib.LLVMPY_DisposeLLVMTimePassesHandler(self) def __init__(self, tm, pto): - self._pic = PassInstrumentationCallbacks() - self._time_passes = TimePassesHandler() - super().__init__(ffi.lib.LLVMPY_CreatePassBuilder(tm, pto, self._pic)) + super().__init__(ffi.lib.LLVMPY_CreatePassBuilder(tm, pto)) self._pto = pto self._tm = tm + self._time_passes = self.TimePassesHandler() def getModulePassManager(self): return ModulePassManager( @@ -250,7 +237,7 @@ def getFunctionPassManager(self): def set_time_passes(self): """Enable the pass timers. """ - ffi.lib.LLVMPY_SetTimePassesNPM(self._time_passes, self._pic) + ffi.lib.LLVMPY_SetTimePassesNPM(self, self._time_passes) def report_and_reset_timings(self): """Returns the pass timings report and resets the LLVM internal timers. @@ -380,7 +367,6 @@ def _dispose(self): ffi.lib.LLVMPY_CreatePassBuilder.argtypes = [ ffi.LLVMTargetMachineRef, ffi.LLVMPipelineTuningOptionsRef, - ffi.LLVMPassInstrumentationCallbacksRef, ] ffi.lib.LLVMPY_DisposePassBuilder.argtypes = [ffi.LLVMPassBuilderRef,] @@ -392,8 +378,8 @@ def _dispose(self): ffi.LLVMTimePassesHandlerRef,] ffi.lib.LLVMPY_SetTimePassesNPM.argtypes = [ + ffi.LLVMPassBuilderRef, ffi.LLVMTimePassesHandlerRef, - ffi.LLVMPassInstrumentationCallbacksRef, ] ffi.lib.LLVMPY_ReportAndResetTimingsNPM.argtypes = [ @@ -401,14 +387,6 @@ def _dispose(self): POINTER(c_char_p), ] -ffi.lib.LLVMPY_LLVMPassInstrumentationCallbacksCreate.restype = ( - ffi.LLVMPassInstrumentationCallbacksRef -) - -ffi.lib.LLVMPY_LLVMPassInstrumentationCallbacksDispose.argtypes = ( - ffi.LLVMPassInstrumentationCallbacksRef, -) - # Pipeline builders ffi.lib.LLVMPY_buildPerModuleDefaultPipeline.restype = \