浏览代码

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..
Rich Felker 14 年之前
父节点
当前提交
def0af1898
共有 3 个文件被更改,包括 12 次插入1 次删除
  1. 5 0
      arch/i386/bits/alltypes.h.sh
  2. 0 1
      arch/x86_64/bits/stdarg.h
  3. 7 0
      include/stdarg.h

+ 5 - 0
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;

+ 0 - 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 - 0
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
 }