]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUILD: trace: always have an argument before variadic args in macros
authorWilly Tarreau <w@1wt.eu>
Thu, 10 Sep 2020 07:35:54 +0000 (09:35 +0200)
committerWilly Tarreau <w@1wt.eu>
Thu, 10 Sep 2020 07:35:54 +0000 (09:35 +0200)
tcc supports variadic macros provided that there is always at least one
argument, like older gcc versions. Thus we need to always keep one and
define args as the remaining ones. It's not an issue at all and doesn't
change the way to use them, just the internal definitions.

include/haproxy/trace.h

index 596b70646d4bb315c17113bb1bfd29cd0a995a69..f200ef1143c336fba53b7e90a53cc376a252346f 100644 (file)
 #define _TRC_LOC(f,l) __TRC_LOC(f, ":", l)
 #define __TRC_LOC(f,c,l) f c #l
 
-/* truncate a macro arg list to exactly 5 args and replace missing ones with NULL */
-#define TRC_5ARGS(a1,a2,a3,a4,a5,...) DEFNULL(a1),DEFNULL(a2),DEFNULL(a3),DEFNULL(a4),DEFNULL(a5)
+/* truncate a macro arg list to exactly 5 args and replace missing ones with NULL.
+ * The first one (a0) is always ignored.
+ */
+#define TRC_5ARGS(a0,a1,a2,a3,a4,a5,...) DEFNULL(a1),DEFNULL(a2),DEFNULL(a3),DEFNULL(a4),DEFNULL(a5)
 
 /* For convenience, TRACE() alone uses the file's default TRACE_LEVEL, most
  * likely TRACE_LEVEL_DEVELOPER, though the other explicit variants specify
  * change the message at the beginning. Only TRACE_DEVEL(), TRACE_ENTER() and
  * TRACE_LEAVE() will report the calling function's name.
  */
