This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: functions calls Vs calls using function pointers
Digvijoy Chatterjee writes:
> On 5/25/06, Andrew Haley <aph@redhat.com> wrote:
> > Digvijoy Chatterjee writes:
> >
> > > I am trying to understand how cc1 works ,and was going through the
> > > gcc-4.0.3 source , and after a lot of research , found functions
> > > for parsing Declaration/Definitions(gcc-4.0.3/gcc/c-decl.c:
> > > grokdeclarator) and "actual function calls" used inside a
> > > translation unit ,in (gcc-4.0.3/gcc/calls.c:prepare_call_address
> > > )in the C compilation process .
> > >
> > > The problem however is when i choose to call a function using
> > > function-pointers ,the name of the function pointer appears as "-"
> > > in this prepare_call_address function (as seen in gdb). Can anyone
> > > point me to a C file/function in the gcc source tree where the
> > > compiler knows the exact function-pointer name being used to call a
> > > function.
> >
> > The problem I'm having with this (and probably everyone else is as
> > well) is that I don't really know what you're asking.
> >
> > prepare_call_address() is called a long time after the C source code
> > has been parsed. It's part of the code generation phase.
> >
> > prepare_call_address() isn't passed a variable, it's passed an RTX.
> > That RTX can either be a symbol_ref or something more complex. As
> > long as it, when executed, produces an address that's OK.
> >
> > If you want to see the expression that is used to form the address,
> > put your breakpoint on expand_call() and look at the exp.
> >
> > > typedef void (*fptr) (int);
> > > void A(int);
> > > int main()
> > > {
> > > fptr fp;
> > > fp=A;
> > > fp();
> > > }
> > > void A(int i){printf("in A\n");}
> > >
> > > when i try and compile this , using gcc, its quick to point an error :
> > > too few arguments to fp;
> >
> > Correct. What's your question?
> The question is which function in which .c file of the gcc source
> tree , understands the fact that a call to fp is actually a call to A
> , and therefore complains about wrong arguments.
That's not what happens.
You declare fp to be type void (*fptr) (int).
Therefore if you call a function through fp, you have to pass an int.
This is because of the type of variable fp, not because of A.
You can easily demonstrate this by compiling:
typedef void (*fptr) (int);
int main()
{
fptr fp;
fp();
}
> I want the name of the function where the compiler while parsing a .c
> file associates a function pointer ,to the function which will be
> called at runtime.
This never happens, and therefore I can't answer your question.
Andrew.