diff options
| author | Ted Kremenek <kremenek@apple.com> | 2008-04-29 05:13:59 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2008-04-29 05:13:59 +0000 |
| commit | 4d1f422c6feb23a0f7c1f78eff7b5da5001d69ff (patch) | |
| tree | 00115908477c2cecc934b9725d5447afd3f6cd41 /clang/Driver | |
| parent | e331a65c794c93b7c7792b7ba08ab6069b9c086d (diff) | |
| download | bcm5719-llvm-4d1f422c6feb23a0f7c1f78eff7b5da5001d69ff.tar.gz bcm5719-llvm-4d1f422c6feb23a0f7c1f78eff7b5da5001d69ff.zip | |
Provide the option to run the CF-retain checker in GC enabled mode.
The transfer functions for the checker don't do anything special yet in GC mode.
llvm-svn: 50394
Diffstat (limited to 'clang/Driver')
| -rw-r--r-- | clang/Driver/ASTConsumers.cpp | 71 | ||||
| -rw-r--r-- | clang/Driver/ASTConsumers.h | 1 | ||||
| -rw-r--r-- | clang/Driver/clang.cpp | 3 |
3 files changed, 51 insertions, 24 deletions
diff --git a/clang/Driver/ASTConsumers.cpp b/clang/Driver/ASTConsumers.cpp index 2f04ab78d4f..c01e4edb0d1 100644 --- a/clang/Driver/ASTConsumers.cpp +++ b/clang/Driver/ASTConsumers.cpp @@ -690,7 +690,7 @@ public: virtual bool printFuncDeclStart() { return false; } virtual const char* getCheckerName() = 0; - virtual GRTransferFuncs* getTransferFunctions() = 0; + virtual void getTransferFunctions(std::vector<GRTransferFuncs*>& TFs) = 0; }; } // end anonymous namespace @@ -732,22 +732,30 @@ void CheckerConsumer::VisitCFG(CFG& C, Decl& CD) { else llvm::cerr << '\n'; - // Construct the analysis engine. - GRExprEngine Eng(C, CD, *Ctx); + std::vector<GRTransferFuncs*> TFs; + getTransferFunctions(TFs); - // Set base transfer functions. - llvm::OwningPtr<GRTransferFuncs> TF(getTransferFunctions()); - Eng.setTransferFunctions(TF.get()); - - // Execute the worklist algorithm. - Eng.ExecuteWorkList(); - - // Display warnings. - Eng.EmitWarnings(Diags, PD.get()); - -#ifndef NDEBUG - if (Visualize) Eng.ViewGraph(TrimGraph); -#endif + while (!TFs.empty()) { + + // Construct the analysis engine. + GRExprEngine Eng(C, CD, *Ctx); + + // Set base transfer functions. + llvm::OwningPtr<GRTransferFuncs> TF(TFs.back()); + TFs.pop_back(); + + Eng.setTransferFunctions(TF.get()); + + // Execute the worklist algorithm. + Eng.ExecuteWorkList(); + + // Display warnings. + Eng.EmitWarnings(Diags, PD.get()); + + #ifndef NDEBUG + if (Visualize) Eng.ViewGraph(TrimGraph); + #endif + } } //===----------------------------------------------------------------------===// @@ -765,8 +773,8 @@ public: virtual const char* getCheckerName() { return "GRSimpleVals"; } - virtual GRTransferFuncs* getTransferFunctions() { - return MakeGRSimpleValsTF(); + virtual void getTransferFunctions(std::vector<GRTransferFuncs*>& TFs) { + return TFs.push_back(MakeGRSimpleValsTF()); } }; } // end anonymous namespace @@ -789,19 +797,34 @@ ASTConsumer* clang::CreateGRSimpleVals(Diagnostic &Diags, namespace { class CFRefCountCheckerVisitor : public CheckerConsumer { + const LangOptions& LangOpts; public: CFRefCountCheckerVisitor(Diagnostic &diags, Preprocessor* pp, PreprocessorFactory* ppf, + const LangOptions& lopts, const std::string& fname, const std::string& htmldir, bool visualize, bool trim, bool analyzeAll) : CheckerConsumer(diags, pp, ppf, fname, htmldir, visualize, - trim, analyzeAll) {} + trim, analyzeAll), LangOpts(lopts) {} virtual const char* getCheckerName() { return "CFRefCountChecker"; } - virtual GRTransferFuncs* getTransferFunctions() { - return MakeCFRefCountTF(*Ctx); + virtual void getTransferFunctions(std::vector<GRTransferFuncs*>& TFs) { + switch (LangOpts.getGCMode()) { + case LangOptions::NonGC: + TFs.push_back(MakeCFRefCountTF(*Ctx, false)); + break; + + case LangOptions::GCOnly: + TFs.push_back(MakeCFRefCountTF(*Ctx, true)); + break; + + case LangOptions::HybridGC: + TFs.push_back(MakeCFRefCountTF(*Ctx, false)); + TFs.push_back(MakeCFRefCountTF(*Ctx, true)); + break; + } } }; } // end anonymous namespace @@ -809,13 +832,15 @@ public: ASTConsumer* clang::CreateCFRefChecker(Diagnostic &Diags, Preprocessor* PP, PreprocessorFactory* PPF, + const LangOptions& LangOpts, const std::string& FunctionName, const std::string& HTMLDir, bool Visualize, bool TrimGraph, bool AnalyzeAll) { - return new CFRefCountCheckerVisitor(Diags, PP, PPF, FunctionName, HTMLDir, - Visualize, TrimGraph, AnalyzeAll); + return new CFRefCountCheckerVisitor(Diags, PP, PPF, LangOpts, FunctionName, + HTMLDir, Visualize, TrimGraph, + AnalyzeAll); } //===----------------------------------------------------------------------===// diff --git a/clang/Driver/ASTConsumers.h b/clang/Driver/ASTConsumers.h index 7ef42a07075..7037ade1ddf 100644 --- a/clang/Driver/ASTConsumers.h +++ b/clang/Driver/ASTConsumers.h @@ -53,6 +53,7 @@ ASTConsumer *CreateGRSimpleVals(Diagnostic &Diags, ASTConsumer *CreateCFRefChecker(Diagnostic &Diags, Preprocessor* PP, PreprocessorFactory* PPF, + const LangOptions& LangOpts, const std::string& Function, const std::string& HTMLDir, bool Visualize, bool TrimGraph, bool AnalyzeAll); diff --git a/clang/Driver/clang.cpp b/clang/Driver/clang.cpp index 0b9841687b6..62f570f6277 100644 --- a/clang/Driver/clang.cpp +++ b/clang/Driver/clang.cpp @@ -1132,7 +1132,8 @@ static ASTConsumer* CreateASTConsumer(const std::string& InFile, OutputFile, VisualizeEG, TrimGraph, AnalyzeAll); case CheckerCFRef: - return CreateCFRefChecker(Diag, PP, PPF, AnalyzeSpecificFunction, + return CreateCFRefChecker(Diag, PP, PPF, LangOpts, + AnalyzeSpecificFunction, OutputFile, VisualizeEG, TrimGraph, AnalyzeAll); case TestSerialization: |

