[cfe-dev] AST Matcher for Decl subclass CilkSpawnDecl

Manuel Klimek klimek at google.com
Thu Nov 20 01:25:25 PST 2014


On Wed Nov 19 2014 at 3:38:44 PM Georg Altmann <
georg.altmann at informatik.stud.uni-erlangen.de> wrote:

> Thank you for the quick reply.
>
> I found a partial solution to my problem. I dug down into the AST
> matching code and noticed RecursiveASTVisitor did not recurse into
> CapturedStmt in CilkSpawnDecl. So I did the patch
>
>
> diff --git a/include/clang/AST/RecursiveASTVisitor.h
> b/include/clang/AST/RecursiveASTVisitor.h
> index 35eec69..a16e772 100755
> --- a/include/clang/AST/RecursiveASTVisitor.h
> +++ b/include/clang/AST/RecursiveASTVisitor.h
> @@ -1305,6 +1305,7 @@ DEF_TRAVERSE_DECL(CapturedDecl, {
>    })
>
>  DEF_TRAVERSE_DECL(CilkSpawnDecl, {
> +    TRY_TO(TraverseStmt(D->getCapturedStmt()));
>    })
>
>  DEF_TRAVERSE_DECL(EmptyDecl, { })
>
>
> Again, this is what I want to match:
> The AST:
> |-CompoundStmt
> | `-CilkSpawnExpr
> |   |-CilkSpawnDecl
> |   | `-CapturedStmt
> |   |   |-CapturedDecl
> |   |   | `-ImplicitParamDecl
> |   |   |-ExprWithCleanups
> |   |   | `-CallExpr
> --------------^ this guy
>
>
> After the patch, these match now:
>
> // 1) matches
> compoundStmt(
>   has(cilkSpawnExpr(
>    has(cilkSpawnDecl(
>      has(capturedStmt()))))))
>
> // 2) matches and binds
> compoundStmt(
>   has(cilkSpawnExpr(
>     has(cilkSpawnDecl(
>       has(capturedStmt(
>         hasDescendant(exprWithCleanups(
>           has(callExpr().bind("callExpr"))))))))))
>
>
> However this doesn't match, while it should IMHO.
>
> // 3) does not match
> compoundStmt(
>   has(cilkSpawnExpr(
>     has(cilkSpawnDecl(
>         has(capturedStmt(
>             has(exprWithCleanups())))))))
>

Which one in this chain is the one that doesn't match? (remove inner ones
until it matches, send result).

Cheers,
/Manuel

>
>
> Notice that I used hasDescendant(exprWithCleanups()) in 2) and
> has(exprWithCleanups()) in 3).
> ExprWithCleanups is a direct child of CapturedStmt. Any clue why 2)
> doesn't match?
>
> Thanks,
> Georg
>
> On 18.11.2014 16:29, Manuel Klimek wrote:
> >
> >
> > On Tue Nov 18 2014 at 3:42:46 PM Georg Altmann
> > <georg.altmann at informatik.stud.uni-erlangen.de
> > <mailto:georg.altmann at informatik.stud.uni-erlangen.de>> wrote:
> >
> >     Hi,
> >
> >     I am working on a modified version of clang for Intel Cilk Plus, from
> >     https://github.com/cilkplus
> >     based on clang 3.4.
> >
> >     They added
> >
> >     class CilkSpawnDecl : public Decl {
> >       // ...
> >       public:
> >       // ...
> >       /// \brief Returns the associated CapturedStmt.
> >       CapturedStmt *getCapturedStmt() { return CapturedSpawn; }
> >       const CapturedStmt *getCapturedStmt() const { return
> CapturedSpawn; }
> >       // ...
> >     };
> >
> >     However there don't seem to be any releated AST matchers and I need
> >     to match
> >
> >     |-CompoundStmt
> >     | `-CilkSpawnExpr
> >     |   |-CilkSpawnDecl
> >     |   | `-CapturedStmt
> >     |   |   |-CapturedDecl
> >     |   |   | `-ImplicitParamDecl
> >     |   |   |-ExprWithCleanups
> >     |   |   | `-CallExpr
> >     ------------^ this guy
> >
> >     which does not seem to be possible without a customized matcher for
> >     CilkSpawnDecl.
> >
> >     I would like to define a AST Traversal Matcher, so I can do something
> >     like this
> >
> >     compoundStmt(
> >       has(cilkSpawnExpr(
> >         has(cilkSpawnDecl(
> >           hasCapturedStmt(
> >           ^ has(exprWithCleanups(has(__callExpr))))))))
> >           `-- How?
> >
> >
> >     I already defined cilkSpawnExpr and cilkSpawnDecl by using
> >     VariadicDynCastAllOfMatcher which is working great.
> >     Yet, I still need hasCapturedStmt and I can't get my head around the
> AST
> >     matcher internals. I guess, I somehow need to define a matcher that
> >     takes a CilkSpawnDecl node and returns true if getCapturedStmt() !=
> >     0, e.g.
> >
> >     match(CilkSpawnDecl const& spawnDecl) {
> >       if (spawnDecl.getCapturedStmt())
> >         return true;
> >       else
> >         return false;
> >     }
> >
> >     But how do I define hasCapturedStmt() so that
> has(exprWithCleanups(...))
> >     can act on the children of CapturedStmt?
> >     I.e. how does an AST matcher hand down the list of children to the
> >     following matcher expressions?
> >
> >     I looked at the macro AST_MATCHER_P but I'm unsure about ParamType,
> >     ASTMatchFinder and BoundNodesTreeBuilder. Can I use that?
> >
> >
> > Yes. Take a look at for example:
> > http://reviews.llvm.org/diffusion/L/browse/cfe/trunk/
> include/clang/ASTMatchers/ASTMatchers.h;222237$3536
> > AST_MATCHER_P(ElaboratedType, hasQualifier,
> >               internal::Matcher<NestedNameSpecifier>, InnerMatcher) {
> >   if (const NestedNameSpecifier *Qualifier = Node.getQualifier())
> >     return InnerMatcher.matches(*Qualifier, Finder, Builder);
> >
> >   return false;
> > }
> >
> > You basically want to adapt this to your use case...
> >
> >
> >
> >     Thanks!
> >
> >     Georg
> >
> >
> >
> >
> >     _________________________________________________
> >     cfe-dev mailing list
> >     cfe-dev at cs.uiuc.edu <mailto:cfe-dev at cs.uiuc.edu>
> >     http://lists.cs.uiuc.edu/__mailman/listinfo/cfe-dev
> >     <http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev>
> >
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20141120/da1a09e1/attachment.html>


More information about the cfe-dev mailing list