36 GCC_BUILTIN_APPLY(name,name) |
36 GCC_BUILTIN_APPLY(name,name) |
37 |
37 |
38 #define DCET(rtype,name) \ |
38 #define DCET(rtype,name) \ |
39 GCC_BUILTIN_APPLYT(rtype,name,name) |
39 GCC_BUILTIN_APPLYT(rtype,name,name) |
40 |
40 |
|
41 /* From gcc/testsuite/gcc.dg/cpp/vararg2.c */ |
|
42 /* C99 __VA_ARGS__ versions */ |
|
43 #define c99_count(...) _c99_count1 ( , ##__VA_ARGS__)/* If only ## worked.*/ |
|
44 #define _c99_count1(...) _c99_count2 (__VA_ARGS__,10,9,8,7,6,5,4,3,2,1,0) |
|
45 #define _c99_count2(_,x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,n,...) n |
|
46 |
|
47 #define FULL_ARGS_0() |
|
48 #define FULL_ARGS_1(X0) X0 a0 |
|
49 #define FULL_ARGS_2(X0,X1) X0 a0, X1 a1 |
|
50 #define FULL_ARGS_3(X0,X1,X2) X0 a0, X1 a1, X2 a2 |
|
51 #define FULL_ARGS_4(X0,X1,X2,X3) X0 a0, X1 a1, X2 a2, X3 a3 |
|
52 #define FULL_ARGS_5(X0,X1,X2,X3,X4) X0 a0, X1 a1, X2 a2, X3 a3, X4 a4 |
|
53 |
|
54 #define _ARGS_0() |
|
55 #define _ARGS_1(X0) a0 |
|
56 #define _ARGS_2(X0,X1) a0, a1 |
|
57 #define _ARGS_3(X0,X1,X2) a0, a1, a2 |
|
58 #define _ARGS_4(X0,X1,X2,X3) a0, a1, a2, a3 |
|
59 #define _ARGS_5(X0,X1,X2,X3,X4) a0, a1, a2, a3, a4 |
|
60 |
|
61 #define CAT(a, ...) PRIMITIVE_CAT(a, __VA_ARGS__) |
|
62 #define PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__ |
|
63 |
|
64 #define FULL_ARGS(...) CAT(FULL_ARGS_,c99_count (__VA_ARGS__))(__VA_ARGS__) |
|
65 #define ARGS(...) CAT(_ARGS_,c99_count (__VA_ARGS__))(__VA_ARGS__) |
|
66 |
|
67 |
|
68 #define DCE_EXPLICIT(name,rtype,...) \ |
|
69 rtype name (FULL_ARGS(__VA_ARGS__)) \ |
|
70 { \ |
|
71 return g_libc.name ## _fn (ARGS(__VA_ARGS__)); \ |
|
72 } |
41 |
73 |
42 #define DCE_WITH_ALIAS(name) \ |
74 #define DCE_WITH_ALIAS(name) \ |
43 GCC_BUILTIN_APPLY(__ ## name,name) \ |
75 GCC_BUILTIN_APPLY(__ ## name,name) \ |
44 weak_alias(__ ## name, name); |
76 weak_alias(__ ## name, name); |
45 |
77 |