[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