[cfe-commits] r161916 - in /cfe/trunk: lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp test/Analysis/inlining/dyn-dispatch-bifurcate.cpp

Anna Zaks ganna at apple.com
Tue Aug 14 23:40:59 PDT 2012


On Aug 14, 2012, at 5:52 PM, Jordan Rose wrote:

> Author: jrose
> Date: Tue Aug 14 19:52:00 2012
> New Revision: 161916
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=161916&view=rev
> Log:
> [analyzer] Don't inline dynamic-dispatch methods unless -analyzer-ipa=dynamic.
> 
> Previously we were checking -analyzer-ipa=dynamic-bifurcate only, and
> unconditionally inlining everything else that had an available definition,
> even under -analyzer-ipa=inlining (but not under -analyzer-ipa=none).
> 

We were not inlining ObjC unless dynamic dispatch or dynamic dispatch bifurcate is turned on due to this check in ExprEngine::inlineCall. It's just not wired for C++.
  case CE_ObjCMessage:
    if (!(getAnalysisManager().IPAMode == DynamicDispatch ||
          getAnalysisManager().IPAMode == DynamicDispatchBifurcate))
      return false;

That said, I think checking the flag earlier is better especially since we'll be handing more languages now.

Anna.
> Added:
>    cfe/trunk/test/Analysis/inlining/dyn-dispatch-bifurcate.cpp
> Modified:
>    cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp?rev=161916&r1=161915&r2=161916&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp Tue Aug 14 19:52:00 2012
> @@ -555,12 +555,18 @@
>     RuntimeDefinition RD = Call->getRuntimeDefinition();
>     const Decl *D = RD.getDecl();
>     if (D) {
> -      // Explore with and without inlining the call.
> -      if (RD.mayHaveOtherDefinitions() &&
> -          getAnalysisManager().IPAMode == DynamicDispatchBifurcate) {
> -        BifurcateCall(RD.getDispatchRegion(), *Call, D, Bldr, Pred);
> -        return;
> +      if (RD.mayHaveOtherDefinitions()) {
> +        // Explore with and without inlining the call.
> +        if (getAnalysisManager().IPAMode == DynamicDispatchBifurcate) {
> +          BifurcateCall(RD.getDispatchRegion(), *Call, D, Bldr, Pred);
> +          return;
> +        }
> +
> +        // Don't inline if we're not in any dynamic dispatch mode.
> +        if (getAnalysisManager().IPAMode != DynamicDispatch)
> +          return;
>       }
> +
>       // We are not bifurcating and we do have a Decl, so just inline.
>       if (inlineCall(*Call, D, Bldr, Pred, State))
>         return;
> @@ -575,6 +581,7 @@
>                                const CallEvent &Call, const Decl *D,
>                                NodeBuilder &Bldr, ExplodedNode *Pred) {
>   assert(BifurReg);
> +  BifurReg = BifurReg->StripCasts();
> 
>   // Check if we've performed the split already - note, we only want
>   // to split the path once per memory region.
> 
> Added: cfe/trunk/test/Analysis/inlining/dyn-dispatch-bifurcate.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/inlining/dyn-dispatch-bifurcate.cpp?rev=161916&view=auto
> ==============================================================================
> --- cfe/trunk/test/Analysis/inlining/dyn-dispatch-bifurcate.cpp (added)
> +++ cfe/trunk/test/Analysis/inlining/dyn-dispatch-bifurcate.cpp Tue Aug 14 19:52:00 2012
> @@ -0,0 +1,17 @@
> +// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-ipa=dynamic-bifurcate -verify %s
> +
> +void clang_analyzer_eval(bool);
> +
> +class A {
> +public:
> +  virtual int get() { return 0; }
> +};
> +
> +void testBifurcation(A *a) {
> +  clang_analyzer_eval(a->get() == 0); // expected-warning{{TRUE}} expected-warning{{UNKNOWN}}
> +}
> +
> +void testKnown() {
> +  A a;
> +  clang_analyzer_eval(a.get() == 0); // expected-warning{{TRUE}}
> +}
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20120814/f2a4cab3/attachment.html>


More information about the cfe-commits mailing list