Browse Source

use compiler builtins for variadic macros when available

this slightly cuts down on the degree musl "fights with" gcc, but more
importantly, it fixes a critical bug when gcc inlines a variadic
function and optimizes out the variadic arguments due to noticing that
they were "not used" (by __builtin_va_arg).

we leave the old code in place if __GNUC__ >= 3 is false; it seems
like it might be necessary at least for tinycc support and perhaps if
anyone ever gets around to fixing gcc 2.95.3 enough to make it work..
rs-1.0
Rich Felker 16 years ago
parent
commit
def0af1898
  1. 5
      arch/i386/bits/alltypes.h.sh
  2. 1
      arch/x86_64/bits/stdarg.h
  3. 7
      include/stdarg.h

5
arch/i386/bits/alltypes.h.sh

@ -19,7 +19,12 @@ union \1 \2;\
TYPEDEF unsigned size_t;
TYPEDEF int ssize_t;
TYPEDEF long ptrdiff_t;
#if __GNUC__ >= 3
TYPEDEF __builtin_va_list va_list;
#else
TYPEDEF struct __va_list * va_list;
#endif
TYPEDEF long wchar_t;
TYPEDEF long wint_t;

1
arch/x86_64/bits/stdarg.h

@ -2,4 +2,3 @@
#define va_end(v) __builtin_va_end(v)
#define va_arg(v,l) __builtin_va_arg(v,l)
#define va_copy(d,s) __builtin_va_copy(d,s)
#define __va_copy(d,s) __builtin_va_copy(d,s)

7
include/stdarg.h

@ -9,7 +9,14 @@ extern "C" {
#include <bits/alltypes.h>
#if __GNUC__ >= 3
#define va_start(v,l) __builtin_va_start(v,l)
#define va_end(v) __builtin_va_end(v)
#define va_arg(v,l) __builtin_va_arg(v,l)
#define va_copy(d,s) __builtin_va_copy(d,s)
#else
#include <bits/stdarg.h>
#endif
#ifdef __cplusplus
}

Loading…
Cancel
Save