From c75c0422c64f33c0102e1778cecc812c58b700e5 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Thu, 27 Sep 2018 15:21:16 -0400 Subject: [PATCH] Fix: check for event class/instance prototype mismatch The TP_ARGS() for an event instance belonging to an event class must have compatible types with the event class TP_ARGS(). Failure to follow this rule leads to a prototype mismatch between the tracepoint call site and the probe function. A common effect perceived is that events with prototype mismatch between call site and probe function are never traced. Fix this by enforcing a compile-time check of the event instance and class prototypes, similarly to what is done in LTTng modules. Signed-off-by: Mathieu Desnoyers --- include/lttng/ust-tracepoint-event.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/include/lttng/ust-tracepoint-event.h b/include/lttng/ust-tracepoint-event.h index ec292d24..7890c247 100644 --- a/include/lttng/ust-tracepoint-event.h +++ b/include/lttng/ust-tracepoint-event.h @@ -120,6 +120,30 @@ static const char \ #include TRACEPOINT_INCLUDE +/* + * Stage 0.2 of tracepoint event generation. + * + * Create dummy trace prototypes for each event class, and for each used + * template. This will allow checking whether the prototypes from the + * class and the instance using the class actually match. + */ + +/* Reset all macros within TRACEPOINT_EVENT */ +#include + +#undef TP_ARGS +#define TP_ARGS(...) __VA_ARGS__ + +#undef TRACEPOINT_EVENT_INSTANCE +#define TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ +void __event_template_proto___##_provider##___##_template(_TP_ARGS_DATA_PROTO(_args)); + +#undef TRACEPOINT_EVENT_CLASS +#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ +void __event_template_proto___##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)); + +#include TRACEPOINT_INCLUDE + /* * Stage 0.9 of tracepoint event generation * -- 2.34.1