aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-07-02 00:44:58 +0000
committerTed Kremenek <kremenek@apple.com>2008-07-02 00:44:58 +0000
commitb35a74a40c1d2656a25e560e773ed48bdf49f9c0 (patch)
tree4c8b1bcbaf8cf8a0f39a1ecac0becb5448c03af0
parentd478a5b83ca791fe9a6a945762bb2053ac4c9f26 (diff)
Migrated driver logic for running the CF retain/release checker over to the new AnalysisConsumer interface.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53002 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--Driver/ASTConsumers.cpp52
-rw-r--r--Driver/ASTConsumers.h7
-rw-r--r--Driver/AnalysisConsumer.cpp58
-rw-r--r--Driver/AnalysisConsumer.h3
-rw-r--r--Driver/clang.cpp10
5 files changed, 62 insertions, 68 deletions
diff --git a/Driver/ASTConsumers.cpp b/Driver/ASTConsumers.cpp
index dbdce45d1c..9ff0387702 100644
--- a/Driver/ASTConsumers.cpp
+++ b/Driver/ASTConsumers.cpp
@@ -765,58 +765,6 @@ ASTConsumer* clang::CreateGRSimpleVals(Diagnostic &Diags,
Visualize, TrimGraph, AnalyzeAll);
}
-
-//===----------------------------------------------------------------------===//
-// Core Foundation Reference Counting Checker
-
-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), LangOpts(lopts) {}
-
- virtual const char* getCheckerName() { return "CFRefCountChecker"; }
-
- virtual void getTransferFunctions(std::vector<GRTransferFuncs*>& TFs) {
- switch (LangOpts.getGCMode()) {
- case LangOptions::NonGC:
- TFs.push_back(MakeCFRefCountTF(*Ctx, false, true, LangOpts));
- break;
-
- case LangOptions::GCOnly:
- TFs.push_back(MakeCFRefCountTF(*Ctx, true, true, LangOpts));
- break;
-
- case LangOptions::HybridGC:
- TFs.push_back(MakeCFRefCountTF(*Ctx, false, true, LangOpts));
- TFs.push_back(MakeCFRefCountTF(*Ctx, true, false, LangOpts));
- break;
- }
- }
-};
-} // end anonymous namespace
-
-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, LangOpts, FunctionName,
- HTMLDir, Visualize, TrimGraph,
- AnalyzeAll);
-}
-
//===----------------------------------------------------------------------===//
// AST Serializer
diff --git a/Driver/ASTConsumers.h b/Driver/ASTConsumers.h
index 5853664832..c19a1afa5c 100644
--- a/Driver/ASTConsumers.h
+++ b/Driver/ASTConsumers.h
@@ -45,13 +45,6 @@ ASTConsumer *CreateGRSimpleVals(Diagnostic &Diags,
const std::string& Function,
const std::string& HTMLDir, bool Visualize,
bool TrimGraph, bool AnalyzeAll);
-
-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);
ASTConsumer *CreateCodeRewriterTest(const std::string& InFile,
const std::string& OutFile,
diff --git a/Driver/AnalysisConsumer.cpp b/Driver/AnalysisConsumer.cpp
index 11fb4a95c1..57be0ff55d 100644
--- a/Driver/AnalysisConsumer.cpp
+++ b/Driver/AnalysisConsumer.cpp
@@ -12,6 +12,7 @@
//===----------------------------------------------------------------------===//
#include "ASTConsumers.h"
+#include "HTMLDiagnostics.h"
#include "clang/AST/ASTConsumer.h"
#include "clang/AST/Decl.h"
#include "clang/AST/DeclObjC.h"
@@ -104,6 +105,7 @@ namespace {
llvm::OwningPtr<CFG> cfg;
llvm::OwningPtr<LiveVariables> liveness;
llvm::OwningPtr<ParentMap> PM;
+ llvm::OwningPtr<PathDiagnosticClient> PD;
public:
AnalysisManager(AnalysisConsumer& c, Decl* d, Stmt* b)
@@ -130,6 +132,17 @@ namespace {
Diagnostic& getDiagnostic() {
return C.Diags;
}
+
+ const LangOptions& getLangOptions() const {
+ return C.LOpts;
+ }
+
+ PathDiagnosticClient* getPathDiagnosticClient() {
+ if (PD.get() == 0 && !C.HTMLDir.empty())
+ PD.reset(CreateHTMLDiagnosticClient(C.HTMLDir, C.PP, C.PPF));
+
+ return PD.get();
+ }
LiveVariables* getLiveVariables() {
if (!liveness) liveness.reset(new LiveVariables(*getCFG()));
@@ -213,6 +226,47 @@ static void ActionUninitVals(AnalysisManager& mgr) {
mgr.getDiagnostic());
}
+
+static void ActionRefLeakCheckerAux(AnalysisManager& mgr, bool GCEnabled,
+ bool StandardWarnings) {
+
+ // Construct the analysis engine.
+ GRExprEngine Eng(*mgr.getCFG(), *mgr.getCodeDecl(), mgr.getContext());
+
+ // Construct the transfer function object.
+ llvm::OwningPtr<GRTransferFuncs>
+ TF(MakeCFRefCountTF(mgr.getContext(), GCEnabled, StandardWarnings,
+ mgr.getLangOptions()));
+
+ Eng.setTransferFunctions(TF.get());
+
+ // Execute the worklist algorithm.
+ Eng.ExecuteWorkList();
+
+ // Display warnings.
+ Eng.EmitWarnings(mgr.getDiagnostic(), mgr.getPathDiagnosticClient());
+}
+
+static void ActionRefLeakChecker(AnalysisManager& mgr) {
+
+ switch (mgr.getLangOptions().getGCMode()) {
+ default:
+ assert (false && "Invalid GC mode.");
+ case LangOptions::NonGC:
+ ActionRefLeakCheckerAux(mgr, false, true);
+ break;
+
+ case LangOptions::GCOnly:
+ ActionRefLeakCheckerAux(mgr, true, true);
+ break;
+
+ case LangOptions::HybridGC:
+ ActionRefLeakCheckerAux(mgr, false, true);
+ ActionRefLeakCheckerAux(mgr, true, false);
+ break;
+ }
+}
+
//===----------------------------------------------------------------------===//
// AnalysisConsumer creation.
//===----------------------------------------------------------------------===//
@@ -240,6 +294,10 @@ ASTConsumer* clang::CreateAnalysisConsumer(Analyses* Beg, Analyses* End,
C->addCodeAction(&ActionUninitVals);
break;
+ case CheckerCFRef:
+ C->addCodeAction(&ActionRefLeakChecker);
+ break;
+
default: break;
}
diff --git a/Driver/AnalysisConsumer.h b/Driver/AnalysisConsumer.h
index 3a2f3b9437..8514a9b531 100644
--- a/Driver/AnalysisConsumer.h
+++ b/Driver/AnalysisConsumer.h
@@ -18,7 +18,8 @@ namespace clang {
enum Analyses {
WarnDeadStores,
- WarnUninitVals
+ WarnUninitVals,
+ CheckerCFRef
};
ASTConsumer* CreateAnalysisConsumer(Analyses* Beg, Analyses* End,
diff --git a/Driver/clang.cpp b/Driver/clang.cpp
index eddaca3a88..344fe08bff 100644
--- a/Driver/clang.cpp
+++ b/Driver/clang.cpp
@@ -77,7 +77,6 @@ enum ProgActions {
AnalysisLiveVariables, // Print results of live-variable analysis.
AnalysisGRSimpleVals, // Perform graph-reachability constant prop.
AnalysisGRSimpleValsView, // Visualize results of path-sens. analysis.
- CheckerCFRef, // Run the Core Foundation Ref. Count Checker.
TestSerialization, // Run experimental serialization code.
ParsePrintCallbacks, // Parse and print each callback.
ParseSyntaxOnly, // Parse and perform semantic analysis.
@@ -120,8 +119,6 @@ ProgAction(llvm::cl::desc("Choose output type:"), llvm::cl::ZeroOrMore,
"Print results of live variable analysis"),
clEnumValN(AnalysisGRSimpleVals, "checker-simple",
"Perform path-sensitive constant propagation"),
- clEnumValN(CheckerCFRef, "checker-cfref",
- "Run the Core Foundation reference count checker"),
clEnumValN(TestSerialization, "test-pickling",
"Run prototype serialization code"),
clEnumValN(EmitLLVM, "emit-llvm",
@@ -182,6 +179,8 @@ clEnumValN(WarnDeadStores, "warn-dead-stores",
"Flag warnings of stores to dead variables"),
clEnumValN(WarnUninitVals, "warn-uninit-values",
"Flag warnings of uses of unitialized variables"),
+clEnumValN(CheckerCFRef, "checker-cfref",
+ "Run the [Core] Foundation reference count checker"),
clEnumValEnd));
//===----------------------------------------------------------------------===//
@@ -1206,11 +1205,6 @@ static ASTConsumer* CreateASTConsumer(const std::string& InFile,
return CreateGRSimpleVals(Diag, PP, PPF, AnalyzeSpecificFunction,
OutputFile, VisualizeEG, TrimGraph, AnalyzeAll);
- case CheckerCFRef:
- return CreateCFRefChecker(Diag, PP, PPF, LangOpts,
- AnalyzeSpecificFunction,
- OutputFile, VisualizeEG, TrimGraph, AnalyzeAll);
-
case TestSerialization:
return CreateSerializationTest(Diag, FileMgr);