This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: call through pointer of function with variable arguments


Stephen Biggs <xyzzy@hotpop.com> writes:

> Given this code:
> #include <stdio.h>
> char buf[2];
> 
> int (*gfp)(char *, const char *, ...);
> int (*gfp1)(const char *, ...);
>      
> void f (fp,fp1)
>      int (*fp)(char *, const char *, ...);
>      int (*fp1)(const char *, ...);
> {
>   (*fp1)("%.0f\n",5.0);
>   (*fp)(buf, "%.0f", 5.0);
> }
> 
> void h(void)
> {
>   gfp = sprintf;
>   gfp1 = printf;
> 
>   (*gfp1)("%.0f\n",5.0);
>   (*gfp)(buf, "%.0f", 5.0);
> }
> 
> int main()
> {
>   f (&sprintf,&printf);
>   h ();
>   return 0;
> }
> 
> ... in both the cases, by the time I get to the point where I receive an
> expression for the call (in either f or g), the function pointer value
> has already been moved to a register and no prototype information is
> available, since all I have is the function address (in my port, the
> arguments for the current call are already saved aside).  The
> proprietary machine I am porting to is sensitive to whether a call has
> variable arguments or not and has a different calling sequence based on
> that, but how can I know?

You have to remember from the FUNCTION_ARG macro.

> Are there any other machines that already have been ported that have
> this sensitivity?

rs6000 has similar things.  Look at CALL_V4_SET_FP_ARGS in that port.

-- 
- Geoffrey Keating <geoffk@geoffk.org>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]