#include <lttng/ringbuffer-config.h>
#include <lttng/ust-compiler.h>
#include <lttng/tracepoint.h>
-#include <byteswap.h>
+#include <lttng/ust-endian.h>
#include <string.h>
#define __LTTNG_UST_NULL_STRING "(null)"
_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
#include TRACEPOINT_INCLUDE
+/*
+ * Stage 2.1 of tracepoint event generation.
+ *
+ * Create probe event notifier callback prototypes.
+ */
+
+/* Reset all macros within TRACEPOINT_EVENT */
+#include <lttng/ust-tracepoint-event-reset.h>
+
+#undef TP_ARGS
+#define TP_ARGS(...) __VA_ARGS__
+
+#undef TRACEPOINT_EVENT_CLASS
+#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \
+static void __event_notifier_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args));
+
+#include TRACEPOINT_INCLUDE
+
/*
* Stage 3.0 of tracepoint event generation.
*
__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)); \
}
return; \
if (caa_unlikely(!TP_RCU_LINK_TEST())) \
return; \
- if (caa_unlikely(!cds_list_empty(&__event->bytecode_runtime_head))) { \
- struct lttng_bytecode_runtime *bc_runtime; \
+ if (caa_unlikely(!cds_list_empty(&__event->filter_bytecode_runtime_head))) { \
+ struct lttng_bytecode_runtime *__filter_bc_runtime; \
int __filter_record = __event->has_enablers_without_bytecode; \
\
__event_prepare_filter_stack__##_provider##___##_name(__stackvar.__filter_stack_data, \
_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)) { \
+ tp_list_for_each_entry_rcu(__filter_bc_runtime, &__event->filter_bytecode_runtime_head, node) { \
+ if (caa_unlikely(__filter_bc_runtime->interpreter_funcs.filter(__filter_bc_runtime, \
+ __stackvar.__filter_stack_data) & LTTNG_INTERPRETER_RECORD_FLAG)) { \
__filter_record = 1; \
break; \
} \
#undef _TP_EXTRACT_STRING2
+/*
+ * Stage 5.2 of tracepoint event generation.
+ *
+ * Create the event notifier probe function.
+ */
+#undef TRACEPOINT_EVENT_CLASS
+#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \
+static lttng_ust_notrace \
+void __event_notifier_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)); \
+static \
+void __event_notifier_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)) \
+{ \
+ struct lttng_event_notifier *__event_notifier = (struct lttng_event_notifier *) __tp_data; \
+ const size_t __num_fields = _TP_ARRAY_SIZE(__event_fields___##_provider##___##_name) - 1;\
+ union { \
+ size_t __dynamic_len[__num_fields]; \
+ char __filter_stack_data[2 * sizeof(unsigned long) * __num_fields]; \
+ } __stackvar; \
+ if (caa_unlikely(!CMM_ACCESS_ONCE(__event_notifier->enabled))) \
+ return; \
+ if (caa_unlikely(!TP_RCU_LINK_TEST())) \
+ return; \
+ if (caa_unlikely(!cds_list_empty(&__event_notifier->filter_bytecode_runtime_head))) { \
+ struct lttng_bytecode_runtime *__filter_bc_runtime; \
+ int __filter_record = __event_notifier->has_enablers_without_bytecode; \
+ \
+ __event_prepare_filter_stack__##_provider##___##_name(__stackvar.__filter_stack_data, \
+ _TP_ARGS_DATA_VAR(_args)); \
+ tp_list_for_each_entry_rcu(__filter_bc_runtime, &__event_notifier->filter_bytecode_runtime_head, node) { \
+ if (caa_unlikely(__filter_bc_runtime->interpreter_funcs.filter(__filter_bc_runtime, \
+ __stackvar.__filter_stack_data) & LTTNG_INTERPRETER_RECORD_FLAG)) \
+ __filter_record = 1; \
+ } \
+ if (caa_likely(!__filter_record)) \
+ return; \
+ } \
+ \
+ lttng_event_notifier_notification_send(__event_notifier); \
+}
+
+#include TRACEPOINT_INCLUDE
+
/*
* Stage 6 of tracepoint event generation.
*
.u = { \
.ext = { \
.model_emf_uri = &__ref_model_emf_uri___##_provider##___##_name, \
+ .event_notifier_callback = (void (*)(void)) &__event_notifier_probe__##_provider##___##_template,\
}, \
}, \
};