about summary refs log tree commit diff
diff options
context:
space:
mode:
authorStan Shebs <stanshebs@google.com>2021-11-12 06:48:03 -0800
committerStan Shebs <stanshebs@google.com>2021-11-12 06:48:03 -0800
commitb0d12dcb635744a4fa0ebd13b6e5743d67da1046 (patch)
tree62d1031ffba600be1d2538b394e01fd579b6e752
parentadd8e34cd7223dc6770c34de820651eee879ff65 (diff)
downloadglibc-b0d12dcb635744a4fa0ebd13b6e5743d67da1046.tar.gz
glibc-b0d12dcb635744a4fa0ebd13b6e5743d67da1046.tar.xz
glibc-b0d12dcb635744a4fa0ebd13b6e5743d67da1046.zip
Use a better workaround for clang lack of _builtin_va_arg_pack
-rw-r--r--sysdeps/generic/ldsodefs.h17
1 files changed, 14 insertions, 3 deletions
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h
index 0495f85e84..8759f6e561 100644
--- a/sysdeps/generic/ldsodefs.h
+++ b/sysdeps/generic/ldsodefs.h
@@ -744,15 +744,26 @@ extern void _dl_dprintf (int fd, const char *fmt, ...)
      __attribute__ ((__format__ (__printf__, 2, 3)))
      attribute_hidden;
 #else
+#if defined(__clang__)
+#include <stdarg.h>
+#endif
 __attribute__ ((always_inline, __format__ (__printf__, 2, 3)))
 static inline void
 _dl_dprintf (int fd, const char *fmt, ...)
 {
-  /* Use local declaration to avoid includign <stdio.h>.  */
-  extern int __dprintf(int fd, const char *format, ...) attribute_hidden;
 #if defined(__clang__)
-  __dprintf (fd, fmt);
+  /* In the absence of __builtin_va_arg_pack, use varargs macros to construct a
+     direct call to the stdio function that __dprintf eventually gets to.  This
+     is not a robust hack, will break if stdio changes much.  */
+  extern int _IO_vdprintf (int d, const char *format, va_list arg);
+  va_list arg;
+
+  va_start (arg, fmt);
+  _IO_vdprintf (fd, fmt, arg);
+  va_end (arg);
 #else
+  /* Use local declaration to avoid includign <stdio.h>.  */
+  extern int __dprintf(int fd, const char *format, ...) attribute_hidden;
   __dprintf (fd, fmt, __builtin_va_arg_pack ());
 #endif
 }