@@ -154,16 +154,15 @@ class AnalysisReader : public FunctionPass, bcl::Uncopyable {
154154public:
155155 static char ID;
156156
157- explicit AnalysisReader (StringRef DataFile = " " ) :
158- mDataFile(DataFile), FunctionPass(ID) {
157+ explicit AnalysisReader (): FunctionPass(ID) {
159158 initializeAnalysisReaderPass (*PassRegistry::getPassRegistry ());
160159 }
161160
162161 bool runOnFunction (Function &F) override ;
163162 void getAnalysisUsage (AnalysisUsage &AU) const override ;
164163
165164private:
166- std::string mDataFile ;
165+ bool load (Function &F, unsigned DWLang, StringRef DataFile) ;
167166};
168167
169168// / Extract a list of analyzed functions from external analysis results.
@@ -334,7 +333,7 @@ template<class TraitTag> void updateAntiFlowDep(
334333 DITrait.template set <TraitTag>(new trait::DIDependence (F, DistVector));
335334 LLVM_DEBUG (dbgs () << " [ANALYSIS READER]: set distance to [" ;
336335 if (Min) dbgs () << *Min; else dbgs () << " ?" ; dbgs () << " , " ;
337- if (Max) dbgs () << *Max; else dbgs () << " ?" ; " ]\n " );
336+ if (Max) dbgs () << *Max; else dbgs () << " ?" ; dbgs () << " ]\n " );
338337}
339338
340339// / Update description of output dependence in `DITrait` according to
@@ -367,9 +366,7 @@ INITIALIZE_PASS_END(AnalysisReader, "analysis-reader",
367366
368367char AnalysisReader::ID = 0;
369368
370- FunctionPass * llvm::createAnalysisReader (StringRef DataFile) {
371- return new AnalysisReader (DataFile);
372- }
369+ FunctionPass * llvm::createAnalysisReader () { return new AnalysisReader; }
373370
374371void AnalysisReader::getAnalysisUsage (AnalysisUsage &AU) const {
375372 AU.addRequired <DIMemoryTraitPoolWrapper>();
@@ -380,16 +377,19 @@ bool AnalysisReader::runOnFunction(Function &F) {
380377 auto DWLang = getLanguage (F);
381378 if (!DWLang)
382379 return false ;
383- if (mDataFile .empty ()) {
384- auto &GO = getAnalysis<GlobalOptionsImmutableWrapper>().getOptions ();
385- if (!GO.AnalysisUse .empty ())
386- mDataFile = GO.AnalysisUse ;
387- else
388- return false ;
389- }
390- auto FileOrErr = MemoryBuffer::getFile (mDataFile );
380+ auto &GO{getAnalysis<GlobalOptionsImmutableWrapper>().getOptions ()};
381+ for (auto &File : GO.AnalysisUse )
382+ load (F, *DWLang, File);
383+ return false ;
384+ }
385+
386+ bool AnalysisReader::load (Function &F, unsigned DWLang, StringRef DataFile) {
387+ LLVM_DEBUG (
388+ dbgs () << " [ANALYSIS READER]: load external analysis results from '"
389+ << DataFile << " '\n " );
390+ auto FileOrErr = MemoryBuffer::getFile (DataFile);
391391 if (auto EC = FileOrErr.getError ()) {
392- F.getContext ().diagnose (DiagnosticInfoPGOProfile (mDataFile .data (),
392+ F.getContext ().diagnose (DiagnosticInfoPGOProfile (DataFile .data (),
393393 Twine (" unable to open file: " ) + EC.message ()));
394394 return false ;
395395 }
@@ -401,9 +401,9 @@ bool AnalysisReader::runOnFunction(Function &F) {
401401 // Build diagnostic in-place of call to diagnose(), because diagnostic
402402 // class uses temporary objects available only at construction time.
403403 F.getContext ().diagnose (
404- DiagnosticInfoPGOProfile (mDataFile .data (), D, DS_Note));
404+ DiagnosticInfoPGOProfile (DataFile .data (), D, DS_Note));
405405 }
406- F.getContext ().diagnose (DiagnosticInfoPGOProfile (mDataFile .data (),
406+ F.getContext ().diagnose (DiagnosticInfoPGOProfile (DataFile .data (),
407407 " unable to parse external analysis results" ));
408408 return false ;
409409 }
@@ -452,7 +452,7 @@ bool AnalysisReader::runOnFunction(Function &F) {
452452 continue ;
453453 auto *DIExpr = DIEM->getExpression ();
454454 assert (DIVar && DIExpr && " Invalid memory location!" );
455- auto Var{buildVariable (* DWLang, *DIEM)};
455+ auto Var{buildVariable (DWLang, *DIEM)};
456456 if (!Var)
457457 continue ;
458458 LLVM_DEBUG (dbgs () << " [ANALYSIS READER]: update traits for a variable "
@@ -506,5 +506,5 @@ bool AnalysisReader::runOnFunction(Function &F) {
506506 DITrait.print (dbgs ()); dbgs () << " \n " );
507507 }
508508 }
509- return false ;
509+ return true ;
510510}
0 commit comments