@@ -48,15 +48,24 @@ static TargetMachine *unwrap(LLVMTargetMachineRef P) {
48
48
DEFINE_SIMPLE_CONVERSION_FUNCTIONS (LLVMPassBuilderOptions,
49
49
LLVMPassBuilderOptionsRef)
50
50
51
- LLVMErrorRef LLVMRunPasses (LLVMModuleRef M, const char *Passes,
52
- LLVMTargetMachineRef TM,
53
- LLVMPassBuilderOptionsRef Options) {
51
+ LLVMErrorRef RunPasses (LLVMModuleRef M, LLVMValueRef F , const char *Passes,
52
+ LLVMTargetMachineRef TM,
53
+ LLVMPassBuilderOptionsRef Options) {
54
54
TargetMachine *Machine = unwrap (TM);
55
55
LLVMPassBuilderOptions *PassOpts = unwrap (Options);
56
56
bool Debug = PassOpts->DebugLogging ;
57
57
bool VerifyEach = PassOpts->VerifyEach ;
58
58
59
- Module *Mod = unwrap (M);
59
+ // Determine what to run passes on.
60
+ Module *Mod;
61
+ Function *Fun = nullptr ;
62
+ if (F) {
63
+ Fun = unwrap<Function>(F);
64
+ Mod = Fun->getParent ();
65
+ } else {
66
+ Mod = unwrap (M);
67
+ }
68
+
60
69
PassInstrumentationCallbacks PIC;
61
70
PassBuilder PB (Machine, PassOpts->PTO , std::nullopt, &PIC);
62
71
@@ -80,18 +89,39 @@ LLVMErrorRef LLVMRunPasses(LLVMModuleRef M, const char *Passes,
80
89
81
90
StandardInstrumentations SI (Mod->getContext (), Debug, VerifyEach);
82
91
SI.registerCallbacks (PIC, &MAM);
83
- ModulePassManager MPM;
84
- if (VerifyEach) {
85
- MPM.addPass (VerifierPass ());
86
- }
87
- if (auto Err = PB.parsePassPipeline (MPM, Passes)) {
88
- return wrap (std::move (Err));
92
+
93
+ // Run the pipeline.
94
+ if (Fun) {
95
+ FunctionPassManager FPM;
96
+ if (VerifyEach)
97
+ FPM.addPass (VerifierPass ());
98
+ if (auto Err = PB.parsePassPipeline (FPM, Passes))
99
+ return wrap (std::move (Err));
100
+ FPM.run (*Fun, FAM);
101
+ } else {
102
+ ModulePassManager MPM;
103
+ if (VerifyEach)
104
+ MPM.addPass (VerifierPass ());
105
+ if (auto Err = PB.parsePassPipeline (MPM, Passes))
106
+ return wrap (std::move (Err));
107
+ MPM.run (*Mod, MAM);
89
108
}
90
109
91
- MPM.run (*Mod, MAM);
92
110
return LLVMErrorSuccess;
93
111
}
94
112
113
+ LLVMErrorRef LLVMRunPasses (LLVMModuleRef M, const char *Passes,
114
+ LLVMTargetMachineRef TM,
115
+ LLVMPassBuilderOptionsRef Options) {
116
+ return RunPasses (M, nullptr , Passes, TM, Options);
117
+ }
118
+
119
+ LLVMErrorRef LLVMRunPassesOnFunction (LLVMValueRef F, const char *Passes,
120
+ LLVMTargetMachineRef TM,
121
+ LLVMPassBuilderOptionsRef Options) {
122
+ return RunPasses (nullptr , F, Passes, TM, Options);
123
+ }
124
+
95
125
LLVMPassBuilderOptionsRef LLVMCreatePassBuilderOptions () {
96
126
return wrap (new LLVMPassBuilderOptions ());
97
127
}
0 commit comments