On Mon, Oct 31, 2016 at 3:12 PM, Argyrios Kyrtzidis via cfe-commits < cfe-commits@lists.llvm.org> wrote:
> Author: akirtzidis > Date: Mon Oct 31 17:12:12 2016 > New Revision: 285647 > > URL: http://llvm.org/viewvc/llvm-project?rev=285647&view=rev > Log: > [index] Fix repeated visitation of the same InitListExpr for indexing. > > It was visited multiple times unnecessarily. > > rdar://28985038 > > Added: > cfe/trunk/test/Index/Core/designated-inits.c > Modified: > cfe/trunk/lib/Index/IndexBody.cpp > > Modified: cfe/trunk/lib/Index/IndexBody.cpp > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/ > IndexBody.cpp?rev=285647&r1=285646&r2=285647&view=diff > ============================================================ > ================== > --- cfe/trunk/lib/Index/IndexBody.cpp (original) > +++ cfe/trunk/lib/Index/IndexBody.cpp Mon Oct 31 17:12:12 2016 > @@ -300,6 +300,7 @@ public: > IndexingContext &IndexCtx; > const NamedDecl *Parent; > const DeclContext *ParentDC; > + bool Visited = false; > > public: > SyntacticFormIndexer(IndexingContext &indexCtx, > Do we need SyntacticFromIndexer to be a RecursiveASTVisitor at all? It looks like you would get the desired effect by simply walking the elements of the syntactic form looking for DesignatedInitExprs (which will always be at the top level of the InitListExpr's element if they exist). Right now, it looks like you still traverse expression E twice in cases like this: int arr[] = { [0] = 0, E }; ... and you'd still get a quadratic traversal for a case like { [0] = {}, { [0] = {}, { [0] = {}, ... } } }. > @@ -308,6 +309,22 @@ public: > > bool shouldWalkTypesOfTypeLocs() const { return false; } > > + bool TraverseInitListExpr(InitListExpr *S, DataRecursionQueue *Q = > nullptr) { > + // Don't visit nested InitListExprs, this visitor will be called > again > + // later on for the nested ones. > + if (Visited) > + return true; > + Visited = true; > + InitListExpr *SyntaxForm = S->isSemanticForm() ? > S->getSyntacticForm() : S; > + if (SyntaxForm) { > + for (Stmt *SubStmt : SyntaxForm->children()) { > + if (!TraverseStmt(SubStmt, Q)) > + return false; > + } > + } > + return true; > + } > + > bool VisitDesignatedInitExpr(DesignatedInitExpr *E) { > for (DesignatedInitExpr::Designator &D : > llvm::reverse(E->designators())) { > if (D.isFieldDesignator()) > > Added: cfe/trunk/test/Index/Core/designated-inits.c > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/ > Core/designated-inits.c?rev=285647&view=auto > ============================================================ > ================== > --- cfe/trunk/test/Index/Core/designated-inits.c (added) > +++ cfe/trunk/test/Index/Core/designated-inits.c Mon Oct 31 17:12:12 2016 > @@ -0,0 +1,33 @@ > +// RUN: c-index-test core -print-source-symbols -- %s -target > x86_64-apple-macosx10.7 | FileCheck %s > + > +struct MyStruct { > + int myfield; > +}; > + > +enum { > + MyValToSet; > +}; > + > +// CHECK: [[@LINE+1]]:14 | struct/C | MyStruct | > +const struct MyStruct _MyStruct[] > + [16] > + [3] > + [3] > + [2] > + [2] = { > + [0] = { > + [0] = { > + [0] = { > + [0][0] = { > + [0] = { > + // CHECK: [[@LINE+2]]:14 | field/C | myfield | {{.*}} | Ref | > + // CHECK: [[@LINE+1]]:24 | enumerator/C | MyValToSet | > + .myfield = MyValToSet, > + // CHECK-NOT: | field/C | myfield | > + // CHECK-NOT: | enumerator/C | MyValToSet | > + }, > + }, > + }, > + }, > + }, > +}; > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits