3
3
function optimize! (@nospecialize (job:: CompilerJob ), mod:: LLVM.Module ; opt_level= 1 )
4
4
tm = llvm_machine (job. config. target)
5
5
6
- global current_job
6
+ global current_job # ScopedValue?
7
7
current_job = job
8
8
9
9
@dispose pb= NewPMPassBuilder () begin
@@ -14,6 +14,12 @@ function optimize!(@nospecialize(job::CompilerJob), mod::LLVM.Module; opt_level=
14
14
register! (pb, LowerKernelStatePass ())
15
15
register! (pb, CleanupKernelStatePass ())
16
16
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
+
17
23
add! (pb, NewPMModulePassManager ()) do mpm
18
24
buildNewPMPipeline! (mpm, job, opt_level)
19
25
end
@@ -24,6 +30,20 @@ function optimize!(@nospecialize(job::CompilerJob), mod::LLVM.Module; opt_level=
24
30
return
25
31
end
26
32
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
+
27
47
function buildNewPMPipeline! (mpm, @nospecialize (job:: CompilerJob ), opt_level)
28
48
buildEarlySimplificationPipeline (mpm, job, opt_level)
29
49
add! (mpm, AlwaysInlinerPass ())
@@ -41,6 +61,11 @@ function buildNewPMPipeline!(mpm, @nospecialize(job::CompilerJob), opt_level)
41
61
add! (fpm, WarnMissedTransformationsPass ())
42
62
end
43
63
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
44
69
buildIntrinsicLoweringPipeline (mpm, job, opt_level)
45
70
buildCleanupPipeline (mpm, job, opt_level)
46
71
end
@@ -423,3 +448,17 @@ function lower_ptls!(mod::LLVM.Module)
423
448
return changed
424
449
end
425
450
LowerPTLSPass () = 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