a.sidorin created this revision. a.sidorin added reviewers: zaks.anna, xazax.hun, dcoughlin. a.sidorin added a subscriber: cfe-commits. a.sidorin set the repository for this revision to rL LLVM.
Due to redeclarations, the function may have different declarations used in CallExpr and in the definition. However, we need to use a unique declaration for both store and lookup in VisitedCallees. This patch fixes issues with analysis in topological order. A simple test is included. Repository: rL LLVM http://reviews.llvm.org/D15410 Files: lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp test/Analysis/inlining/analysis-order.c Index: test/Analysis/inlining/analysis-order.c =================================================================== --- /dev/null +++ test/Analysis/inlining/analysis-order.c @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -analyze -analyzer-checker=core.builtin.NoReturnFunctions -analyzer-display-progress %s 2>&1 | FileCheck %s + +// Do not analyze test1() again because it was inlined +void test1(); + +void test2() { + test1(); +} + +void test1() { +} + +// CHECK: analysis-order.c test2 +// CHECK: analysis-order.c test1 +// CHECK: analysis-order.c test2 Index: lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp =================================================================== --- lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp +++ lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp @@ -483,7 +483,7 @@ // Skip the functions which have been processed already or previously // inlined. - if (shouldSkipFunction(D, Visited, VisitedAsTopLevel)) + if (shouldSkipFunction(D->getCanonicalDecl(), Visited, VisitedAsTopLevel)) continue; // Analyze the function. Index: lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp =================================================================== --- lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp +++ lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp @@ -462,7 +462,7 @@ // Mark the decl as visited. if (VisitedCallees) - VisitedCallees->insert(D); + VisitedCallees->insert(D->getCanonicalDecl()); return true; }
Index: test/Analysis/inlining/analysis-order.c =================================================================== --- /dev/null +++ test/Analysis/inlining/analysis-order.c @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -analyze -analyzer-checker=core.builtin.NoReturnFunctions -analyzer-display-progress %s 2>&1 | FileCheck %s + +// Do not analyze test1() again because it was inlined +void test1(); + +void test2() { + test1(); +} + +void test1() { +} + +// CHECK: analysis-order.c test2 +// CHECK: analysis-order.c test1 +// CHECK: analysis-order.c test2 Index: lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp =================================================================== --- lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp +++ lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp @@ -483,7 +483,7 @@ // Skip the functions which have been processed already or previously // inlined. - if (shouldSkipFunction(D, Visited, VisitedAsTopLevel)) + if (shouldSkipFunction(D->getCanonicalDecl(), Visited, VisitedAsTopLevel)) continue; // Analyze the function. Index: lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp =================================================================== --- lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp +++ lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp @@ -462,7 +462,7 @@ // Mark the decl as visited. if (VisitedCallees) - VisitedCallees->insert(D); + VisitedCallees->insert(D->getCanonicalDecl()); return true; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits