7
7
* Philipp Schubert and others
8
8
*****************************************************************************/
9
9
10
- #include " phasar/Controller/ AnalysisController.h"
10
+ #include " AnalysisController.h"
11
11
12
12
#include " phasar/PhasarLLVM/Passes/GeneralStatisticsAnalysis.h"
13
13
#include " phasar/PhasarLLVM/TypeHierarchy/LLVMTypeHierarchy.h"
17
17
18
18
namespace psr {
19
19
20
- static void
21
- emitRequestedHelperAnalysisResults (AnalysisController::ControllerData &Data) {
22
- auto WithResultFileOrStdout = [&ResultDirectory = Data.ResultDirectory ](
20
+ void AnalysisController::emitRequestedHelperAnalysisResults () {
21
+ auto WithResultFileOrStdout = [&ResultDirectory = this ->ResultDirectory ](
23
22
const auto &FileName, auto Callback) {
24
23
if (!ResultDirectory.empty ()) {
25
24
if (auto OFS = openFileStream (ResultDirectory.string () + FileName)) {
@@ -30,8 +29,8 @@ emitRequestedHelperAnalysisResults(AnalysisController::ControllerData &Data) {
30
29
}
31
30
};
32
31
33
- auto EmitterOptions = Data. EmitterOptions ;
34
- auto &HA = *Data. HA ;
32
+ auto EmitterOptions = this -> EmitterOptions ;
33
+ auto &HA = *this -> HA ;
35
34
36
35
if (EmitterOptions & AnalysisControllerEmitterOptions::EmitIR) {
37
36
WithResultFileOrStdout (" /psr-preprocess-ir.ll" , [&HA](auto &OS) {
@@ -96,24 +95,24 @@ emitRequestedHelperAnalysisResults(AnalysisController::ControllerData &Data) {
96
95
}
97
96
}
98
97
99
- static void executeDemandDriven (AnalysisController::ControllerData & /* Data*/ ) {
98
+ static void executeDemandDriven (AnalysisController & /* Data*/ ) {
100
99
llvm::report_fatal_error (
101
100
" AnalysisStrategy 'demand-driven' not supported, yet!" );
102
101
}
103
- static void executeIncremental (AnalysisController::ControllerData & /* Data*/ ) {
102
+ static void executeIncremental (AnalysisController & /* Data*/ ) {
104
103
llvm::report_fatal_error (
105
104
" AnalysisStrategy 'incremental' not supported, yet!" );
106
105
}
107
- static void executeModuleWise (AnalysisController::ControllerData & /* Data*/ ) {
106
+ static void executeModuleWise (AnalysisController & /* Data*/ ) {
108
107
llvm::report_fatal_error (
109
108
" AnalysisStrategy 'module-wise' not supported, yet!" );
110
109
}
111
- static void executeVariational (AnalysisController::ControllerData & /* Data*/ ) {
110
+ static void executeVariational (AnalysisController & /* Data*/ ) {
112
111
llvm::report_fatal_error (
113
112
" AnalysisStrategy 'variational' not supported, yet!" );
114
113
}
115
114
116
- static void executeWholeProgram (AnalysisController::ControllerData &Data) {
115
+ static void executeWholeProgram (AnalysisController &Data) {
117
116
for (auto DataFlowAnalysis : Data.DataFlowAnalyses ) {
118
117
using namespace controller ;
119
118
switch (DataFlowAnalysis) {
@@ -171,60 +170,31 @@ static void executeWholeProgram(AnalysisController::ControllerData &Data) {
171
170
}
172
171
}
173
172
174
- static void executeAs (AnalysisController::ControllerData &Data,
175
- AnalysisStrategy Strategy) {
173
+ void AnalysisController::run () {
176
174
switch (Strategy) {
177
175
case AnalysisStrategy::None:
178
176
return ;
179
177
case AnalysisStrategy::DemandDriven:
180
- executeDemandDriven (Data );
178
+ executeDemandDriven (* this );
181
179
return ;
182
180
case AnalysisStrategy::Incremental:
183
- executeIncremental (Data );
181
+ executeIncremental (* this );
184
182
return ;
185
183
case AnalysisStrategy::ModuleWise:
186
- executeModuleWise (Data );
184
+ executeModuleWise (* this );
187
185
return ;
188
186
case AnalysisStrategy::Variational:
189
- executeVariational (Data );
187
+ executeVariational (* this );
190
188
return ;
191
189
case AnalysisStrategy::WholeProgram:
192
- executeWholeProgram (Data );
190
+ executeWholeProgram (* this );
193
191
return ;
194
192
}
195
193
llvm_unreachable (
196
194
" All AnalysisStrategy variants should be handled in the switch above!" );
197
195
}
198
196
199
- AnalysisController::AnalysisController (
200
- HelperAnalyses &HA, std::vector<DataFlowAnalysisType> DataFlowAnalyses,
201
- std::vector<std::string> AnalysisConfigs,
202
- std::vector<std::string> EntryPoints, AnalysisStrategy Strategy,
203
- AnalysisControllerEmitterOptions EmitterOptions,
204
- IFDSIDESolverConfig SolverConfig, std::string ProjectID,
205
- std::string OutDirectory)
206
- : Data{
207
- &HA,
208
- std::move (DataFlowAnalyses),
209
- std::move (AnalysisConfigs),
210
- std::move (EntryPoints),
211
- Strategy,
212
- EmitterOptions,
213
- std::move (ProjectID),
214
- std::move (OutDirectory),
215
- SolverConfig,
216
- } {
217
- if (!Data.ResultDirectory .empty ()) {
218
- // create directory for results
219
- Data.ResultDirectory /= Data.ProjectID + " -" + createTimeStamp ();
220
- std::filesystem::create_directory (Data.ResultDirectory );
221
- }
222
- emitRequestedHelperAnalysisResults (Data);
223
- executeAs (Data, Strategy);
224
- }
225
-
226
- LLVMTaintConfig
227
- controller::makeTaintConfig (AnalysisController::ControllerData &Data) {
197
+ LLVMTaintConfig controller::makeTaintConfig (AnalysisController &Data) {
228
198
std::string AnalysisConfigPath =
229
199
!Data.AnalysisConfigs .empty () ? Data.AnalysisConfigs [0 ] : " " ;
230
200
return !AnalysisConfigPath.empty ()
0 commit comments