> BTW, I never heard any complaints about XView's varargs usage on ppc back > in the glibc 2.0 days (but then, I don't know wheter somebody actually > compiled it for ppc at that time). However, for glibc 2.1, somebody > submitted a patch that changed the following in lib/libxview/attr/attr.c:94 > and a few other places: > > #if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1) > __va_copy(valist, valist1); > __va_copy(avlist, avlist1); > #else > valist = valist1; > avlist = avlist1; > #endif
Looks reasonable. > If I look at the definition of __va_copy, it's > #define __va_copy(dest, src) (dest) = (src) > on all platforms except ppc, where it is > #define __va_copy(dest, src) *(dest) = *(src) > Is ppc varargs really that different from the rest of the world's, or could > this be a bug in gcc's header files? No, it's really that different. I don't understand all the weird stuff going on there but I've tried a number of things to port a bio sequence analysis package where they passed va_lists down multiple levels of function calls that would then change the va_lists. The rest of the world passes pointers to the va_lists if the changes need to propagate back up. PPC doesn't seem to like pointers to va_lists, just passing the va_list however already makes changes to the list visible to the calling function. Hence my need for __va_copy() which could not be replaced by a simple copy. Michael