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
diff --git a/Driver/AnalysisConsumer.cpp b/Driver/AnalysisConsumer.cpp
index 11fb4a9..57be0ff 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 @@
     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 @@
     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 @@
                            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 @@
         C->addCodeAction(&ActionUninitVals);
         break;
         
+      case CheckerCFRef:
+        C->addCodeAction(&ActionRefLeakChecker);
+        break;
+        
       default: break;
     }