@@ -679,23 +679,23 @@ for linking")
679
679
#endif
680
680
681
681
/* 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 , ... ) \
683
683
classifier inhibit_stack_protector \
684
- __typeof (type_name) *name##_ifunc (arg) \
684
+ __typeof (type_name) *name##_ifunc (__VA_ARGS__) \
685
685
{ \
686
686
init (); \
687
687
__typeof (type_name) *res = expr; \
688
688
return res; \
689
689
}
690
690
691
691
#ifdef HAVE_GCC_IFUNC
692
- # define __ifunc (type_name , name , expr , arg , init ) \
692
+ # define __ifunc_args (type_name , name , expr , init , ... ) \
693
693
extern __typeof (type_name) name __attribute__ \
694
694
((ifunc (#name "_ifunc"))); \
695
- __ifunc_resolver (type_name, name, expr, arg, init, static)
695
+ __ifunc_resolver (type_name, name, expr, init, static, __VA_ARGS__ )
696
696
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__ )
699
699
#else
700
700
/* Gcc does not support __attribute__ ((ifunc (...))). Use the old behaviour
701
701
as fallback. But keep in mind that the debug information for the ifunc
@@ -706,18 +706,24 @@ for linking")
706
706
different signatures. (Gcc support is disabled at least on a ppc64le
707
707
Ubuntu 14.04 system.) */
708
708
709
- # define __ifunc (type_name , name , expr , arg , init ) \
709
+ # define __ifunc_args (type_name , name , expr , init , ... ) \
710
710
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__) \
713
713
__asm__ (".type " #name ", %gnu_indirect_function");
714
714
715
- # define __ifunc_hidden (type_name , name , expr , arg , init ) \
715
+ # define __ifunc_args_hidden (type_name , name , expr , init , ... ) \
716
716
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) \
718
718
strong_alias (__libc_##name, name);
719
719
#endif /* !HAVE_GCC_IFUNC */
720
720
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
+
721
727
/* The following macros are used for indirect function symbols in libc.so.
722
728
First of all, you need to have the function prototyped somewhere,
723
729
say in foo.h:
0 commit comments