Re: va_list (Was: Compile problem)
> > > Is va_list a real void * pointer, and if so why is it 12 bytes long?
It isn't.
> > > If not what is it so that gcc can't make by default a copy of it?
typedef struct __va_list_tag {
unsigned char gpr; /* index into the array of 8 GPRs stored in the
register save area gpr=0 corresponds to r3,
gpr=1 to r4, etc. */
unsigned char fpr; /* index into the array of 8 FPRs stored in the
register save area fpr=0 corresponds to f1,
fpr=1 to f2, etc. */
char *overflow_arg_area; /* location on stack that holds the next
overflow argument */
char *reg_save_area; /* where r3:r10 and f1:f8, if saved are stored */
} __va_list[1], __gnuc_va_list[1];
from include/va-ppc.h in the gcc path.
> > Use va_copy(DEST, SRC) or __va_copy() if your version of GCC is
> > too old.
> Thanks for the tip, but what it do not understand is that I
> have gcc 2.95.4 (which I think can not be considered as old), but in
> my stdargs.g I only found __va_copy(), the other primitive doesn't not
> exist.
>
> You solution put me on the right way and this link raise (and solves) the problem :
> http://gcc.gnu.org/ml/gcc/1998-02/msg00835.html (dated 1998 !).
Their implementation (dest[0]=src[0]) is equivalent to the one used by gcc
(#define __va_copy(dest, src) *(dest) = *(src)). This problem exists from
the very beginning...
> Does anyone as anyexplanation on this fact?
It seems va_copy never made it into the standard, or the standard never
made it out the door. So all you have is __va_copy but that's defined
for all architectures supported by gcc. People just need to start using
it.
Michael
Reply to: