* SOFTWARE.
*/
+#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <urcu/compiler.h>
#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 <lttng/ust-tracepoint-event-reset.h>
+
+#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
*
_values \
ctf_enum_value("", 0) /* Dummy, 0-len array forbidden by C99. */ \
};
+#include TRACEPOINT_INCLUDE
+
+/*
+ * Stage 0.9.1
+ * Verifying array and sequence elements are of an integer type.
+ */
+
+/* Reset all macros within TRACEPOINT_EVENT */
+#include <lttng/ust-tracepoint-event-reset.h>
+#include <lttng/ust-tracepoint-event-write.h>
+#include <lttng/ust-tracepoint-event-nowrite.h>
+
+#undef _ctf_array_encoded
+#define _ctf_array_encoded(_type, _item, _src, _byte_order, \
+ _length, _encoding, _nowrite, \
+ _elem_type_base) \
+ _lttng_array_element_type_is_supported(_type, _item)
+
+#undef _ctf_sequence_encoded
+#define _ctf_sequence_encoded(_type, _item, _src, _byte_order, \
+ _length_type, _src_length, _encoding, _nowrite, \
+ _elem_type_base) \
+ _lttng_array_element_type_is_supported(_type, _item)
+
+#undef TP_FIELDS
+#define TP_FIELDS(...) __VA_ARGS__ /* Only one used in this phase */
+
+#undef TRACEPOINT_EVENT_CLASS
+#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \
+ _fields
#include TRACEPOINT_INCLUDE
.name = #_item, \
.type = __type_integer(_type, _byte_order, _base, none),\
.nowrite = _nowrite, \
+ .u = { \
+ .ext = { \
+ .nofilter = 0, \
+ }, \
+ }, \
},
#undef _ctf_float
.name = #_item, \
.type = __type_float(_type), \
.nowrite = _nowrite, \
+ .u = { \
+ .ext = { \
+ .nofilter = 0, \
+ }, \
+ }, \
},
#undef _ctf_array_encoded
.name = #_item, \
.type = \
{ \
- .atype = atype_array, \
+ .atype = atype_array_nestable, \
.u = \
{ \
- .array = \
+ .array_nestable = \
{ \
- .elem_type = __type_integer(_type, _byte_order, _elem_type_base, _encoding), \
+ .elem_type = __LTTNG_COMPOUND_LITERAL(struct lttng_type, \
+ __type_integer(_type, _byte_order, _elem_type_base, _encoding)), \
.length = _length, \
+ .alignment = 0, \
} \
} \
}, \
.nowrite = _nowrite, \
+ .u = { \
+ .ext = { \
+ .nofilter = 0, \
+ }, \
+ }, \
},
#undef _ctf_sequence_encoded
#define _ctf_sequence_encoded(_type, _item, _src, _byte_order, \
_length_type, _src_length, _encoding, _nowrite, \
_elem_type_base) \
+ { \
+ .name = "_" #_item "_length", \
+ .type = __type_integer(_length_type, BYTE_ORDER, 10, none), \
+ .nowrite = _nowrite, \
+ .u = { \
+ .ext = { \
+ .nofilter = 1, \
+ }, \
+ }, \
+ }, \
{ \
.name = #_item, \
.type = \
{ \
- .atype = atype_sequence, \
+ .atype = atype_sequence_nestable, \
.u = \
{ \
- .sequence = \
+ .sequence_nestable = \
{ \
- .length_type = __type_integer(_length_type, BYTE_ORDER, 10, none), \
- .elem_type = __type_integer(_type, _byte_order, _elem_type_base, _encoding), \
+ .length_name = "_" #_item "_length", \
+ .elem_type = __LTTNG_COMPOUND_LITERAL(struct lttng_type, \
+ __type_integer(_type, _byte_order, _elem_type_base, _encoding)), \
+ .alignment = 0, \
}, \
}, \
}, \
.nowrite = _nowrite, \
+ .u = { \
+ .ext = { \
+ .nofilter = 0, \
+ }, \
+ }, \
},
#undef _ctf_string
.atype = atype_string, \
.u = \
{ \
- .basic = { .string = { .encoding = lttng_encode_UTF8 } } \
+ .string = { .encoding = lttng_encode_UTF8 } \
}, \
}, \
.nowrite = _nowrite, \
+ .u = { \
+ .ext = { \
+ .nofilter = 0, \
+ }, \
+ }, \
},
#undef _ctf_enum
{ \
.name = #_item, \
.type = { \
- .atype = atype_enum, \
+ .atype = atype_enum_nestable, \
.u = { \
- .basic = { \
- .enumeration = { \
- .desc = &__enum_##_provider##_##_name, \
- .container_type = { \
- .size = sizeof(_type) * CHAR_BIT, \
- .alignment = lttng_alignof(_type) * CHAR_BIT, \
- .signedness = lttng_is_signed_type(_type), \
- .reverse_byte_order = 0, \
- .base = 10, \
- .encoding = lttng_encode_none, \
- }, \
- }, \
- }, \
+ .enum_nestable = { \
+ .desc = &__enum_##_provider##_##_name, \
+ .container_type = __LTTNG_COMPOUND_LITERAL(struct lttng_type, \
+ __type_integer(_type, BYTE_ORDER, 10, none)), \
+ }, \
}, \
}, \
.nowrite = _nowrite, \
+ .u = { \
+ .ext = { \
+ .nofilter = 0, \
+ }, \
+ }, \
},
#undef TP_FIELDS
__chan->ops->event_write(&__ctx, _src, \
sizeof(_type) * __get_dynamic_len(dest));
-/*
- * __chan->ops->u.has_strcpy is a flag letting us know if the LTTng-UST
- * tracepoint provider ABI implements event_strcpy. This dynamic check
- * can be removed when the tracepoint provider ABI moves to 2.
- */
-#if (LTTNG_UST_PROVIDER_MAJOR > 1)
-#error "Tracepoint probe provider major version has changed. Please remove dynamic check for has_strcpy."
-#endif
-
#undef _ctf_string
#define _ctf_string(_item, _src, _nowrite) \
{ \
((_src) ? (_src) : __LTTNG_UST_NULL_STRING); \
lib_ring_buffer_align_ctx(&__ctx, \
lttng_alignof(*__ctf_tmp_string)); \
- if (__chan->ops->u.has_strcpy) \
- __chan->ops->event_strcpy(&__ctx, __ctf_tmp_string, \
- __get_dynamic_len(dest)); \
- else \
- __chan->ops->event_write(&__ctx, __ctf_tmp_string, \
- __get_dynamic_len(dest)); \
+ __chan->ops->event_strcpy(&__ctx, __ctf_tmp_string, \
+ __get_dynamic_len(dest)); \
}
struct lttng_stack_ctx __lttng_ctx; \
size_t __event_len, __event_align; \
size_t __dynamic_len_idx = 0; \
+ const size_t __num_fields = _TP_ARRAY_SIZE(__event_fields___##_provider##___##_name) - 1; \
union { \
- size_t __dynamic_len[_TP_ARRAY_SIZE(__event_fields___##_provider##___##_name) - 1]; \
- char __filter_stack_data[2 * sizeof(unsigned long) * (_TP_ARRAY_SIZE(__event_fields___##_provider##___##_name) - 1)]; \
+ size_t __dynamic_len[__num_fields]; \
+ char __filter_stack_data[2 * sizeof(unsigned long) * __num_fields]; \
} __stackvar; \
int __ret; \
\
_TP_ARGS_DATA_VAR(_args)); \
tp_list_for_each_entry_rcu(bc_runtime, &__event->bytecode_runtime_head, node) { \
if (caa_unlikely(bc_runtime->filter(bc_runtime, \
- __stackvar.__filter_stack_data) & LTTNG_FILTER_RECORD_FLAG)) \
+ __stackvar.__filter_stack_data) & LTTNG_FILTER_RECORD_FLAG)) { \
__filter_record = 1; \
+ break; \
+ } \
} \
if (caa_likely(!__filter_record)) \
return; \