This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Bug in va_list/va_arg on PowerPC
- To: gcc-bugs at gcc dot gnu dot org
- Subject: Bug in va_list/va_arg on PowerPC
- From: Stephane Bortzmeyer <bortzmeyer at pasteur dot fr>
- Date: Tue, 18 Jul 2000 14:36:06 +0200
- cc: bortzmeyer at pasteur dot fr, edeveaud at pasteur dot fr, "Edouard G. Parmelan" <egp at free dot fr>, babafou at pasteur dot fr
bortzmeyer@yoko:~/tmp$ gcc -c test-va.c
test-va.c: In function `main':
test-va.c:7: incompatible types in assignment
bortzmeyer@yoko:~/tmp$ cat test-va.c
#include <stdarg.h>
int main () {
va_list values;
va_list args;
values = va_arg(args,va_list);
}
[Output of gcc -E attached.]
The same code compiles fine on an i386, same version of gcc, same OS, and on
an Alpha, same version of gcc, Tru64 OS.
[The actual code - the Java Virtual Machine kaffe - is much longer.]
The test machine is a Macintosh PowerPC G4 (PowerBook)
bortzmeyer@yoko:~/tmp$ uname -a
Linux yoko 2.2.15pre20 #1 Thu May 4 11:48:16 EDT 2000 ppc unknown
bortzmeyer@yoko:~/tmp$ gcc -v --save-temps test-va.c
Reading specs from /usr/lib/gcc-lib/powerpc-linux/2.95.2/specs
gcc version 2.95.2 20000313 (Debian GNU/Linux)
/usr/lib/gcc-lib/powerpc-linux/2.95.2/cpp -lang-c -v -D__GNUC__=2
-D__GNUC_MINOR__=95 -DPPC -D__ELF__ -Dpowerpc -D__PPC__ -D__ELF__
-D__powerpc__ -D__PPC -D__powerpc -Acpu(powerpc) -Amachine(powerpc)
-D__CHAR_UNSIGNED__ -D_CALL_SYSV -D_BIG_ENDIAN -D__BIG_ENDIAN__
-Amachine(bigendian) -D_ARCH_PPC -D__unix__ -D__linux__ -Dunix -Dlinux
-Asystem(unix) -Asystem(posix) test-va.c test-va.i
GNU CPP version 2.95.2 20000313 (Debian GNU/Linux) (PowerPC GNU/Linux)
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc-lib/powerpc-linux/2.95.2/include
/usr/include
End of search list.
The following default directories have been omitted from the search path:
/usr/lib/gcc-lib/powerpc-linux/2.95.2/../../../../include/g++-3
/usr/lib/gcc-lib/powerpc-linux/2.95.2/../../../../powerpc-linux/include
End of omitted list.
/usr/lib/gcc-lib/powerpc-linux/2.95.2/cc1 test-va.i -quiet -dumpbase
test-va.c -version -o test-va.s
GNU C version 2.95.2 20000313 (Debian GNU/Linux) (powerpc-linux) compiled by
GNU C version 2.95.2 20000313 (Debian GNU/Linux).
test-va.c: In function `main':
test-va.c:7: incompatible types in assignment
# 1 "test-va.c"
# 1 "/usr/lib/gcc-lib/powerpc-linux/2.95.2/include/stdarg.h" 1 3
# 1 "/usr/lib/gcc-lib/powerpc-linux/2.95.2/include/va-ppc.h" 1 3
typedef struct __va_list_tag {
unsigned char gpr;
unsigned char fpr;
char *overflow_arg_area;
char *reg_save_area;
} __va_list[1], __gnuc_va_list[1];
typedef struct {
long __gp_save[8];
double __fp_save[8];
} __va_regsave_t;
# 192 "/usr/lib/gcc-lib/powerpc-linux/2.95.2/include/va-ppc.h" 3
# 255 "/usr/lib/gcc-lib/powerpc-linux/2.95.2/include/va-ppc.h" 3
# 42 "/usr/lib/gcc-lib/powerpc-linux/2.95.2/include/stdarg.h" 2 3
# 131 "/usr/lib/gcc-lib/powerpc-linux/2.95.2/include/stdarg.h" 3
# 175 "/usr/lib/gcc-lib/powerpc-linux/2.95.2/include/stdarg.h" 3
typedef __gnuc_va_list va_list;
# 1 "test-va.c" 2
int main () {
va_list values;
va_list args;
values = __extension__ (*({ register va_list *__ptr; if ((__builtin_classify_type(*( va_list *)0) == 8) && sizeof ( va_list ) < 16) { unsigned char __fpr = ( args )->fpr; if (__fpr < 8) { __ptr = (( va_list *) (void *) (&(((__va_regsave_t *) ( args )->reg_save_area)->__fp_save[ __fpr ]))) ; ( args )->fpr = __fpr + 1; } else if (sizeof ( va_list ) == 8) { unsigned long __addr = (unsigned long) (( args )->overflow_arg_area ); __ptr = ( va_list *)((__addr + 7) & -8); ( args )->overflow_arg_area = (char *)(__ptr + 1); } else { ; } } else if ((__builtin_classify_type(*( va_list *)0) >= 12) || (__builtin_classify_type(*( va_list *)0) == 8) ) { unsigned char __gpr = ( args )->gpr; if (__gpr < 8) { __ptr = * (( va_list * *) (void *) (&(((__va_regsave_t *) ( args )->reg_save_area)->__gp_save[ __gpr ]))) ; ( args )->gpr = __gpr + 1; } else { va_list **__pptr = ( va_list **) (( args )->overflow_arg_area ); __ptr = * __pptr; ( args )->overflow_!
arg_area = (char *) (__pptr + 1); } } else { if (sizeof ( va_list ) == 8) { unsigned char __gpr = ( args )->gpr; if (__gpr < 7) { __gpr += __gpr & 1; __ptr = (( va_list *) (void *) (&(((__va_regsave_t *) ( args )->reg_save_area)->__gp_save[ __gpr ]))) ; ( args )->gpr = __gpr + 2; } else { unsigned long __addr = (unsigned long) (( args )->overflow_arg_area ); __ptr = ( va_list *)((__addr + 7) & -8); ( args )->gpr = 8; ( args )->overflow_arg_area = (char *)(__ptr + 1); } } else if (sizeof ( va_list ) == 4) { unsigned char __gpr = ( args )->gpr; if (__gpr < 8) { __ptr = (( va_list *) (void *) (&(((__va_regsave_t *) ( args )->reg_save_area)->__gp_save[ __gpr ]))) ; ( args )->gpr = __gpr + 1; } else { __ptr = ( va_list *) ( args )->overflow_arg_area ; ( args )->overflow_arg_area = (char *)(__ptr + 1); } } else { ; } } __ptr; })) ;
}