[cfe-commits] r157762 - /cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
Anna Zaks
ganna at apple.com
Thu May 31 11:45:56 PDT 2012
On May 31, 2012, at 11:35 AM, David Blaikie wrote:
>
>
> On Thu, May 31, 2012 at 11:07 AM, Anna Zaks <ganna at apple.com> wrote:
> Author: zaks
> Date: Thu May 31 13:07:55 2012
> New Revision: 157762
>
> URL: http://llvm.org/viewvc/llvm-project?rev=157762&view=rev
> Log:
> [analyzer] Cleanup for r157721.
> We should lock the number of elements after the initial parsing is
> complete. Recursive AST visitors in AnalyzesConsumer and CallGarph can
> trigger lazy pch deserialization resulting in more calls to
> HandleTopLevelDecl and appending to the LocalTUDecls list. We should
> ignore those.
>
> Is it only a perf impact to visit them unnecessarily? or could this affect (in)correctness as well? (in the latter case, a test case might be nice, if it's practical to write one)
>
Performance issue. Very tricky to write a test case.
> Thanks!
> - David
>
>
> Modified:
> cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp?rev=157762&r1=157761&r2=157762&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp Thu May 31 13:07:55 2012
> @@ -230,7 +230,7 @@
>
> /// \brief Build the call graph for all the top level decls of this TU and
> /// use it to define the order in which the functions should be visited.
> - void HandleDeclsGallGraph();
> + void HandleDeclsGallGraph(const unsigned LocalTUDeclsSize);
>
> /// \brief Run analyzes(syntax or path sensitive) on the given function.
> /// \param Mode - determines if we are requesting syntax only or path
> @@ -311,18 +311,16 @@
> }
> }
>
> -void AnalysisConsumer::HandleDeclsGallGraph() {
> +void AnalysisConsumer::HandleDeclsGallGraph(const unsigned LocalTUDeclsSize) {
> // Otherwise, use the Callgraph to derive the order.
> // Build the Call Graph.
> CallGraph CG;
>
> // Add all the top level declarations to the graph.
> - // Note: TraverseDecl may modify LocalTUDecls, but only by appending more
> - // entries. Thus we don't use an iterator, but rely on LocalTUDecls
> - // random access. By doing so, we automatically compensate for iterators
> - // possibly being invalidated, although this is a bit slower.
> - const unsigned n = LocalTUDecls.size();
> - for (unsigned i = 0 ; i < n ; ++i) {
> + // Note: CallGraph can trigger deserialization of more items from a pch
> + // (though HandleInterestingDecl); triggering additions to LocalTUDecls.
> + // We rely on random access to add the initially processed Decls to CG.
> + for (unsigned i = 0 ; i < LocalTUDeclsSize ; ++i) {
> CG.addToCallGraph(LocalTUDecls[i]);
> }
>
> @@ -414,13 +412,13 @@
> // entries. Thus we don't use an iterator, but rely on LocalTUDecls
> // random access. By doing so, we automatically compensate for iterators
> // possibly being invalidated, although this is a bit slower.
> - const unsigned n = LocalTUDecls.size();
> - for (unsigned i = 0 ; i < n ; ++i) {
> + const unsigned LocalTUDeclsSize = LocalTUDecls.size();
> + for (unsigned i = 0 ; i < LocalTUDeclsSize ; ++i) {
> TraverseDecl(LocalTUDecls[i]);
> }
>
> if (Mgr->shouldInlineCall())
> - HandleDeclsGallGraph();
> + HandleDeclsGallGraph(LocalTUDeclsSize);
>
> // After all decls handled, run checkers on the entire TranslationUnit.
> checkerMgr->runCheckersOnEndOfTranslationUnit(TU, *Mgr, BR);
>
>
> _______________________________________________
> 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/20120531/f02f2c35/attachment.html>
More information about the cfe-commits
mailing list