diff --git a/Project.toml b/Project.toml index c4e2ae4f..64dd9a07 100644 --- a/Project.toml +++ b/Project.toml @@ -19,7 +19,7 @@ BFloat16sExt = "BFloat16s" [compat] BFloat16s = "0.4, 0.5, 0.6" CEnum = "0.2, 0.3, 0.4, 0.5" -LLVMExtra_jll = "=0.0.37" +LLVMExtra_jll = "=0.0.38" Libdl = "1.8" Preferences = "1.4" Printf = "1.8" diff --git a/deps/LLVMExtra/include/LLVMExtra.h b/deps/LLVMExtra/include/LLVMExtra.h index 2d1495e2..0773ca49 100644 --- a/deps/LLVMExtra/include/LLVMExtra.h +++ b/deps/LLVMExtra/include/LLVMExtra.h @@ -231,7 +231,7 @@ LLVMContextRef LLVMGetBuilderContext(LLVMBuilderRef Builder); typedef struct LLVMOpaquePassBuilderExtensions *LLVMPassBuilderExtensionsRef; LLVMPassBuilderExtensionsRef LLVMCreatePassBuilderExtensions(void); void LLVMDisposePassBuilderExtensions(LLVMPassBuilderExtensionsRef Extensions); -void LLVMPassBuilderExtensionsSetRegistrationCallback(LLVMPassBuilderExtensionsRef Options, +void LLVMPassBuilderExtensionsPushRegistrationCallbacks(LLVMPassBuilderExtensionsRef Options, void (*RegistrationCallback)(void *)); typedef LLVMBool (*LLVMJuliaModulePassCallback)(LLVMModuleRef M, void *Thunk); typedef LLVMBool (*LLVMJuliaFunctionPassCallback)(LLVMValueRef F, void *Thunk); diff --git a/deps/LLVMExtra/lib/NewPM.cpp b/deps/LLVMExtra/lib/NewPM.cpp index ccd65adb..60a287b4 100644 --- a/deps/LLVMExtra/lib/NewPM.cpp +++ b/deps/LLVMExtra/lib/NewPM.cpp @@ -33,7 +33,7 @@ class LLVMPassBuilderExtensions { public: // A callback to register additional pipeline parsing callbacks with the pass builder. // This is used to support Julia's passes. - void (*RegistrationCallback)(void *); + SmallVector> RegistrationCallbacks; // A list of callbacks that each register a single custom module or function pass. // These callbacks are generated here in C++, and match against a pass name. @@ -66,10 +66,10 @@ void LLVMDisposePassBuilderExtensions(LLVMPassBuilderExtensionsRef Extensions) { // Pass registration -void LLVMPassBuilderExtensionsSetRegistrationCallback( +void LLVMPassBuilderExtensionsPushRegistrationCallbacks( LLVMPassBuilderExtensionsRef Extensions, void (*RegistrationCallback)(void *)) { LLVMPassBuilderExtensions *PassExts = unwrap(Extensions); - PassExts->RegistrationCallback = RegistrationCallback; + PassExts->RegistrationCallbacks.push_back(RegistrationCallback); return; } @@ -158,8 +158,9 @@ static LLVMErrorRef runJuliaPasses(Module *Mod, Function *Fun, const char *Passe #else PassBuilder PB(Machine, PassOpts->PTO, None, &PIC); #endif - if (PassExts->RegistrationCallback) - PassExts->RegistrationCallback(&PB); + + for (auto &Callback : PassExts->RegistrationCallbacks) + Callback(&PB); for (auto &Callback : PassExts->ModulePipelineParsingCallbacks) PB.registerPipelineParsingCallback(Callback); for (auto &Callback : PassExts->FunctionPipelineParsingCallbacks) diff --git a/lib/15/libLLVM_extra.jl b/lib/15/libLLVM_extra.jl index 8a330824..0204f16d 100644 --- a/lib/15/libLLVM_extra.jl +++ b/lib/15/libLLVM_extra.jl @@ -371,8 +371,8 @@ function LLVMDisposePassBuilderExtensions(Extensions) ccall((:LLVMDisposePassBuilderExtensions, libLLVMExtra), Cvoid, (LLVMPassBuilderExtensionsRef,), Extensions) end -function LLVMPassBuilderExtensionsSetRegistrationCallback(Options, RegistrationCallback) - ccall((:LLVMPassBuilderExtensionsSetRegistrationCallback, libLLVMExtra), Cvoid, (LLVMPassBuilderExtensionsRef, Ptr{Cvoid}), Options, RegistrationCallback) +function LLVMPassBuilderExtensionsPushRegistrationCallbacks(Options, RegistrationCallback) + ccall((:LLVMPassBuilderExtensionsPushRegistrationCallbacks, libLLVMExtra), Cvoid, (LLVMPassBuilderExtensionsRef, Ptr{Cvoid}), Options, RegistrationCallback) end # typedef LLVMBool ( * LLVMJuliaModulePassCallback ) ( LLVMModuleRef M , void * Thunk ) diff --git a/lib/16/libLLVM_extra.jl b/lib/16/libLLVM_extra.jl index 8a330824..0204f16d 100644 --- a/lib/16/libLLVM_extra.jl +++ b/lib/16/libLLVM_extra.jl @@ -371,8 +371,8 @@ function LLVMDisposePassBuilderExtensions(Extensions) ccall((:LLVMDisposePassBuilderExtensions, libLLVMExtra), Cvoid, (LLVMPassBuilderExtensionsRef,), Extensions) end -function LLVMPassBuilderExtensionsSetRegistrationCallback(Options, RegistrationCallback) - ccall((:LLVMPassBuilderExtensionsSetRegistrationCallback, libLLVMExtra), Cvoid, (LLVMPassBuilderExtensionsRef, Ptr{Cvoid}), Options, RegistrationCallback) +function LLVMPassBuilderExtensionsPushRegistrationCallbacks(Options, RegistrationCallback) + ccall((:LLVMPassBuilderExtensionsPushRegistrationCallbacks, libLLVMExtra), Cvoid, (LLVMPassBuilderExtensionsRef, Ptr{Cvoid}), Options, RegistrationCallback) end # typedef LLVMBool ( * LLVMJuliaModulePassCallback ) ( LLVMModuleRef M , void * Thunk ) diff --git a/lib/17/libLLVM_extra.jl b/lib/17/libLLVM_extra.jl index b7ef156c..485a4912 100644 --- a/lib/17/libLLVM_extra.jl +++ b/lib/17/libLLVM_extra.jl @@ -331,8 +331,8 @@ function LLVMDisposePassBuilderExtensions(Extensions) ccall((:LLVMDisposePassBuilderExtensions, libLLVMExtra), Cvoid, (LLVMPassBuilderExtensionsRef,), Extensions) end -function LLVMPassBuilderExtensionsSetRegistrationCallback(Options, RegistrationCallback) - ccall((:LLVMPassBuilderExtensionsSetRegistrationCallback, libLLVMExtra), Cvoid, (LLVMPassBuilderExtensionsRef, Ptr{Cvoid}), Options, RegistrationCallback) +function LLVMPassBuilderExtensionsPushRegistrationCallbacks(Options, RegistrationCallback) + ccall((:LLVMPassBuilderExtensionsPushRegistrationCallbacks, libLLVMExtra), Cvoid, (LLVMPassBuilderExtensionsRef, Ptr{Cvoid}), Options, RegistrationCallback) end # typedef LLVMBool ( * LLVMJuliaModulePassCallback ) ( LLVMModuleRef M , void * Thunk ) diff --git a/lib/18/libLLVM_extra.jl b/lib/18/libLLVM_extra.jl index 0f7f3edf..36487c40 100644 --- a/lib/18/libLLVM_extra.jl +++ b/lib/18/libLLVM_extra.jl @@ -265,8 +265,8 @@ function LLVMDisposePassBuilderExtensions(Extensions) ccall((:LLVMDisposePassBuilderExtensions, libLLVMExtra), Cvoid, (LLVMPassBuilderExtensionsRef,), Extensions) end -function LLVMPassBuilderExtensionsSetRegistrationCallback(Options, RegistrationCallback) - ccall((:LLVMPassBuilderExtensionsSetRegistrationCallback, libLLVMExtra), Cvoid, (LLVMPassBuilderExtensionsRef, Ptr{Cvoid}), Options, RegistrationCallback) +function LLVMPassBuilderExtensionsPushRegistrationCallbacks(Options, RegistrationCallback) + ccall((:LLVMPassBuilderExtensionsPushRegistrationCallbacks, libLLVMExtra), Cvoid, (LLVMPassBuilderExtensionsRef, Ptr{Cvoid}), Options, RegistrationCallback) end # typedef LLVMBool ( * LLVMJuliaModulePassCallback ) ( LLVMModuleRef M , void * Thunk ) diff --git a/lib/19/libLLVM_extra.jl b/lib/19/libLLVM_extra.jl index 0f7f3edf..36487c40 100644 --- a/lib/19/libLLVM_extra.jl +++ b/lib/19/libLLVM_extra.jl @@ -265,8 +265,8 @@ function LLVMDisposePassBuilderExtensions(Extensions) ccall((:LLVMDisposePassBuilderExtensions, libLLVMExtra), Cvoid, (LLVMPassBuilderExtensionsRef,), Extensions) end -function LLVMPassBuilderExtensionsSetRegistrationCallback(Options, RegistrationCallback) - ccall((:LLVMPassBuilderExtensionsSetRegistrationCallback, libLLVMExtra), Cvoid, (LLVMPassBuilderExtensionsRef, Ptr{Cvoid}), Options, RegistrationCallback) +function LLVMPassBuilderExtensionsPushRegistrationCallbacks(Options, RegistrationCallback) + ccall((:LLVMPassBuilderExtensionsPushRegistrationCallbacks, libLLVMExtra), Cvoid, (LLVMPassBuilderExtensionsRef, Ptr{Cvoid}), Options, RegistrationCallback) end # typedef LLVMBool ( * LLVMJuliaModulePassCallback ) ( LLVMModuleRef M , void * Thunk ) diff --git a/lib/20/libLLVM_extra.jl b/lib/20/libLLVM_extra.jl index b9b25a7a..50c4c4f6 100644 --- a/lib/20/libLLVM_extra.jl +++ b/lib/20/libLLVM_extra.jl @@ -221,8 +221,8 @@ function LLVMDisposePassBuilderExtensions(Extensions) ccall((:LLVMDisposePassBuilderExtensions, libLLVMExtra), Cvoid, (LLVMPassBuilderExtensionsRef,), Extensions) end -function LLVMPassBuilderExtensionsSetRegistrationCallback(Options, RegistrationCallback) - ccall((:LLVMPassBuilderExtensionsSetRegistrationCallback, libLLVMExtra), Cvoid, (LLVMPassBuilderExtensionsRef, Ptr{Cvoid}), Options, RegistrationCallback) +function LLVMPassBuilderExtensionsPushRegistrationCallbacks(Options, RegistrationCallback) + ccall((:LLVMPassBuilderExtensionsPushRegistrationCallbacks, libLLVMExtra), Cvoid, (LLVMPassBuilderExtensionsRef, Ptr{Cvoid}), Options, RegistrationCallback) end # typedef LLVMBool ( * LLVMJuliaModulePassCallback ) ( LLVMModuleRef M , void * Thunk ) diff --git a/src/newpm.jl b/src/newpm.jl index 1d96894a..42a64332 100644 --- a/src/newpm.jl +++ b/src/newpm.jl @@ -276,7 +276,7 @@ function run!(pb::NewPMPassBuilder, target::Union{Module,Function}, tm::Union{No # register Julia passes julia_callback = cglobal(:jl_register_passbuilder_callbacks) - API.LLVMPassBuilderExtensionsSetRegistrationCallback(pb.exts, julia_callback) + API.LLVMPassBuilderExtensionsPushRegistrationCallbacks(pb.exts, julia_callback) # register AA pipeline if !isempty(aa_pipeline)