Add `interpreter_funcs` to `lttng_bytecode_runtime`
[lttng-ust.git] / include / lttng / ust-tracepoint-event.h
index 15399c7c2ea3f067dbe5968291d7fbc6d18cef2c..1f8be1a99efd4c5eeb80fd4d6db775dfbd835b11 100644 (file)
@@ -20,6 +20,7 @@
  * SOFTWARE.
  */
 
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <urcu/compiler.h>
@@ -28,7 +29,7 @@
 #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)"
@@ -120,6 +121,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 <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
  *
@@ -191,6 +216,36 @@ static const char                                                  \
                _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
 
@@ -212,6 +267,11 @@ static const char                                                  \
          .name = #_item,                                       \
          .type = __type_integer(_type, _byte_order, _base, none),\
          .nowrite = _nowrite,                                  \
+         .u = {                                                \
+                 .ext = {                                      \
+                         .nofilter = 0,                        \
+                 },                                            \
+         },                                                    \
        },
 
 #undef _ctf_float
@@ -220,6 +280,11 @@ static const char                                                  \
          .name = #_item,                                       \
          .type = __type_float(_type),                          \
          .nowrite = _nowrite,                                  \
+         .u = {                                                \
+                 .ext = {                                      \
+                         .nofilter = 0,                        \
+                 },                                            \
+         },                                                    \
        },
 
 #undef _ctf_array_encoded
@@ -230,38 +295,62 @@ static const char                                                 \
          .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
@@ -273,10 +362,15 @@ static const char                                                 \
                  .atype = atype_string,                        \
                  .u =                                          \
                        {                                       \
-                         .basic = { .string = { .encoding = lttng_encode_UTF8 } } \
+                         .string = { .encoding = lttng_encode_UTF8 } \
                        },                                      \
                },                                              \
          .nowrite = _nowrite,                                  \
+         .u = {                                                \
+                 .ext = {                                      \
+                         .nofilter = 0,                        \
+                 },                                            \
+         },                                                    \
        },
 
 #undef _ctf_enum
@@ -284,24 +378,21 @@ static const char                                                 \
        {                                                       \
                .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
@@ -342,6 +433,24 @@ static void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args));
 
 #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.
  *
@@ -666,15 +775,6 @@ size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args))      \
        __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)                             \
        {                                                                       \
@@ -682,12 +782,8 @@ size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args))      \
                        ((_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));                               \
        }
 
 
@@ -756,9 +852,10 @@ void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args))          \
        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;                                                            \
                                                                              \
@@ -774,16 +871,18 @@ void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args))         \
                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;                                        \
+                       }                                                     \
                }                                                             \
                if (caa_likely(!__filter_record))                             \
                        return;                                               \
@@ -832,6 +931,48 @@ static const char __tp_event_signature___##_provider##___##_name[] =       \
 
 #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.
  *
@@ -927,6 +1068,7 @@ static const struct lttng_event_desc __event_desc___##_provider##_##_name = {
        .u = {                                                                 \
            .ext = {                                                           \
                  .model_emf_uri = &__ref_model_emf_uri___##_provider##___##_name, \
+                 .event_notifier_callback = (void (*)(void)) &__event_notifier_probe__##_provider##___##_template,\
                },                                                             \
        },                                                                     \
 };
@@ -1007,7 +1149,7 @@ _TP_COMBINE_TOKENS(__lttng_events_init__, TRACEPOINT_PROVIDER)(void)
        _TP_COMBINE_TOKENS(__tracepoint_provider_check_, TRACEPOINT_PROVIDER)();
        ret = lttng_probe_register(&_TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PROVIDER));
        if (ret) {
-               fprintf(stderr, "LTTng-UST: Error (%d) while registering tracepoint probe. Duplicate registration of tracepoint probes having the same name is not allowed.\n", ret);
+               fprintf(stderr, "LTTng-UST: Error (%d) while registering tracepoint probe.\n", ret);
                abort();
        }
 }
This page took 0.028207 seconds and 4 git commands to generate.