Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [cdt-dev] How to differenciate a call to a functionfromareferencing its address?

I need to find out that the second argument of a expression Func( 5,
NUMBER) was NUMBER which is a macro.
I cannot figure out how to do this with AST.

2008/10/15 Schorn, Markus <Markus.Schorn@xxxxxxxxxxxxx>:
> I am uncertain whether I understand your question. When you use
> the macro twice, there will simply be a second reference
> to the macro.
> Markus.
>
>> -----Original Message-----
>> From: cdt-dev-bounces@xxxxxxxxxxx
>> [mailto:cdt-dev-bounces@xxxxxxxxxxx] On Behalf Of Dmitry Smirnov
>> Sent: Wednesday, October 15, 2008 11:11 AM
>> To: CDT General developers list.
>> Subject: Re: [cdt-dev] How to differenciate a call to a
>> functionfromareferencing its address?
>> Importance: Low
>>
>> Hi,
>>
>> One more question about IASTTFunctionCallExpression.
>> I cannot figure out how to deal with the arguments of the
>> macro which is a function-style macro.
>>
>> struct myStruct
>> {
>>   void (*funcPtr)(int v1, intv2);
>> }
>>
>> #define NUMBER 10
>>
>> #define Func( p, v1, v2 ) p->funcPtr(v1, v2)
>>
>> int main
>> {
>>   Func( 5, NUMBER);
>> }
>>
>> I'm getting a IASTTFunctionCallExpression for a Func call in main().
>> Now I need to realize that argument 2 is a macro with name NUMBER.
>>
>> With IASTTFunctionCallExpression.getParameterExpression() I
>> can get a list of parameters with values 5 and 10.
>> With IASTTFunctionCallExpression.getNodeLocations() I can get
>> IASTMacroExpansionLocation and its nested macros.
>> In this case, I will get one nested macro (ASTMacroReferenceName in
>> fact) for NUMBER.
>>
>> The question is: how to map this ASTMacroReferenceName to a
>> second (or any other) argument?
>>
>>
>> 2008/10/1 Schorn, Markus <Markus.Schorn@xxxxxxxxxxxxx>:
>> > The AST contains the entire information. In one case you'd
>> be looking
>> > at a function-call expression (IASTFunctionCallExpression), in the
>> > other there would not be one. You can find the function-call by
>> > looking at the parents of the IASTName, which is the
>> reference to the
>> > function. The arguments are then available via
>> > IASTTFunctionCallExpression.getParameterExpression(). This method
>> > should correctly be called getArgumentExpression().
>> >
>> > Markus.
>> >
>> >> -----Original Message-----
>> >> From: cdt-dev-bounces@xxxxxxxxxxx
>> >> [mailto:cdt-dev-bounces@xxxxxxxxxxx] On Behalf Of Dmitry Smirnov
>> >> Sent: Wednesday, October 01, 2008 5:25 PM
>> >> To: CDT General developers list.
>> >> Subject: Re: [cdt-dev] How to differenciate a call to a function
>> >> fromareferencing its address?
>> >> Importance: Low
>> >>
>> >> Is it also not possible with AST?
>> >> What if F have some arguments? Can I know what actual
>> arguments were
>> >> passed to a function?
>> >>
>> >> 2008/10/1 Schorn, Markus <Markus.Schorn@xxxxxxxxxxxxx>:
>> >> > Currently you cannot tell the difference. If this is
>> important for
>> >> > you, please raise an enhancement request on bugzilla.
>> >> >
>> >> > Markus.
>> >> >
>> >> >> -----Original Message-----
>> >> >> From: cdt-dev-bounces@xxxxxxxxxxx
>> >> >> [mailto:cdt-dev-bounces@xxxxxxxxxxx] On Behalf Of Dmitry Smirnov
>> >> >> Sent: Wednesday, October 01, 2008 3:59 PM
>> >> >> To: cdt-dev@xxxxxxxxxxx
>> >> >> Subject: [cdt-dev] How to differenciate a call to a
>> function from
>> >> >> areferencing its address?
>> >> >> Importance: Low
>> >> >>
>> >> >> Hi,
>> >> >>
>> >> >> Let's assume I have a function F().
>> >> >> In the program it can be referenced in this way
>> >> >>
>> >> >> void B
>> >> >> {
>> >> >>   void * addr = F; // or &F;
>> >> >> }
>> >> >>
>> >> >> How can I differenciate this from the real call to F()
>> >> using index or
>> >> >> AST?
>> >> >>
>> >> >> Let's assume I have an IIndexName for B.
>> >> >> I can get the list of enclosed names:
>> >> >>
>> >> >> IIndexName funcB = ...
>> >> >> IIndexName[] refs = funcB.getEnclosedNames(); for(IIndexName
>> >> >> ref: refs) {
>> >> >>   IBinding refBinding = index.findBinding(ref);
>> >> >>   if( refBinding instanceof IFunction )
>> >> >>   {
>> >> >>      // How to know that ref is not call?
>> >> >>   }
>> >> >> }
>> >> >>
>> >> >> Dmitry
>> >> _______________________________________________


Back to the top