33function optimize! (@nospecialize (job:: CompilerJob ), mod:: LLVM.Module ; opt_level= 1 )
44 tm = llvm_machine (job. config. target)
55
6- global current_job
6+ global current_job # ScopedValue?
77 current_job = job
88
99 @dispose pb= NewPMPassBuilder () begin
@@ -14,6 +14,12 @@ function optimize!(@nospecialize(job::CompilerJob), mod::LLVM.Module; opt_level=
1414 register! (pb, LowerKernelStatePass ())
1515 register! (pb, CleanupKernelStatePass ())
1616
17+ for (name, plugin) in PLUGINS
18+ if plugin. pipeline_callback != = nothing
19+ register! (pb, CallbackPass (name, plugin. pipeline_callback))
20+ end
21+ end
22+
1723 add! (pb, NewPMModulePassManager ()) do mpm
1824 buildNewPMPipeline! (mpm, job, opt_level)
1925 end
@@ -24,6 +30,20 @@ function optimize!(@nospecialize(job::CompilerJob), mod::LLVM.Module; opt_level=
2430 return
2531end
2632
33+ struct Plugin
34+ finalize_module # f(@nospecialize(job), compiled, mod::LLVM,Module)
35+ pipeline_callback # f(@nospecialize(job), intrinsic, mod::LLVM.Module)
36+ end
37+
38+ # TODO : Priority heap to provide order between different plugins
39+ const PLUGINS = Dict {String, Plugin} ()
40+ function register_plugin! (name:: String , check:: Bool = true ; finalize_module = nothing , pipeline_callback = nothing )
41+ if check && haskey (PLUGINS, name)
42+ error (" GPUCompiler plugin with name $name is already registered" )
43+ end
44+ PLUGINS[name] = Plugin (finalize_module, pipeline_callback)
45+ end
46+
2747function buildNewPMPipeline! (mpm, @nospecialize (job:: CompilerJob ), opt_level)
2848 buildEarlySimplificationPipeline (mpm, job, opt_level)
2949 add! (mpm, AlwaysInlinerPass ())
@@ -41,6 +61,11 @@ function buildNewPMPipeline!(mpm, @nospecialize(job::CompilerJob), opt_level)
4161 add! (fpm, WarnMissedTransformationsPass ())
4262 end
4363 end
64+ for (name, plugin) in PLUGINS
65+ if plugin. pipeline_callback != = nothing
66+ add! (mpm, CallbackPass (name, plugin. pipeline_callback))
67+ end
68+ end
4469 buildIntrinsicLoweringPipeline (mpm, job, opt_level)
4570 buildCleanupPipeline (mpm, job, opt_level)
4671end
@@ -423,3 +448,17 @@ function lower_ptls!(mod::LLVM.Module)
423448 return changed
424449end
425450LowerPTLSPass () = NewPMModulePass (" GPULowerPTLS" , lower_ptls!)
451+
452+
453+ function callback_pass! (name, callback:: F , mod:: LLVM.Module ) where F
454+ job = current_job:: CompilerJob
455+ changed = false
456+
457+ if haskey (functions (mod), name)
458+ marker = functions (mod)[name]
459+ changed = callback (job, marker, mod)
460+ end
461+ return changed
462+ end
463+
464+ CallbackPass (name, callback) = NewPMModulePass (" CallbackPass<$name >" , (mod)-> callback_pass! (name, callback, mod))
0 commit comments