[cfe-dev] Extracting variable name from VarDecl* Clang
Dhriti Khanna via cfe-dev
cfe-dev at lists.llvm.org
Sat Jun 4 10:07:48 PDT 2016
I can know the name of source file like this:
SourceManager &srcManager = astContext->getSourceManager();
srcManager.getFilename(decl->getLocation()).str() << "\n";
but I want to just bypass all the nodes in other files (except for the
source file) without this check.
On Sat, Jun 4, 2016 at 10:16 PM, Dhriti Khanna <dhritik at iiitd.ac.in> wrote:
> 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
>
--
Regards,
Dhriti Khanna
PhD Scholar
IIIT Delhi
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20160604/755a6032/attachment.html>
More information about the cfe-dev
mailing list