@@ -679,23 +679,23 @@ for linking")
679679#endif
680680
681681/* Helper / base macros for indirect function symbols. */
682- #define __ifunc_resolver (type_name , name , expr , arg , init , classifier ) \
682+ #define __ifunc_resolver (type_name , name , expr , init , classifier , ... ) \
683683 classifier inhibit_stack_protector \
684- __typeof (type_name) *name##_ifunc (arg) \
684+ __typeof (type_name) *name##_ifunc (__VA_ARGS__) \
685685 { \
686686 init (); \
687687 __typeof (type_name) *res = expr; \
688688 return res; \
689689 }
690690
691691#ifdef HAVE_GCC_IFUNC
692- # define __ifunc (type_name , name , expr , arg , init ) \
692+ # define __ifunc_args (type_name , name , expr , init , ... ) \
693693 extern __typeof (type_name) name __attribute__ \
694694 ((ifunc (#name "_ifunc"))); \
695- __ifunc_resolver (type_name, name, expr, arg, init, static)
695+ __ifunc_resolver (type_name, name, expr, init, static, __VA_ARGS__ )
696696
697- # define __ifunc_hidden (type_name , name , expr , arg , init ) \
698- __ifunc (type_name, name, expr, arg, init )
697+ # define __ifunc_args_hidden (type_name , name , expr , init , ...) \
698+ __ifunc_args (type_name, name, expr, init, __VA_ARGS__ )
699699#else
700700/* Gcc does not support __attribute__ ((ifunc (...))). Use the old behaviour
701701 as fallback. But keep in mind that the debug information for the ifunc
@@ -706,18 +706,24 @@ for linking")
706706 different signatures. (Gcc support is disabled at least on a ppc64le
707707 Ubuntu 14.04 system.) */
708708
709- # define __ifunc (type_name , name , expr , arg , init ) \
709+ # define __ifunc_args (type_name , name , expr , init , ... ) \
710710 extern __typeof (type_name) name; \
711- __typeof (type_name) *name##_ifunc (arg ) __asm__ (#name); \
712- __ifunc_resolver (type_name, name, expr, arg, init,) \
711+ __typeof (type_name) *name##_ifunc (__VA_ARGS__ ) __asm__ (#name); \
712+ __ifunc_resolver (type_name, name, expr, init, , __VA_ARGS__) \
713713 __asm__ (".type " #name ", %gnu_indirect_function");
714714
715- # define __ifunc_hidden (type_name , name , expr , arg , init ) \
715+ # define __ifunc_args_hidden (type_name , name , expr , init , ... ) \
716716 extern __typeof (type_name) __libc_##name; \
717- __ifunc (type_name, __libc_##name, expr, arg , init) \
717+ __ifunc (type_name, __libc_##name, expr, __VA_ARGS__ , init) \
718718 strong_alias (__libc_##name, name);
719719#endif /* !HAVE_GCC_IFUNC */
720720
721+ #define __ifunc (type_name , name , expr , arg , init ) \
722+ __ifunc_args (type_name, name, expr, init, arg)
723+
724+ #define __ifunc_hidden (type_name , name , expr , arg , init ) \
725+ __ifunc_args_hidden (type_name, name, expr, init, arg)
726+
721727/* The following macros are used for indirect function symbols in libc.so.
722728 First of all, you need to have the function prototyped somewhere,
723729 say in foo.h:
0 commit comments