--- gcc/ginclude/va-sparc.h 2018/04/24 18:23:45 1.1 +++ gcc/ginclude/va-sparc.h 2018/04/24 18:31:24 1.1.1.2 @@ -74,7 +74,8 @@ __extension__ \ AP.__va_next_fp = (__va_freg *) AP.__va_next_o_limit; \ AP.__va_next_fp_limit = (AP.__va_next_fp + \ (__builtin_args_info (1) < 16 ? (16 - __builtin_args_info (1) + 1) / 2 : 0)); \ - AP.__va_next_stack = (__va_greg *) __builtin_next_arg (__builtin_va_alist); \ + AP.__va_next_stack = (__va_greg *) __builtin_next_arg (__builtin_va_alist) \ + - (__builtin_args_info (0) >= 6 || __builtin_args_info (1) >= 16 ? 1 : 0); \ }) #else #ifdef __GCC_NEW_VARARGS__ @@ -116,7 +117,7 @@ enum __va_type_classes { }; #endif -#define va_end(pvar) +#define va_end(pvar) ((void)0) /* Avoid errors if compiling GCC v2 with GCC v1. */ #if __GNUC__ == 1 @@ -132,7 +133,7 @@ enum __va_type_classes { #define va_arg(pvar,TYPE) \ __extension__ \ -({int __type = __builtin_classify_type (* (TYPE *) 0); \ +(*({int __type = __builtin_classify_type (* (TYPE *) 0); \ void * __result; \ if (__type == __real_type_class) /* float? */ \ { \ @@ -170,7 +171,7 @@ __extension__ \ __r = (void **) pvar.__va_next_stack++; \ __result = *__r; \ } \ - *(TYPE *) __result;}) + (TYPE *) __result;})) #else /* not __sparc_v9__ */ @@ -184,18 +185,19 @@ __extension__ \ The casts to char * avoid warnings about invalid pointer arithmetic. */ #define va_arg(pvar,TYPE) \ __extension__ \ -({ TYPE __va_temp; \ - ((__builtin_classify_type (__va_temp) >= __record_type_class) \ +(*({((__builtin_classify_type (*(TYPE*) 0) >= __record_type_class \ + || (__builtin_classify_type (*(TYPE*) 0) == __real_type_class \ + && sizeof (TYPE) == 16)) \ ? ((pvar) = (char *)(pvar) + __va_rounded_size (TYPE *), \ - **(TYPE **) (void *) ((char *)(pvar) - __va_rounded_size (TYPE *))) \ + *(TYPE **) (void *) ((char *)(pvar) - __va_rounded_size (TYPE *))) \ : __va_rounded_size (TYPE) == 8 \ ? ({ union {char __d[sizeof (TYPE)]; int __i[2];} __u; \ __u.__i[0] = ((int *) (void *) (pvar))[0]; \ __u.__i[1] = ((int *) (void *) (pvar))[1]; \ (pvar) = (char *)(pvar) + 8; \ - *(TYPE *) (void *) __u.__d; }) \ + (TYPE *) (void *) __u.__d; }) \ : ((pvar) = (char *)(pvar) + __va_rounded_size (TYPE), \ - *((TYPE *) (void *) ((char *)(pvar) - __va_rounded_size (TYPE)))));}) + ((TYPE *) (void *) ((char *)(pvar) - __va_rounded_size (TYPE)))));})) #endif /* not __sparc_v9__ */ #endif /* defined (_STDARG_H) || defined (_VARARGS_H) */