@@ -145,16 +145,12 @@ void LLVMPassBuilderExtensionsSetAAPipeline(LLVMPassBuilderExtensionsRef Extensi
145
145
146
146
// Vendored API entrypoint
147
147
148
- LLVMErrorRef LLVMRunJuliaPasses (LLVMModuleRef M, const char *Passes,
149
- LLVMTargetMachineRef TM, LLVMPassBuilderOptionsRef Options,
150
- LLVMPassBuilderExtensionsRef Extensions) {
151
- TargetMachine *Machine = unwrap (TM);
152
- LLVMPassBuilderOptions *PassOpts = unwrap (Options);
153
- LLVMPassBuilderExtensions *PassExts = unwrap (Extensions);
148
+ static LLVMErrorRef runJuliaPasses (Module *Mod, Function *Fun, const char *Passes,
149
+ TargetMachine *Machine, LLVMPassBuilderOptions *PassOpts,
150
+ LLVMPassBuilderExtensions *PassExts) {
154
151
bool Debug = PassOpts->DebugLogging ;
155
152
bool VerifyEach = PassOpts->VerifyEach ;
156
153
157
- Module *Mod = unwrap (M);
158
154
PassInstrumentationCallbacks PIC;
159
155
#if LLVM_VERSION_MAJOR >= 16
160
156
PassBuilder PB (Machine, PassOpts->PTO , std::nullopt , &PIC);
@@ -203,14 +199,43 @@ LLVMErrorRef LLVMRunJuliaPasses(LLVMModuleRef M, const char *Passes,
203
199
#else
204
200
SI.registerCallbacks (PIC, &FAM);
205
201
#endif
206
- ModulePassManager MPM;
207
- if (VerifyEach) {
208
- MPM.addPass (VerifierPass ());
209
- }
210
- if (auto Err = PB.parsePassPipeline (MPM, Passes)) {
211
- return wrap (std::move (Err));
202
+
203
+ if (Fun) {
204
+ FunctionPassManager FPM;
205
+ if (VerifyEach)
206
+ FPM.addPass (VerifierPass ());
207
+ if (auto Err = PB.parsePassPipeline (FPM, Passes))
208
+ return wrap (std::move (Err));
209
+ FPM.run (*Fun, FAM);
210
+ } else {
211
+ ModulePassManager MPM;
212
+ if (VerifyEach)
213
+ MPM.addPass (VerifierPass ());
214
+ if (auto Err = PB.parsePassPipeline (MPM, Passes))
215
+ return wrap (std::move (Err));
216
+ MPM.run (*Mod, MAM);
212
217
}
213
218
214
- MPM.run (*Mod, MAM);
215
219
return LLVMErrorSuccess;
216
220
}
221
+
222
+ LLVMErrorRef LLVMRunJuliaPasses (LLVMModuleRef M, const char *Passes,
223
+ LLVMTargetMachineRef TM, LLVMPassBuilderOptionsRef Options,
224
+ LLVMPassBuilderExtensionsRef Extensions) {
225
+ TargetMachine *Machine = unwrap (TM);
226
+ LLVMPassBuilderOptions *PassOpts = unwrap (Options);
227
+ LLVMPassBuilderExtensions *PassExts = unwrap (Extensions);
228
+ Module *Mod = unwrap (M);
229
+ return runJuliaPasses (Mod, nullptr , Passes, Machine, PassOpts, PassExts);
230
+ }
231
+
232
+ LLVMErrorRef LLVMRunJuliaPassesOnFunction (LLVMValueRef F, const char *Passes,
233
+ LLVMTargetMachineRef TM,
234
+ LLVMPassBuilderOptionsRef Options,
235
+ LLVMPassBuilderExtensionsRef Extensions) {
236
+ TargetMachine *Machine = unwrap (TM);
237
+ LLVMPassBuilderOptions *PassOpts = unwrap (Options);
238
+ LLVMPassBuilderExtensions *PassExts = unwrap (Extensions);
239
+ Function *Fun = unwrap<Function>(F);
240
+ return runJuliaPasses (Fun->getParent (), Fun, Passes, Machine, PassOpts, PassExts);
241
+ }
0 commit comments