model/libc.cc
changeset 253 8c86080ced8e
parent 216 50dd0158ab4d
child 265 bd4f5503456a
equal deleted inserted replaced
252:017ae26155ef 253:8c86080ced8e
    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