-#define TRACE(msg, mask, ...)    \
-       trace(TRACE_LEVEL,           (mask), TRACE_SOURCE, ist(TRC_LOC), NULL, TRC_5ARGS(__VA_ARGS__,,,,,), ist(msg))
+#define TRACE(msg, mask, args...)    \
+       trace(TRACE_LEVEL,           (mask), TRACE_SOURCE, ist(TRC_LOC), NULL, TRC_5ARGS(0,##args,0,0,0,0,0), ist(msg))
 
-#define TRACE_USER(msg, mask, ...)                     \
-       trace(TRACE_LEVEL_USER,      (mask), TRACE_SOURCE, ist(TRC_LOC), NULL, TRC_5ARGS(__VA_ARGS__,,,,,), ist(msg))
+#define TRACE_USER(msg, mask, args...)                 \
+       trace(TRACE_LEVEL_USER,      (mask), TRACE_SOURCE, ist(TRC_LOC), NULL, TRC_5ARGS(0,##args,0,0,0,0,0), ist(msg))
 
-#define TRACE_DATA(msg, mask, ...)  \
-       trace(TRACE_LEVEL_DATA,   (mask), TRACE_SOURCE, ist(TRC_LOC), NULL, TRC_5ARGS(__VA_ARGS__,,,,,), ist(msg))
+#define TRACE_DATA(msg, mask, args...)  \
+       trace(TRACE_LEVEL_DATA,   (mask), TRACE_SOURCE, ist(TRC_LOC), NULL, TRC_5ARGS(0,##args,0,0,0,0,0), ist(msg))
 
-#define TRACE_PROTO(msg, mask, ...)    \
-       trace(TRACE_LEVEL_PROTO,     (mask), TRACE_SOURCE, ist(TRC_LOC), NULL, TRC_5ARGS(__VA_ARGS__,,,,,), ist(msg))
+#define TRACE_PROTO(msg, mask, args...)    \
+       trace(TRACE_LEVEL_PROTO,     (mask), TRACE_SOURCE, ist(TRC_LOC), NULL, TRC_5ARGS(0,##args,0,0,0,0,0), ist(msg))
 
-#define TRACE_STATE(msg, mask, ...)    \
-       trace(TRACE_LEVEL_STATE,     (mask), TRACE_SOURCE, ist(TRC_LOC), NULL, TRC_5ARGS(__VA_ARGS__,,,,,), ist(msg))
+#define TRACE_STATE(msg, mask, args...)    \
+       trace(TRACE_LEVEL_STATE,     (mask), TRACE_SOURCE, ist(TRC_LOC), NULL, TRC_5ARGS(0,##args,0,0,0,0,0), ist(msg))
 
-#define TRACE_DEVEL(msg, mask, ...)    \
-       trace(TRACE_LEVEL_DEVELOPER, (mask), TRACE_SOURCE, ist(TRC_LOC), __FUNCTION__, TRC_5ARGS(__VA_ARGS__,,,,,), ist(msg))
+#define TRACE_DEVEL(msg, mask, args...)    \
+       trace(TRACE_LEVEL_DEVELOPER, (mask), TRACE_SOURCE, ist(TRC_LOC), __FUNCTION__, TRC_5ARGS(0,##args,0,0,0,0,0), ist(msg))
 
-#define TRACE_ENTER(mask, ...)  \
-       trace(TRACE_LEVEL_DEVELOPER, (mask), TRACE_SOURCE, ist(TRC_LOC), __FUNCTION__, TRC_5ARGS(__VA_ARGS__,,,,,), ist("entering"))
+#define TRACE_ENTER(mask, args...)  \
+       trace(TRACE_LEVEL_DEVELOPER, (mask), TRACE_SOURCE, ist(TRC_LOC), __FUNCTION__, TRC_5ARGS(0,##args,0,0,0,0,0), ist("entering"))
 
-#define TRACE_LEAVE(mask, ...)  \
-       trace(TRACE_LEVEL_DEVELOPER, (mask), TRACE_SOURCE, ist(TRC_LOC), __FUNCTION__, TRC_5ARGS(__VA_ARGS__,,,,,), ist("leaving"))
+#define TRACE_LEAVE(mask, args...)  \
+       trace(TRACE_LEVEL_DEVELOPER, (mask), TRACE_SOURCE, ist(TRC_LOC), __FUNCTION__, TRC_5ARGS(0,##args,0,0,0,0,0), ist("leaving"))
 
-#define TRACE_POINT(mask, ...)  \
-       trace(TRACE_LEVEL_DEVELOPER, (mask), TRACE_SOURCE, ist(TRC_LOC), __FUNCTION__, TRC_5ARGS(__VA_ARGS__,,,,,), ist("in"))
+#define TRACE_POINT(mask, args...)  \
+       trace(TRACE_LEVEL_DEVELOPER, (mask), TRACE_SOURCE, ist(TRC_LOC), __FUNCTION__, TRC_5ARGS(0,##args,0,0,0,0,0), ist("in"))
 
 #if defined(DEBUG_DEV) || defined(DEBUG_FULL)
-#    define DBG_TRACE(msg, mask, ...)        TRACE(msg, mask, __VA_ARGS__)
-#    define DBG_TRACE_USER(msg, mask, ...)   TRACE_USER(msg, mask, __VA_ARGS__)
-#    define DBG_TRACE_DATA(msg, mask, ...)   TRACE_DATA(msg, mask, __VA_ARGS__)
-#    define DBG_TRACE_PROTO(msg, mask, ...)  TRACE_PROTO(msg, mask, __VA_ARGS__)
-#    define DBG_TRACE_STATE(msg, mask, ...)  TRACE_STATE(msg, mask, __VA_ARGS__)
-#    define DBG_TRACE_DEVEL(msg, mask, ...)  TRACE_DEVEL(msg, mask, __VA_ARGS__)
-#    define DBG_TRACE_ENTER(mask, ...)       TRACE_ENTER(mask, __VA_ARGS__)
-#    define DBG_TRACE_LEAVE(mask, ...)       TRACE_LEAVE(mask, __VA_ARGS__)
-#    define DBG_TRACE_POINT(mask, ...)       TRACE_POINT(mask, __VA_ARGS__)
+#    define DBG_TRACE(msg, mask, args...)        TRACE(msg, mask, ##args)
+#    define DBG_TRACE_USER(msg, mask, args...)   TRACE_USER(msg, mask, ##args)
+#    define DBG_TRACE_DATA(msg, mask, args...)   TRACE_DATA(msg, mask, ##args)
+#    define DBG_TRACE_PROTO(msg, mask, args...)  TRACE_PROTO(msg, mask, ##args)
+#    define DBG_TRACE_STATE(msg, mask, args...)  TRACE_STATE(msg, mask, ##args)
+#    define DBG_TRACE_DEVEL(msg, mask, args...)  TRACE_DEVEL(msg, mask, ##args)
+#    define DBG_TRACE_ENTER(mask, args...)       TRACE_ENTER(mask, ##args)
+#    define DBG_TRACE_LEAVE(mask, args...)       TRACE_LEAVE(mask, ##args)
+#    define DBG_TRACE_POINT(mask, args...)       TRACE_POINT(mask, ##args)
 #else
-#    define DBG_TRACE(msg, mask, ...)        do { /* do nothing */ } while(0)
-#    define DBG_TRACE_USER(msg, mask, ...)   do { /* do nothing */ } while(0)
-#    define DBG_TRACE_DATA(msg, mask, ...)   do { /* do nothing */ } while(0)
-#    define DBG_TRACE_PROTO(msg, mask, ...)  do { /* do nothing */ } while(0)
-#    define DBG_TRACE_STATE(msg, mask, ...)  do { /* do nothing */ } while(0)
-#    define DBG_TRACE_DEVEL(msg, mask, ...)  do { /* do nothing */ } while(0)
-#    define DBG_TRACE_ENTER(mask, ...)       do { /* do nothing */ } while(0)
-#    define DBG_TRACE_LEAVE(mask, ...)       do { /* do nothing */ } while(0)
-#    define DBG_TRACE_POINT(mask, ...)       do { /* do nothing */ } while(0)
+#    define DBG_TRACE(msg, mask, args...)        do { /* do nothing */ } while(0)
+#    define DBG_TRACE_USER(msg, mask, args...)   do { /* do nothing */ } while(0)
+#    define DBG_TRACE_DATA(msg, mask, args...)   do { /* do nothing */ } while(0)
+#    define DBG_TRACE_PROTO(msg, mask, args...)  do { /* do nothing */ } while(0)
+#    define DBG_TRACE_STATE(msg, mask, args...)  do { /* do nothing */ } while(0)
+#    define DBG_TRACE_DEVEL(msg, mask, args...)  do { /* do nothing */ } while(0)
+#    define DBG_TRACE_ENTER(mask, args...)       do { /* do nothing */ } while(0)
+#    define DBG_TRACE_LEAVE(mask, args...)       do { /* do nothing */ } while(0)
+#    define DBG_TRACE_POINT(mask, args...)       do { /* do nothing */ } while(0)
 #endif
 
 extern struct list trace_sources;