Add CFG::BuildOptions class to pass in CFG builder options under on parameter.  Patch by Marcin Świderski!

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113898 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/AnalysisContext.cpp b/lib/Analysis/AnalysisContext.cpp
index bf9f967..188a6f8 100644
--- a/lib/Analysis/AnalysisContext.cpp
+++ b/lib/Analysis/AnalysisContext.cpp
@@ -59,7 +59,9 @@
     return getUnoptimizedCFG();
 
   if (!builtCFG) {
-    cfg = CFG::buildCFG(D, getBody(), &D->getASTContext(), true, AddEHEdges);
+    CFG::BuildOptions B;
+    B.AddEHEdges = AddEHEdges;
+    cfg = CFG::buildCFG(D, getBody(), &D->getASTContext(), B);
     // Even when the cfg is not successfully built, we don't
     // want to try building it again.
     builtCFG = true;
@@ -69,8 +71,10 @@
 
 CFG *AnalysisContext::getUnoptimizedCFG() {
   if (!builtCompleteCFG) {
-    completeCFG = CFG::buildCFG(D, getBody(), &D->getASTContext(),
-                                false, AddEHEdges);
+    CFG::BuildOptions B;
+    B.PruneTriviallyFalseEdges = false;
+    B.AddEHEdges = AddEHEdges;
+    completeCFG = CFG::buildCFG(D, getBody(), &D->getASTContext(), B);
     // Even when the cfg is not successfully built, we don't
     // want to try building it again.
     builtCompleteCFG = true;
diff --git a/lib/Analysis/CFG.cpp b/lib/Analysis/CFG.cpp
index 15699db..e297ec4 100644
--- a/lib/Analysis/CFG.cpp
+++ b/lib/Analysis/CFG.cpp
@@ -100,7 +100,7 @@
 
   // buildCFG - Used by external clients to construct the CFG.
   CFG* buildCFG(const Decl *D, Stmt *Statement, ASTContext *C,
-                bool pruneTriviallyFalseEdges, bool AddEHEdges);
+      CFG::BuildOptions BO);
 
 private:
   // Visitors to walk an AST and construct the CFG.
@@ -187,7 +187,7 @@
   /// TryEvaluateBool - Try and evaluate the Stmt and return 0 or 1
   /// if we can evaluate to a known value, otherwise return -1.
   TryResult TryEvaluateBool(Expr *S) {
-    if (!PruneTriviallyFalseEdges)
+    if (!BuildOpts.PruneTriviallyFalseEdges)
       return TryResult();
 
     Expr::EvalResult Result;
@@ -199,12 +199,7 @@
   }
 
   bool badCFG;
-
-  // True iff trivially false edges should be pruned from the CFG.
-  bool PruneTriviallyFalseEdges;
-
-  // True iff EH edges on CallExprs should be added to the CFG.
-  bool AddEHEdges;
+  CFG::BuildOptions BuildOpts;
 };
 
 // FIXME: Add support for dependent-sized array types in C++?
@@ -227,11 +222,7 @@
 ///  transferred to the caller.  If CFG construction fails, this method returns
 ///  NULL.
 CFG* CFGBuilder::buildCFG(const Decl *D, Stmt* Statement, ASTContext* C,
-                          bool pruneTriviallyFalseEdges,
-                          bool addehedges) {
-
-  AddEHEdges = addehedges;
-  PruneTriviallyFalseEdges = pruneTriviallyFalseEdges;
+    CFG::BuildOptions BO) {
 
   Context = C;
   assert(cfg.get());
@@ -239,6 +230,9 @@
     return NULL;
 
   badCFG = false;
+  BuildOpts = BO;
+  if (!C->getLangOptions().CPlusPlus)
+    BuildOpts.AddImplicitDtors = false;
 
   // Create an empty block that will serve as the exit block for the CFG.  Since
   // this is the first block added to the CFG, it will be implicitly registered
@@ -592,7 +586,7 @@
 
   // Languages without exceptions are assumed to not throw.
   if (Context->getLangOptions().Exceptions) {
-    if (AddEHEdges)
+    if (BuildOpts.AddEHEdges)
       AddEHEdge = true;
   }
 
@@ -1810,11 +1804,9 @@
 /// buildCFG - Constructs a CFG from an AST.  Ownership of the returned
 ///  CFG is returned to the caller.
 CFG* CFG::buildCFG(const Decl *D, Stmt* Statement, ASTContext *C,
-                   bool PruneTriviallyFalse,
-                   bool AddEHEdges) {
+    BuildOptions BO) {
   CFGBuilder Builder;
-  return Builder.buildCFG(D, Statement, C, PruneTriviallyFalse,
-                          AddEHEdges);
+  return Builder.buildCFG(D, Statement, C, BO);
 }
 
 //===----------------------------------------------------------------------===//