]> granicus.if.org Git - clang/commitdiff
Make -analyzer-inline-call not a separate analysis. Instead it's a boolean
authorZhongxing Xu <xuzhongxing@gmail.com>
Thu, 6 May 2010 02:59:29 +0000 (02:59 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Thu, 6 May 2010 02:59:29 +0000 (02:59 +0000)
flag now, and can be used with other analyses. Only turned it on for C++
methods for now.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@103160 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Checker/PathSensitive/AnalysisManager.h
include/clang/Driver/CC1Options.td
include/clang/Frontend/AnalysisConsumer.h
lib/Checker/GRCXXExprEngine.cpp
lib/Frontend/AnalysisConsumer.cpp
lib/Frontend/CompilerInvocation.cpp
test/Analysis/method-call.cpp

index 0c59d7b572a40098a81d0239106e7fe2338b4290..9194f4589908ab0daa9871cf8c13859dd1a7b458 100644 (file)
@@ -52,19 +52,21 @@ class AnalysisManager : public BugReporterData {
   //   bifurcates paths.
   bool EagerlyAssume;
   bool TrimGraph;
+  bool InlineCall;
 
 public:
   AnalysisManager(ASTContext &ctx, Diagnostic &diags, 
                   const LangOptions &lang, PathDiagnosticClient *pd,
                   StoreManagerCreator storemgr,
                   ConstraintManagerCreator constraintmgr, unsigned maxnodes,
-                  bool vizdot, bool vizubi, bool purge, bool eager, bool trim)
+                  bool vizdot, bool vizubi, bool purge, bool eager, bool trim,
+                  bool inlinecall)
 
     : Ctx(ctx), Diags(diags), LangInfo(lang), PD(pd),
       CreateStoreMgr(storemgr), CreateConstraintMgr(constraintmgr),
       AScope(ScopeDecl), MaxNodes(maxnodes),
       VisualizeEGDot(vizdot), VisualizeEGUbi(vizubi), PurgeDead(purge),
-      EagerlyAssume(eager), TrimGraph(trim) {}
+      EagerlyAssume(eager), TrimGraph(trim), InlineCall(inlinecall) {}
   
   ~AnalysisManager() { FlushDiagnostics(); }
   
@@ -122,6 +124,8 @@ public:
 
   bool shouldEagerlyAssume() const { return EagerlyAssume; }
 
+  bool shouldInlineCall() const { return InlineCall; }
+
   CFG *getCFG(Decl const *D) {
     return AnaCtxMgr.getContext(D)->getCFG();
   }
index 8e8eacb9c31ad931483b4b2f69aac1cb1a57821c..9ac6ad39ebf0145be8de7e0962f5a158ae76f9fb 100644 (file)
@@ -56,8 +56,6 @@ def analysis_ObjCMemChecker : Flag<"-analyzer-check-objc-mem">,
   HelpText<"Run the [Core] Foundation reference count checker">;
 def analysis_WarnSizeofPointer : Flag<"-warn-sizeof-pointer">,
   HelpText<"Warn about unintended use of sizeof() on pointer expressions">;
-def analysis_InlineCall : Flag<"-inline-call">,
-  HelpText<"Experimental transfer function inlining callees when its definition is available.">;
 
 def analyzer_store : Separate<"-analyzer-store">,
   HelpText<"Source Code Analysis - Abstract Memory Store Models">;
@@ -97,6 +95,8 @@ def analyzer_viz_egraph_graphviz : Flag<"-analyzer-viz-egraph-graphviz">,
   HelpText<"Display exploded graph using GraphViz">;
 def analyzer_viz_egraph_ubigraph : Flag<"-analyzer-viz-egraph-ubigraph">,
   HelpText<"Display exploded graph using Ubigraph">;
+def analyzer_inline_call : Flag<"-analyzer-inline-call">,
+  HelpText<"Experimental transfer function inlining callees when its definition is available.">;
 def analyzer_max_nodes : Separate<"-analyzer-max-nodes">,
   HelpText<"The maximum number of nodes the analyzer can generate">;
 
index 3341bb01f0fa83cc3ebdd4d9d13bbe742bc6b6a2..5dd80142eedb2ccebcf48c6d05197f4ba976e15a 100644 (file)
@@ -71,6 +71,8 @@ public:
   unsigned VisualizeEGUbi : 1;
   unsigned EnableExperimentalChecks : 1;
   unsigned EnableExperimentalInternalChecks : 1;
+  unsigned InlineCall : 1;
+
 public:
   AnalyzerOptions() {
     AnalysisStoreOpt = BasicStoreModel;
index 00ac995592828cd02d442040b4becdbf3979a687..18e112cc8d36be5311e6dae6fd88ac8c4d97bbbe 100644 (file)
@@ -86,7 +86,7 @@ void GRExprEngine::VisitCXXConstructExpr(const CXXConstructExpr *E, SVal Dest,
   const CXXConstructorDecl *CD = E->getConstructor();
   assert(CD);
 
-  if (!CD->isThisDeclarationADefinition())
+  if (!(CD->isThisDeclarationADefinition() && AMgr.shouldInlineCall()))
     // FIXME: invalidate the object.
     return;
 
@@ -147,7 +147,7 @@ void GRExprEngine::VisitCXXMemberCallExpr(const CXXMemberCallExpr *MCE,
   const CXXMethodDecl *MD = cast<CXXMethodDecl>(ME->getMemberDecl());
   assert(MD && "not a CXXMethodDecl?");
 
-  if (!MD->isThisDeclarationADefinition())
+  if (!(MD->isThisDeclarationADefinition() && AMgr.shouldInlineCall()))
     // FIXME: conservative method call evaluation.
     return;
 
index 87c3fca24962221fe2131f0374ce1d0ed884fb52..df74eadaa0a4f478cfb16b45bc1b64f2af4a5024 100644 (file)
@@ -177,7 +177,7 @@ public:
                                   Opts.MaxNodes,
                                   Opts.VisualizeEGDot, Opts.VisualizeEGUbi,
                                   Opts.PurgeDead, Opts.EagerlyAssume,
-                                  Opts.TrimGraph));
+                                  Opts.TrimGraph, Opts.InlineCall));
   }
 
   virtual void HandleTranslationUnit(ASTContext &C);
index e1275c16fe926d067875a1cb5058b77d40e37da7..92f33d01be0f0d06864d400841dbfd32dfc30a6b 100644 (file)
@@ -797,6 +797,7 @@ static void ParseAnalyzerArgs(AnalyzerOptions &Opts, ArgList &Args,
     Args.hasArg(OPT_analyzer_experimental_internal_checks);
   Opts.TrimGraph = Args.hasArg(OPT_trim_egraph);
   Opts.MaxNodes = getLastArgIntValue(Args, OPT_analyzer_max_nodes,150000,Diags);
+  Opts.InlineCall = Args.hasArg(OPT_analyzer_inline_call);
 }
 
 static void ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args,
index dd891596c5dc7b4f310c678ee3b37fac4f10364c..47f14447d6bd0630fc31de99d4a02009925efa33 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-store region -verify %s
+// RUN: %clang_cc1 -analyze -analyzer-check-objc-mem -analyzer-inline-call -analyzer-store region -verify %s
 struct A {
   int x;
   A(int a) { x = a; }