[cfe-dev] Extracting variable name from VarDecl* Clang

Dhriti Khanna via cfe-dev cfe-dev at lists.llvm.org
Sat Jun 4 09:46:53 PDT 2016


Thank you. Just one more thing: How do I restrict the AST to a single
source file (passed as an argument to the clang tool) excluding the
functions from headers and other third party libraries (if any).

On Sat, Jun 4, 2016 at 7:26 PM, Jonathan Roelofs <jonathan at codesourcery.com>
wrote:

>
>
> On 6/4/16 6:38 AM, Dhriti Khanna via cfe-dev wrote:
>
>> Here is my sample code:
>>
>> int x=0;
>> if(x == 0)
>> cout << "Hey" << endl;
>>
>> I want to get 'x'.
>>
>
> getConditionVariable() will only return x if it is written this way:
>
> if (int x = ... )
>   ...
>
> You need to do something more like this:
>
> if (IfStmt *ifS = dyn_cast<IfStmt>(st))
> {
>   if (BinaryOperator *binOp = dyn_cast<BinaryOperator>(ifS->getCond()))
>   {
>      if (binOp->getOpcode() == BO_Assign)
>      {
>         if (DeclRefExpr *Decl =
> dyn_cast<DeclRefExpr*>(binOp->getLHS()->IgnoreParenCasts()))
>         {
>             ...
>         }
>      }
>   }
> }
>
> It helps a *lot* to look at the AST dump for the examples you're
> interested in matching. To do that, run:
>
>   $ ./bin/clang-check -ast-dump foo.c --
>
> If you're going to be doing heavy matching of ASTs, I recommend looking
> into using this: http://clang.llvm.org/docs/LibASTMatchersReference.html
> instead of open-coding them.
>
>
> Jon
>
>
>> On Sat, Jun 4, 2016 at 6:06 PM, Miklos Vajna via cfe-dev
>> <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>> wrote:
>>
>>     On Sat, Jun 04, 2016 at 05:32:37PM +0530, Dhriti Khanna via cfe-dev
>>     <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>> wrote:
>>     > This code:
>>     >
>>     >  if (IfStmt* ifS = dyn_cast<IfStmt>(st)) {
>>     >    errs() << "Found an IF statement ";
>>     >    VarDecl* var = ifS->getConditionVariable();
>>     >    errs() << var->getNameAsString();
>>     >  }
>>     >
>>     > produces cannot initialize object parameter of type 'const
>>     > clang::NamedDecl' with an expression of type 'clang::VarDecl' error
>> on errs()
>>     > << var->getNameAsString(); line and the program crashes with a seg
>> fault. I
>>     > can't find what's wrong with this? Please help.
>>
>>     Please post some sample source code (from which the AST is generated),
>>     without that it's quite hard to help. But in general I guess you can't
>>     assume that you can get a single variable out of an if statement, if
>> you
>>     have "if (Foo && Bar)", which one would be returned by the API?
>>
>>     _______________________________________________
>>     cfe-dev mailing list
>>     cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>
>>     http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>
>>
>>
>>
>> --
>> Regards,
>> Dhriti Khanna
>> PhD Scholar
>> IIIT Delhi
>>
>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>>
>>
> --
> Jon Roelofs
> jonathan at codesourcery.com
> CodeSourcery / Mentor Embedded
>



-- 
Regards,
Dhriti Khanna
PhD Scholar
IIIT Delhi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20160604/9c73129b/attachment.html>


More information about the cfe-dev mailing list