[cfe-dev] ast_matchers::MatchFinder to CallExpr that's a macro call

Manuel Klimek klimek at google.com
Thu Apr 25 21:45:35 PDT 2013


On Thu, Apr 25, 2013 at 11:57 PM, Peeter Joot <peeter.joot at gmail.com> wrote:

> With code like:
>
> ast_matchers::MatchFinder Finder;
>   CallRenamer gmblkCallCallback(&Tool.getReplacements(), "myfunc",
> "xxmyfunc");
>   Finder.addMatcher(
>         callExpr( callee(functionDecl(hasName("myfunc")))).bind("myfunc"),
>     &gmblkCallCallback);
>
>
> I'm able to match to a function call, such as:
>
> int myfunc( void ** ppBlkPtr ) ;
> void blah(void)
> {
>    int * r ;
>
>    myfunc( (void **)&r ) ;
> }
>
> (I've also got a working version of the replacement callback that renames
> such a call).
>
> However, the declaration of "myfunc" is actually of the form:
>
> int myfuncEx( void ** ppBlkPtr, int line ) ;
>
> #define myfunc( x ) myfuncEx( (x), __LINE__ )
>
> Such a call generates a different sort of AST structure:
>
>     `-CallExpr 0x14963a0 <line:1468:21, col:45> 'int'
>       |-ImplicitCastExpr 0x1496388 <col:21> 'int (*)(void **, int)'
> <FunctionToPointerDecay>
>       | `-DeclRefExpr 0x1496338 <col:21> 'int (void **, int)' lvalue
> Function 0x1495b00 'myfuncEx' 'int (void **, int)'
>       |-ParenExpr 0x14962f8 <col:31, col:33> 'void **'
>       | `-CStyleCastExpr 0x14962d0 <line:1478:12, col:22> 'void **'
> <BitCast>
>       |   `-UnaryOperator 0x1496298 <col:21, col:22> 'int **' prefix '&'
>       |     `-DeclRefExpr 0x1496248 <col:22> 'int *' lvalue Var 0x1496180
> 'r' 'int *'
>       `-IntegerLiteral 0x1496318 <<scratch space>:2:1> 'int' 1478
>
> How can I match to such a "macro call" AST?
>
> My final goal is to have my replacement callback to remove that (void **)
> cast from all such parameters for this macro, so a better (but harder)
> question is probably:
>
> How do I match to the (void **) cast operation of parameter N of a macro
> call named "myfunc"?
>
> It's not clear to me that the AST even has this info (see how the AST dump
> has lost the original macro origins, and has info only about the myfuncEx
> function).
>

Note that the AST dump does not contain all the information there is (or it
would be completely unreadable).

With AST matchers, you can currently only match the "C++" names of things.
After matching the call, you can look at the expansion location of the
identifier that references the function (get it via the SourceManager) or
try to directly use the Lexer's makeFileCharRange.

Cheers,
/Manuel


>
> --
> Peeter
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> 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/20130426/1c85413a/attachment.html>


More information about the cfe-dev mailing list