X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=include%2Flttng%2Fust-tracepoint-event.h;h=5d845ae1e4bb0246cef8cda5495b89e04aa89c17;hb=HEAD;hp=8ba095bd223afb267a9b2d65044369a383dc91bb;hpb=4849bc7a9e250ce47d7a3deb0d2327cc4b50422f;p=lttng-ust.git diff --git a/include/lttng/ust-tracepoint-event.h b/include/lttng/ust-tracepoint-event.h index 8ba095bd..5d845ae1 100644 --- a/include/lttng/ust-tracepoint-event.h +++ b/include/lttng/ust-tracepoint-event.h @@ -1,8 +1,6 @@ -/* - * SPDX-License-Identifier: MIT - * - * Copyright (C) 2011-2012 Mathieu Desnoyers - */ +// SPDX-FileCopyrightText: 2011-2012 Mathieu Desnoyers +// +// SPDX-License-Identifier: MIT #include #include @@ -17,14 +15,56 @@ #include #include #include +#include -#define __LTTNG_UST_NULL_STRING "(null)" +#if LTTNG_UST_COMPAT_API(0) +#define TP_FIELDS LTTNG_UST_TP_FIELDS + +#define ctf_integer lttng_ust_field_integer +#define ctf_integer_hex lttng_ust_field_integer_hex +#define ctf_integer_network lttng_ust_field_integer_network +#define ctf_integer_network_hex lttng_ust_field_integer_network_hex +#define ctf_integer_nowrite lttng_ust_field_integer_nowrite + +#define ctf_float lttng_ust_field_float +#define ctf_float_nowrite lttng_ust_field_float_nowrite + +#define ctf_array lttng_ust_field_array +#define ctf_array_hex lttng_ust_field_array_hex +#define ctf_array_network lttng_ust_field_array_network +#define ctf_array_network_hex lttng_ust_field_array_network_hex +#define ctf_array_text lttng_ust_field_array_text +#define ctf_array_nowrite lttng_ust_field_array_nowrite +#define ctf_array_nowrite_hex lttng_ust_field_array_nowrite_hex +#define ctf_array_network_nowrite lttng_ust_field_array_network_nowrite +#define ctf_array_network_nowrite_hex lttng_ust_field_array_network_nowrite_hex +#define ctf_array_text_nowrite lttng_ust_field_array_text_nowrite + +#define ctf_sequence lttng_ust_field_sequence +#define ctf_sequence_hex lttng_ust_field_sequence_hex +#define ctf_sequence_network lttng_ust_field_sequence_network +#define ctf_sequence_network_hex lttng_ust_field_sequence_network_hex +#define ctf_sequence_text lttng_ust_field_sequence_text +#define ctf_sequence_nowrite lttng_ust_field_sequence_nowrite +#define ctf_sequence_nowrite_hex lttng_ust_field_sequence_nowrite_hex +#define ctf_sequence_network_nowrite lttng_ust_field_sequence_network_nowrite +#define ctf_sequence_network_nowrite_hex lttng_ust_field_sequence_network_nowrite_hex +#define ctf_sequence_text_nowrite lttng_ust_field_sequence_text_nowrite + +#define ctf_string lttng_ust_field_string +#define ctf_string_nowrite lttng_ust_field_string_nowrite + +#define ctf_unused lttng_ust_field_unused +#define ctf_unused_nowrite lttng_ust_field_unused_nowrite + +#define ctf_enum lttng_ust_field_enum +#define ctf_enum_nowrite lttng_ust_field_enum_nowrite +#define ctf_enum_value lttng_ust_field_enum_value +#define ctf_enum_range lttng_ust_field_enum_range +#define ctf_enum_auto lttng_ust_field_enum_auto +#endif /* #if LTTNG_UST_COMPAT_API(0) */ -#undef tp_list_for_each_entry_rcu -#define tp_list_for_each_entry_rcu(pos, head, member) \ - for (pos = cds_list_entry(tp_rcu_dereference((head)->next), __typeof__(*pos), member); \ - &pos->member != (head); \ - pos = cds_list_entry(tp_rcu_dereference(pos->member.next), __typeof__(*pos), member)) +#define LTTNG_UST__NULL_STRING "(null)" /* * LTTNG_UST_TRACEPOINT_EVENT_CLASS declares a class of tracepoints receiving the @@ -42,7 +82,7 @@ LTTNG_UST__TRACEPOINT_EVENT_CLASS(_provider, _name, \ LTTNG_UST__TP_PARAMS(_args), \ LTTNG_UST__TP_PARAMS(_fields)) \ - LTTNG_UST__TRACEPOINT_EVENT_INSTANCE(_provider, _name, _name, \ + LTTNG_UST__TRACEPOINT_EVENT_INSTANCE(_provider, _name, _provider, _name, \ LTTNG_UST__TP_PARAMS(_args)) #undef LTTNG_UST_TRACEPOINT_EVENT_CLASS @@ -50,17 +90,17 @@ LTTNG_UST__TRACEPOINT_EVENT_CLASS(_provider, _name, LTTNG_UST__TP_PARAMS(_args), LTTNG_UST__TP_PARAMS(_fields)) #undef LTTNG_UST_TRACEPOINT_EVENT_INSTANCE -#define LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ - LTTNG_UST__TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, LTTNG_UST__TP_PARAMS(_args)) +#define LTTNG_UST_TRACEPOINT_EVENT_INSTANCE(_template_provider, _template_name, _provider, _name, _args) \ + LTTNG_UST__TRACEPOINT_EVENT_INSTANCE(_template_provider, _template_name, _provider, _name, LTTNG_UST__TP_PARAMS(_args)) /* Helpers */ -#define _TP_ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) +#define LTTNG_UST__TP_ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) -#define _tp_max_t(type, x, y) \ +#define lttng_ust__tp_max_t(type, x, y) \ ({ \ - type __max1 = (x); \ - type __max2 = (y); \ - __max1 > __max2 ? __max1: __max2; \ + type lttng_ust__max1 = (x); \ + type lttng_ust__max2 = (y); \ + lttng_ust__max1 > lttng_ust__max2 ? lttng_ust__max1: lttng_ust__max2; \ }) /* @@ -86,7 +126,7 @@ void LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust_tracepoint_provider_mismatch_, LTTNG lttng_ust_tracepoint_provider_mismatch_##_provider(); #undef LTTNG_UST__TRACEPOINT_EVENT_INSTANCE -#define LTTNG_UST__TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ +#define LTTNG_UST__TRACEPOINT_EVENT_INSTANCE(_template_provider, _template_name, _provider, _name, _args) \ lttng_ust_tracepoint_provider_mismatch_##_provider(); static inline @@ -109,7 +149,7 @@ void LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust_tracepoint_provider_check_, LTTNG_US #include #undef LTTNG_UST__TRACEPOINT_EVENT_INSTANCE -#define LTTNG_UST__TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ +#define LTTNG_UST__TRACEPOINT_EVENT_INSTANCE(_template_provider, _template_name, _provider, _name, _args) \ lttng_ust_tracepoint_validate_name_len(_provider, _name); #include LTTNG_UST_TRACEPOINT_INCLUDE @@ -129,12 +169,12 @@ void LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust_tracepoint_provider_check_, LTTNG_US #define LTTNG_UST_TP_ARGS(...) __VA_ARGS__ #undef LTTNG_UST__TRACEPOINT_EVENT_INSTANCE -#define LTTNG_UST__TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ -void __event_template_proto___##_provider##___##_template(LTTNG_UST__TP_ARGS_DATA_PROTO(_args)); +#define LTTNG_UST__TRACEPOINT_EVENT_INSTANCE(_template_provider, _template_name, _provider, _name, _args) \ +void lttng_ust__event_template_proto___##_template_provider##___##_template_name(LTTNG_UST__TP_ARGS_DATA_PROTO(_args)); #undef LTTNG_UST__TRACEPOINT_EVENT_CLASS #define LTTNG_UST__TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ -void __event_template_proto___##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PROTO(_args)); +void lttng_ust__event_template_proto___##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PROTO(_args)); #include LTTNG_UST_TRACEPOINT_INCLUDE @@ -146,8 +186,8 @@ void __event_template_proto___##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PR #include /* Enumeration entry (single value) */ -#undef ctf_enum_value -#define ctf_enum_value(_string, _value) \ +#undef lttng_ust_field_enum_value +#define lttng_ust_field_enum_value(_string, _value) \ LTTNG_UST_COMPOUND_LITERAL(const struct lttng_ust_enum_entry, { \ .struct_size = sizeof(struct lttng_ust_enum_entry), \ .start = { \ @@ -164,8 +204,8 @@ void __event_template_proto___##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PR }), /* Enumeration entry (range) */ -#undef ctf_enum_range -#define ctf_enum_range(_string, _range_start, _range_end) \ +#undef lttng_ust_field_enum_range +#define lttng_ust_field_enum_range(_string, _range_start, _range_end) \ LTTNG_UST_COMPOUND_LITERAL(const struct lttng_ust_enum_entry, { \ .struct_size = sizeof(struct lttng_ust_enum_entry), \ .start = { \ @@ -182,8 +222,8 @@ void __event_template_proto___##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PR }), /* Enumeration entry (automatic value; follows the rules of CTF) */ -#undef ctf_enum_auto -#define ctf_enum_auto(_string) \ +#undef lttng_ust_field_enum_auto +#define lttng_ust_field_enum_auto(_string) \ LTTNG_UST_COMPOUND_LITERAL(const struct lttng_ust_enum_entry, { \ .struct_size = sizeof(struct lttng_ust_enum_entry), \ .start = { \ @@ -211,13 +251,52 @@ void __event_template_proto___##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PR #define LTTNG_UST_TRACEPOINT_ENUM(_provider, _name, _values) \ const struct lttng_ust_enum_entry * const __enum_values__##_provider##_##_name[] = { \ _values \ - ctf_enum_value("", 0) /* Dummy, 0-len array forbidden by C99. */ \ + lttng_ust_field_enum_value("", 0) /* Dummy, 0-len array forbidden by C99. */ \ }; #include LTTNG_UST_TRACEPOINT_INCLUDE + +/* + * Stage 0.9.0 + * Verifying sequence length types are of an unsigned type. + */ + +/* Reset all macros within LTTNG_UST_TRACEPOINT_EVENT */ +#include +#include +#include + +/* + * Note that it is not possible to encode the length type as a C identifier, + * since it can be multiple tokens. + */ +#undef lttng_ust__field_sequence_encoded +#define lttng_ust__field_sequence_encoded(_type, _item, _src, _byte_order, \ + _length_type, _src_length, _encoding, _nowrite, \ + _elem_type_base) \ + lttng_ust_static_assert(!lttng_ust_is_signed_type(_length_type), \ + "Length type " #_length_type " is not a unsigned integer type", \ + Length_type_is_not_a_unsigned_integer_type); + +#undef LTTNG_UST_TP_FIELDS +#define LTTNG_UST_TP_FIELDS(...) __VA_ARGS__ /* Only one used in this phase */ + +#undef LTTNG_UST__TRACEPOINT_EVENT_CLASS +#define LTTNG_UST__TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ + _fields + +#include LTTNG_UST_TRACEPOINT_INCLUDE + +#if defined(__cplusplus) + /* * Stage 0.9.1 - * Verifying array and sequence elements are of an integer type. + * Verifying array and sequence elements are of an integer or pointer + * type. + * + * This compile-time check is only enabled in C++, because the C + * implementation of lttng_ust_is_pointer_type does not support opaque + * pointer types. */ /* Reset all macros within LTTNG_UST_TRACEPOINT_EVENT */ @@ -225,17 +304,17 @@ void __event_template_proto___##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PR #include #include -#undef _ctf_array_encoded -#define _ctf_array_encoded(_type, _item, _src, _byte_order, \ +#undef lttng_ust__field_array_encoded +#define lttng_ust__field_array_encoded(_type, _item, _src, _byte_order, \ _length, _encoding, _nowrite, \ _elem_type_base) \ - lttng_ust_ctf_array_element_type_is_supported(_type, _item); + lttng_ust_field_array_element_type_is_supported(_type, _item); -#undef _ctf_sequence_encoded -#define _ctf_sequence_encoded(_type, _item, _src, _byte_order, \ +#undef lttng_ust__field_sequence_encoded +#define lttng_ust__field_sequence_encoded(_type, _item, _src, _byte_order, \ _length_type, _src_length, _encoding, _nowrite, \ _elem_type_base) \ - lttng_ust_ctf_array_element_type_is_supported(_type, _item); + lttng_ust_field_array_element_type_is_supported(_type, _item); #undef LTTNG_UST_TP_FIELDS #define LTTNG_UST_TP_FIELDS(...) __VA_ARGS__ /* Only one used in this phase */ @@ -246,9 +325,65 @@ void __event_template_proto___##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PR #include LTTNG_UST_TRACEPOINT_INCLUDE +#endif + +/* + * Stage 0.9.2 of tracepoint event generation. + * + * Create probe signature + */ + +/* Reset all macros within LTTNG_UST_TRACEPOINT_EVENT */ +#include + +#undef LTTNG_UST_TP_ARGS +#define LTTNG_UST_TP_ARGS(...) __VA_ARGS__ + +#define LTTNG_UST__TP_EXTRACT_STRING2(...) #__VA_ARGS__ + +#undef LTTNG_UST__TRACEPOINT_EVENT_CLASS +#define LTTNG_UST__TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ +static const char __tp_event_signature___##_provider##___##_name[] = \ + LTTNG_UST__TP_EXTRACT_STRING2(_args); + +#include LTTNG_UST_TRACEPOINT_INCLUDE + +#undef LTTNG_UST__TP_EXTRACT_STRING2 + /* * Stage 1 of tracepoint event generation. * + * Create probe callback prototypes. + */ + +/* Reset all macros within LTTNG_UST_TRACEPOINT_EVENT */ +#include + +#undef LTTNG_UST_TP_ARGS +#define LTTNG_UST_TP_ARGS(...) __VA_ARGS__ + +#undef LTTNG_UST__TRACEPOINT_EVENT_CLASS +#define LTTNG_UST__TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ +static void lttng_ust__event_probe__##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PROTO(_args)); + +#include LTTNG_UST_TRACEPOINT_INCLUDE + +/* + * Stage 1.1 of tracepoint event generation. + * + * Declare toplevel descriptor for the whole probe. + * Unlike C, C++ does not allow tentative definitions. Therefore, we + * need to explicitly declare the variable with "extern", using hidden + * visibility to keep this symbol from being exported to the global + * symbol table. + */ + +extern const struct lttng_ust_probe_desc LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__probe_desc___, LTTNG_UST_TRACEPOINT_PROVIDER) + __attribute__((visibility("hidden"))); + +/* + * Stage 2 of tracepoint event generation. + * * Create event field type metadata section. * Each event produce an array of fields. */ @@ -258,8 +393,8 @@ void __event_template_proto___##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PR #include #include -#undef _ctf_integer_ext -#define _ctf_integer_ext(_type, _item, _src, _byte_order, _base, _nowrite) \ +#undef lttng_ust__field_integer_ext +#define lttng_ust__field_integer_ext(_type, _item, _src, _byte_order, _base, _nowrite) \ LTTNG_UST_COMPOUND_LITERAL(const struct lttng_ust_event_field, { \ .struct_size = sizeof(struct lttng_ust_event_field), \ .name = #_item, \ @@ -268,8 +403,8 @@ void __event_template_proto___##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PR .nofilter = 0, \ }), -#undef _ctf_float -#define _ctf_float(_type, _item, _src, _nowrite) \ +#undef lttng_ust__field_float +#define lttng_ust__field_float(_type, _item, _src, _nowrite) \ LTTNG_UST_COMPOUND_LITERAL(const struct lttng_ust_event_field, { \ .struct_size = sizeof(struct lttng_ust_event_field), \ .name = #_item, \ @@ -278,8 +413,8 @@ void __event_template_proto___##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PR .nofilter = 0, \ }), -#undef _ctf_array_encoded -#define _ctf_array_encoded(_type, _item, _src, _byte_order, \ +#undef lttng_ust__field_array_encoded +#define lttng_ust__field_array_encoded(_type, _item, _src, _byte_order, \ _length, _encoding, _nowrite, \ _elem_type_base) \ LTTNG_UST_COMPOUND_LITERAL(const struct lttng_ust_event_field, { \ @@ -299,14 +434,14 @@ void __event_template_proto___##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PR .nofilter = 0, \ }), -#undef _ctf_sequence_encoded -#define _ctf_sequence_encoded(_type, _item, _src, _byte_order, \ +#undef lttng_ust__field_sequence_encoded +#define lttng_ust__field_sequence_encoded(_type, _item, _src, _byte_order, \ _length_type, _src_length, _encoding, _nowrite, \ _elem_type_base) \ LTTNG_UST_COMPOUND_LITERAL(const struct lttng_ust_event_field, { \ .struct_size = sizeof(struct lttng_ust_event_field), \ .name = "_" #_item "_length", \ - .type = lttng_ust_type_integer_define(_length_type, BYTE_ORDER, 10), \ + .type = lttng_ust_type_integer_define(_length_type, LTTNG_UST_BYTE_ORDER, 10), \ .nowrite = _nowrite, \ .nofilter = 1, \ }), \ @@ -318,7 +453,7 @@ void __event_template_proto___##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PR .type = lttng_ust_type_sequence, \ }, \ .struct_size = sizeof(struct lttng_ust_type_sequence), \ - .length_name = "_" #_item "_length", \ + .length_name = NULL, /* Use previous field. */ \ .elem_type = lttng_ust_type_integer_define(_type, _byte_order, _elem_type_base), \ .alignment = 0, \ .encoding = lttng_ust_string_encoding_##_encoding, \ @@ -327,8 +462,8 @@ void __event_template_proto___##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PR .nofilter = 0, \ }), -#undef _ctf_string -#define _ctf_string(_item, _src, _nowrite) \ +#undef lttng_ust__field_string +#define lttng_ust__field_string(_item, _src, _nowrite) \ LTTNG_UST_COMPOUND_LITERAL(const struct lttng_ust_event_field, { \ .struct_size = sizeof(struct lttng_ust_event_field), \ .name = #_item, \ @@ -343,11 +478,11 @@ void __event_template_proto___##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PR .nofilter = 0, \ }), -#undef _ctf_unused -#define _ctf_unused(_src) +#undef lttng_ust__field_unused +#define lttng_ust__field_unused(_src) -#undef _ctf_enum -#define _ctf_enum(_provider, _name, _type, _item, _src, _nowrite) \ +#undef lttng_ust__field_enum +#define lttng_ust__field_enum(_provider, _name, _type, _item, _src, _nowrite) \ LTTNG_UST_COMPOUND_LITERAL(const struct lttng_ust_event_field, { \ .struct_size = sizeof(struct lttng_ust_event_field), \ .name = #_item, \ @@ -357,7 +492,7 @@ void __event_template_proto___##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PR }, \ .struct_size = sizeof(struct lttng_ust_type_enum), \ .desc = &__enum_##_provider##_##_name, \ - .container_type = lttng_ust_type_integer_define(_type, BYTE_ORDER, 10), \ + .container_type = lttng_ust_type_integer_define(_type, LTTNG_UST_BYTE_ORDER, 10), \ }), \ .nowrite = _nowrite, \ .nofilter = 0, \ @@ -368,9 +503,17 @@ void __event_template_proto___##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PR #undef LTTNG_UST__TRACEPOINT_EVENT_CLASS #define LTTNG_UST__TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ - static const struct lttng_ust_event_field * const __event_fields___##_provider##___##_name[] = { \ + static const struct lttng_ust_event_field * const lttng_ust__event_fields___##_provider##___##_name[] = { \ _fields \ - ctf_integer(int, dummy, 0) /* Dummy, C99 forbids 0-len array. */ \ + lttng_ust_field_integer(int, dummy, 0) /* Dummy, C99 forbids 0-len array. */ \ + }; \ + static const struct lttng_ust_tracepoint_class lttng_ust__event_class___##_provider##___##_name = { \ + .struct_size = sizeof(struct lttng_ust_tracepoint_class), \ + .fields = lttng_ust__event_fields___##_provider##___##_name, \ + .nr_fields = LTTNG_UST__TP_ARRAY_SIZE(lttng_ust__event_fields___##_provider##___##_name) - 1, \ + .probe_callback = (void (*)(void)) <tng_ust__event_probe__##_provider##___##_name, \ + .signature = __tp_event_signature___##_provider##___##_name, \ + .probe_desc = <tng_ust__probe_desc___##_provider, \ }; #undef LTTNG_UST_TRACEPOINT_ENUM @@ -379,29 +522,12 @@ void __event_template_proto___##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PR .struct_size = sizeof(struct lttng_ust_enum_desc), \ .name = #_provider "_" #_name, \ .entries = __enum_values__##_provider##_##_name, \ - .nr_entries = _TP_ARRAY_SIZE(__enum_values__##_provider##_##_name) - 1, \ + .nr_entries = LTTNG_UST__TP_ARRAY_SIZE(__enum_values__##_provider##_##_name) - 1, \ + .probe_desc = <tng_ust__probe_desc___##_provider, \ }; #include LTTNG_UST_TRACEPOINT_INCLUDE -/* - * Stage 2 of tracepoint event generation. - * - * Create probe callback prototypes. - */ - -/* Reset all macros within LTTNG_UST_TRACEPOINT_EVENT */ -#include - -#undef LTTNG_UST_TP_ARGS -#define LTTNG_UST_TP_ARGS(...) __VA_ARGS__ - -#undef LTTNG_UST__TRACEPOINT_EVENT_CLASS -#define LTTNG_UST__TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ -static void __event_probe__##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PROTO(_args)); - -#include LTTNG_UST_TRACEPOINT_INCLUDE - /* * Stage 3.0 of tracepoint event generation. * @@ -412,30 +538,30 @@ static void __event_probe__##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PROTO #include #include -#undef _ctf_integer_ext -#define _ctf_integer_ext(_type, _item, _src, _byte_order, _base, _nowrite) \ +#undef lttng_ust__field_integer_ext +#define lttng_ust__field_integer_ext(_type, _item, _src, _byte_order, _base, _nowrite) \ if (0) \ (void) (_src); /* Unused */ \ __event_len += lttng_ust_ring_buffer_align(__event_len, lttng_ust_rb_alignof(_type)); \ __event_len += sizeof(_type); -#undef _ctf_float -#define _ctf_float(_type, _item, _src, _nowrite) \ +#undef lttng_ust__field_float +#define lttng_ust__field_float(_type, _item, _src, _nowrite) \ if (0) \ (void) (_src); /* Unused */ \ __event_len += lttng_ust_ring_buffer_align(__event_len, lttng_ust_rb_alignof(_type)); \ __event_len += sizeof(_type); -#undef _ctf_array_encoded -#define _ctf_array_encoded(_type, _item, _src, _byte_order, _length, _encoding, \ +#undef lttng_ust__field_array_encoded +#define lttng_ust__field_array_encoded(_type, _item, _src, _byte_order, _length, _encoding, \ _nowrite, _elem_type_base) \ if (0) \ (void) (_src); /* Unused */ \ __event_len += lttng_ust_ring_buffer_align(__event_len, lttng_ust_rb_alignof(_type)); \ __event_len += sizeof(_type) * (_length); -#undef _ctf_sequence_encoded -#define _ctf_sequence_encoded(_type, _item, _src, _byte_order, _length_type, \ +#undef lttng_ust__field_sequence_encoded +#define lttng_ust__field_sequence_encoded(_type, _item, _src, _byte_order, _length_type, \ _src_length, _encoding, _nowrite, _elem_type_base) \ if (0) \ (void) (_src); /* Unused */ \ @@ -446,19 +572,19 @@ static void __event_probe__##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PROTO __event_len += sizeof(_type) * __dynamic_len[__dynamic_len_idx]; \ __dynamic_len_idx++; -#undef _ctf_string -#define _ctf_string(_item, _src, _nowrite) \ +#undef lttng_ust__field_string +#define lttng_ust__field_string(_item, _src, _nowrite) \ __event_len += __dynamic_len[__dynamic_len_idx++] = \ - strlen((_src) ? (_src) : __LTTNG_UST_NULL_STRING) + 1; + strlen((_src) ? (_src) : LTTNG_UST__NULL_STRING) + 1; -#undef _ctf_unused -#define _ctf_unused(_src) \ +#undef lttng_ust__field_unused +#define lttng_ust__field_unused(_src) \ if (0) \ (void) (_src); /* Unused */ -#undef _ctf_enum -#define _ctf_enum(_provider, _name, _type, _item, _src, _nowrite) \ - _ctf_integer_ext(_type, _item, _src, BYTE_ORDER, 10, _nowrite) +#undef lttng_ust__field_enum +#define lttng_ust__field_enum(_provider, _name, _type, _item, _src, _nowrite) \ + lttng_ust__field_integer_ext(_type, _item, _src, LTTNG_UST_BYTE_ORDER, 10, _nowrite) #undef LTTNG_UST_TP_ARGS #define LTTNG_UST_TP_ARGS(...) __VA_ARGS__ @@ -469,10 +595,10 @@ static void __event_probe__##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PROTO #undef LTTNG_UST__TRACEPOINT_EVENT_CLASS #define LTTNG_UST__TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ static inline \ -size_t __event_get_size__##_provider##___##_name(size_t *__dynamic_len, LTTNG_UST__TP_ARGS_DATA_PROTO(_args)) \ +size_t lttng_ust__event_get_size__##_provider##___##_name(size_t *__dynamic_len, LTTNG_UST__TP_ARGS_DATA_PROTO(_args)) \ lttng_ust_notrace; \ static inline \ -size_t __event_get_size__##_provider##___##_name( \ +size_t lttng_ust__event_get_size__##_provider##___##_name( \ size_t *__dynamic_len __attribute__((__unused__)), \ LTTNG_UST__TP_ARGS_DATA_PROTO(_args)) \ { \ @@ -500,8 +626,8 @@ size_t __event_get_size__##_provider##___##_name( \ #include #include -#undef _ctf_integer_ext -#define _ctf_integer_ext(_type, _item, _src, _byte_order, _base, _nowrite) \ +#undef lttng_ust__field_integer_ext +#define lttng_ust__field_integer_ext(_type, _item, _src, _byte_order, _base, _nowrite) \ if (lttng_ust_is_signed_type(_type)) { \ int64_t __ctf_tmp_int64; \ switch (sizeof(_type)) { \ @@ -514,24 +640,24 @@ size_t __event_get_size__##_provider##___##_name( \ case 2: \ { \ union { _type t; int16_t v; } __tmp = { (_type) (_src) }; \ - if (_byte_order != BYTE_ORDER) \ - __tmp.v = bswap_16(__tmp.v); \ + if (_byte_order != LTTNG_UST_BYTE_ORDER) \ + __tmp.v = lttng_ust_bswap_16(__tmp.v); \ __ctf_tmp_int64 = (int64_t) __tmp.v; \ break; \ } \ case 4: \ { \ union { _type t; int32_t v; } __tmp = { (_type) (_src) }; \ - if (_byte_order != BYTE_ORDER) \ - __tmp.v = bswap_32(__tmp.v); \ + if (_byte_order != LTTNG_UST_BYTE_ORDER) \ + __tmp.v = lttng_ust_bswap_32(__tmp.v); \ __ctf_tmp_int64 = (int64_t) __tmp.v; \ break; \ } \ case 8: \ { \ union { _type t; int64_t v; } __tmp = { (_type) (_src) }; \ - if (_byte_order != BYTE_ORDER) \ - __tmp.v = bswap_64(__tmp.v); \ + if (_byte_order != LTTNG_UST_BYTE_ORDER) \ + __tmp.v = lttng_ust_bswap_64(__tmp.v); \ __ctf_tmp_int64 = (int64_t) __tmp.v; \ break; \ } \ @@ -551,24 +677,24 @@ size_t __event_get_size__##_provider##___##_name( \ case 2: \ { \ union { _type t; uint16_t v; } __tmp = { (_type) (_src) }; \ - if (_byte_order != BYTE_ORDER) \ - __tmp.v = bswap_16(__tmp.v); \ + if (_byte_order != LTTNG_UST_BYTE_ORDER) \ + __tmp.v = lttng_ust_bswap_16(__tmp.v); \ __ctf_tmp_uint64 = (uint64_t) __tmp.v; \ break; \ } \ case 4: \ { \ union { _type t; uint32_t v; } __tmp = { (_type) (_src) }; \ - if (_byte_order != BYTE_ORDER) \ - __tmp.v = bswap_32(__tmp.v); \ + if (_byte_order != LTTNG_UST_BYTE_ORDER) \ + __tmp.v = lttng_ust_bswap_32(__tmp.v); \ __ctf_tmp_uint64 = (uint64_t) __tmp.v; \ break; \ } \ case 8: \ { \ union { _type t; uint64_t v; } __tmp = { (_type) (_src) }; \ - if (_byte_order != BYTE_ORDER) \ - __tmp.v = bswap_64(__tmp.v); \ + if (_byte_order != LTTNG_UST_BYTE_ORDER) \ + __tmp.v = lttng_ust_bswap_64(__tmp.v); \ __ctf_tmp_uint64 = (uint64_t) __tmp.v; \ break; \ } \ @@ -579,16 +705,16 @@ size_t __event_get_size__##_provider##___##_name( \ } \ __stack_data += sizeof(int64_t); -#undef _ctf_float -#define _ctf_float(_type, _item, _src, _nowrite) \ +#undef lttng_ust__field_float +#define lttng_ust__field_float(_type, _item, _src, _nowrite) \ { \ double __ctf_tmp_double = (double) (_type) (_src); \ memcpy(__stack_data, &__ctf_tmp_double, sizeof(double)); \ __stack_data += sizeof(double); \ } -#undef _ctf_array_encoded -#define _ctf_array_encoded(_type, _item, _src, _byte_order, _length, \ +#undef lttng_ust__field_array_encoded +#define lttng_ust__field_array_encoded(_type, _item, _src, _byte_order, _length, \ _encoding, _nowrite, _elem_type_base) \ { \ unsigned long __ctf_tmp_ulong = (unsigned long) (_length); \ @@ -599,8 +725,8 @@ size_t __event_get_size__##_provider##___##_name( \ __stack_data += sizeof(void *); \ } -#undef _ctf_sequence_encoded -#define _ctf_sequence_encoded(_type, _item, _src, _byte_order, _length_type, \ +#undef lttng_ust__field_sequence_encoded +#define lttng_ust__field_sequence_encoded(_type, _item, _src, _byte_order, _length_type, \ _src_length, _encoding, _nowrite, _elem_type_base) \ { \ unsigned long __ctf_tmp_ulong = (unsigned long) (_src_length); \ @@ -611,23 +737,23 @@ size_t __event_get_size__##_provider##___##_name( \ __stack_data += sizeof(void *); \ } -#undef _ctf_string -#define _ctf_string(_item, _src, _nowrite) \ +#undef lttng_ust__field_string +#define lttng_ust__field_string(_item, _src, _nowrite) \ { \ const void *__ctf_tmp_ptr = \ - ((_src) ? (_src) : __LTTNG_UST_NULL_STRING); \ + ((_src) ? (_src) : LTTNG_UST__NULL_STRING); \ memcpy(__stack_data, &__ctf_tmp_ptr, sizeof(void *)); \ __stack_data += sizeof(void *); \ } -#undef _ctf_unused -#define _ctf_unused(_src) \ +#undef lttng_ust__field_unused +#define lttng_ust__field_unused(_src) \ if (0) \ (void) (_src); -#undef _ctf_enum -#define _ctf_enum(_provider, _name, _type, _item, _src, _nowrite) \ - _ctf_integer_ext(_type, _item, _src, BYTE_ORDER, 10, _nowrite) +#undef lttng_ust__field_enum +#define lttng_ust__field_enum(_provider, _name, _type, _item, _src, _nowrite) \ + lttng_ust__field_integer_ext(_type, _item, _src, LTTNG_UST_BYTE_ORDER, 10, _nowrite) #undef LTTNG_UST_TP_ARGS #define LTTNG_UST_TP_ARGS(...) __VA_ARGS__ @@ -638,7 +764,7 @@ size_t __event_get_size__##_provider##___##_name( \ #undef LTTNG_UST__TRACEPOINT_EVENT_CLASS #define LTTNG_UST__TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ static inline \ -void __event_prepare_interpreter_stack__##_provider##___##_name(char *__stack_data,\ +void lttng_ust__event_prepare_interpreter_stack__##_provider##___##_name(char *__stack_data,\ LTTNG_UST__TP_ARGS_DATA_PROTO(_args)) \ { \ if (0) { \ @@ -661,48 +787,48 @@ void __event_prepare_interpreter_stack__##_provider##___##_name(char *__stack_da #include #include -#undef _ctf_integer_ext -#define _ctf_integer_ext(_type, _item, _src, _byte_order, _base, _nowrite) \ +#undef lttng_ust__field_integer_ext +#define lttng_ust__field_integer_ext(_type, _item, _src, _byte_order, _base, _nowrite) \ if (0) \ (void) (_src); /* Unused */ \ - __event_align = _tp_max_t(size_t, __event_align, lttng_ust_rb_alignof(_type)); + __event_align = lttng_ust__tp_max_t(size_t, __event_align, lttng_ust_rb_alignof(_type)); -#undef _ctf_float -#define _ctf_float(_type, _item, _src, _nowrite) \ +#undef lttng_ust__field_float +#define lttng_ust__field_float(_type, _item, _src, _nowrite) \ if (0) \ (void) (_src); /* Unused */ \ - __event_align = _tp_max_t(size_t, __event_align, lttng_ust_rb_alignof(_type)); + __event_align = lttng_ust__tp_max_t(size_t, __event_align, lttng_ust_rb_alignof(_type)); -#undef _ctf_array_encoded -#define _ctf_array_encoded(_type, _item, _src, _byte_order, _length, \ +#undef lttng_ust__field_array_encoded +#define lttng_ust__field_array_encoded(_type, _item, _src, _byte_order, _length, \ _encoding, _nowrite, _elem_type_base) \ if (0) \ (void) (_src); /* Unused */ \ - __event_align = _tp_max_t(size_t, __event_align, lttng_ust_rb_alignof(_type)); + __event_align = lttng_ust__tp_max_t(size_t, __event_align, lttng_ust_rb_alignof(_type)); -#undef _ctf_sequence_encoded -#define _ctf_sequence_encoded(_type, _item, _src, _byte_order, _length_type, \ +#undef lttng_ust__field_sequence_encoded +#define lttng_ust__field_sequence_encoded(_type, _item, _src, _byte_order, _length_type, \ _src_length, _encoding, _nowrite, _elem_type_base) \ if (0) \ (void) (_src); /* Unused */ \ if (0) \ (void) (_src_length); /* Unused */ \ - __event_align = _tp_max_t(size_t, __event_align, lttng_ust_rb_alignof(_length_type)); \ - __event_align = _tp_max_t(size_t, __event_align, lttng_ust_rb_alignof(_type)); + __event_align = lttng_ust__tp_max_t(size_t, __event_align, lttng_ust_rb_alignof(_length_type)); \ + __event_align = lttng_ust__tp_max_t(size_t, __event_align, lttng_ust_rb_alignof(_type)); -#undef _ctf_string -#define _ctf_string(_item, _src, _nowrite) \ +#undef lttng_ust__field_string +#define lttng_ust__field_string(_item, _src, _nowrite) \ if (0) \ (void) (_src); /* Unused */ -#undef _ctf_unused -#define _ctf_unused(_src) \ +#undef lttng_ust__field_unused +#define lttng_ust__field_unused(_src) \ if (0) \ (void) (_src); /* Unused */ -#undef _ctf_enum -#define _ctf_enum(_provider, _name, _type, _item, _src, _nowrite) \ - _ctf_integer_ext(_type, _item, _src, BYTE_ORDER, 10, _nowrite) +#undef lttng_ust__field_enum +#define lttng_ust__field_enum(_provider, _name, _type, _item, _src, _nowrite) \ + lttng_ust__field_integer_ext(_type, _item, _src, LTTNG_UST_BYTE_ORDER, 10, _nowrite) #undef LTTNG_UST_TP_ARGS #define LTTNG_UST_TP_ARGS(...) __VA_ARGS__ @@ -713,10 +839,10 @@ void __event_prepare_interpreter_stack__##_provider##___##_name(char *__stack_da #undef LTTNG_UST__TRACEPOINT_EVENT_CLASS #define LTTNG_UST__TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ static inline \ -size_t __event_get_align__##_provider##___##_name(LTTNG_UST__TP_ARGS_PROTO(_args)) \ +size_t lttng_ust__event_get_align__##_provider##___##_name(LTTNG_UST__TP_ARGS_PROTO(_args)) \ lttng_ust_notrace; \ static inline \ -size_t __event_get_align__##_provider##___##_name(LTTNG_UST__TP_ARGS_PROTO(_args)) \ +size_t lttng_ust__event_get_align__##_provider##___##_name(LTTNG_UST__TP_ARGS_PROTO(_args)) \ { \ size_t __event_align = 1; \ _fields \ @@ -737,30 +863,30 @@ size_t __event_get_align__##_provider##___##_name(LTTNG_UST__TP_ARGS_PROTO(_args #include #include -#undef _ctf_integer_ext -#define _ctf_integer_ext(_type, _item, _src, _byte_order, _base, _nowrite) \ +#undef lttng_ust__field_integer_ext +#define lttng_ust__field_integer_ext(_type, _item, _src, _byte_order, _base, _nowrite) \ { \ _type __tmp = (_src); \ __chan->ops->event_write(&__ctx, &__tmp, sizeof(__tmp), lttng_ust_rb_alignof(__tmp));\ } -#undef _ctf_float -#define _ctf_float(_type, _item, _src, _nowrite) \ +#undef lttng_ust__field_float +#define lttng_ust__field_float(_type, _item, _src, _nowrite) \ { \ _type __tmp = (_src); \ __chan->ops->event_write(&__ctx, &__tmp, sizeof(__tmp), lttng_ust_rb_alignof(__tmp));\ } -#undef _ctf_array_encoded -#define _ctf_array_encoded(_type, _item, _src, _byte_order, _length, \ +#undef lttng_ust__field_array_encoded +#define lttng_ust__field_array_encoded(_type, _item, _src, _byte_order, _length, \ _encoding, _nowrite, _elem_type_base) \ if (lttng_ust_string_encoding_##_encoding == lttng_ust_string_encoding_none) \ __chan->ops->event_write(&__ctx, _src, sizeof(_type) * (_length), lttng_ust_rb_alignof(_type)); \ else \ - __chan->ops->event_pstrcpy_pad(&__ctx, (const char *) (_src), _length); \ + __chan->ops->event_pstrcpy_pad(&__ctx, (const char *) (_src), _length); -#undef _ctf_sequence_encoded -#define _ctf_sequence_encoded(_type, _item, _src, _byte_order, _length_type, \ +#undef lttng_ust__field_sequence_encoded +#define lttng_ust__field_sequence_encoded(_type, _item, _src, _byte_order, _length_type, \ _src_length, _encoding, _nowrite, _elem_type_base) \ { \ _length_type __tmpl = __stackvar.__dynamic_len[__dynamic_len_idx]; \ @@ -768,29 +894,29 @@ size_t __event_get_align__##_provider##___##_name(LTTNG_UST__TP_ARGS_PROTO(_args } \ if (lttng_ust_string_encoding_##_encoding == lttng_ust_string_encoding_none) \ __chan->ops->event_write(&__ctx, _src, \ - sizeof(_type) * __get_dynamic_len(dest), lttng_ust_rb_alignof(_type)); \ + sizeof(_type) * lttng_ust__get_dynamic_len(dest), lttng_ust_rb_alignof(_type)); \ else \ - __chan->ops->event_pstrcpy_pad(&__ctx, (const char *) (_src), __get_dynamic_len(dest)); \ + __chan->ops->event_pstrcpy_pad(&__ctx, (const char *) (_src), lttng_ust__get_dynamic_len(dest)); \ -#undef _ctf_string -#define _ctf_string(_item, _src, _nowrite) \ +#undef lttng_ust__field_string +#define lttng_ust__field_string(_item, _src, _nowrite) \ { \ const char *__ctf_tmp_string = \ - ((_src) ? (_src) : __LTTNG_UST_NULL_STRING); \ + ((_src) ? (_src) : LTTNG_UST__NULL_STRING); \ __chan->ops->event_strcpy(&__ctx, __ctf_tmp_string, \ - __get_dynamic_len(dest)); \ + lttng_ust__get_dynamic_len(dest)); \ } -#undef _ctf_unused -#define _ctf_unused(_src) +#undef lttng_ust__field_unused +#define lttng_ust__field_unused(_src) -#undef _ctf_enum -#define _ctf_enum(_provider, _name, _type, _item, _src, _nowrite) \ - _ctf_integer_ext(_type, _item, _src, BYTE_ORDER, 10, _nowrite) +#undef lttng_ust__field_enum +#define lttng_ust__field_enum(_provider, _name, _type, _item, _src, _nowrite) \ + lttng_ust__field_integer_ext(_type, _item, _src, LTTNG_UST_BYTE_ORDER, 10, _nowrite) /* Beware: this get len actually consumes the len value */ -#undef __get_dynamic_len -#define __get_dynamic_len(field) __stackvar.__dynamic_len[__dynamic_len_idx++] +#undef lttng_ust__get_dynamic_len +#define lttng_ust__get_dynamic_len(field) __stackvar.__dynamic_len[__dynamic_len_idx++] #undef LTTNG_UST_TP_ARGS #define LTTNG_UST_TP_ARGS(...) __VA_ARGS__ @@ -803,11 +929,11 @@ size_t __event_get_align__##_provider##___##_name(LTTNG_UST__TP_ARGS_PROTO(_args * session this event belongs to. Ensures that we write state dump data only * into the started session, not into all sessions. */ -#undef _TP_SESSION_CHECK -#ifdef TP_SESSION_CHECK -#define _TP_SESSION_CHECK(session, csession) (session == csession) +#undef LTTNG_UST__TP_SESSION_CHECK +#ifdef LTTNG_UST_TP_SESSION_CHECK +#define LTTNG_UST__TP_SESSION_CHECK(session, csession) (session == csession) #else /* TP_SESSION_CHECK */ -#define _TP_SESSION_CHECK(session, csession) 1 +#define LTTNG_UST__TP_SESSION_CHECK(session, csession) 1 #endif /* TP_SESSION_CHECK */ /* @@ -816,15 +942,16 @@ size_t __event_get_align__##_provider##___##_name(LTTNG_UST__TP_ARGS_PROTO(_args * architecture for now by always using the NULL value for the ip * context. */ -#undef _TP_IP_PARAM -#ifdef TP_IP_PARAM -#define _TP_IP_PARAM(x) (x) +#undef LTTNG_UST__TP_IP_PARAM + +#ifdef LTTNG_UST_TP_IP_PARAM +#define LTTNG_UST__TP_IP_PARAM(x) (x) #else /* TP_IP_PARAM */ #if defined(LTTNG_UST_ARCH_PPC) && !defined(LTTNG_UST_ARCH_PPC64) -#define _TP_IP_PARAM(x) NULL +#define LTTNG_UST__TP_IP_PARAM(x) NULL #else -#define _TP_IP_PARAM(x) __builtin_return_address(0) +#define LTTNG_UST__TP_IP_PARAM(x) __builtin_return_address(0) #endif #endif /* TP_IP_PARAM */ @@ -837,16 +964,17 @@ size_t __event_get_align__##_provider##___##_name(LTTNG_UST__TP_ARGS_PROTO(_args * Perform UNION (||) of filter runtime list. */ #undef LTTNG_UST__TRACEPOINT_EVENT_CLASS -#define LTTNG_UST__TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ +#define LTTNG_UST__TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ static \ -void __event_probe__##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PROTO(_args)) \ +void lttng_ust__event_probe__##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PROTO(_args)) \ lttng_ust_notrace; \ static \ -void __event_probe__##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PROTO(_args)) \ +void lttng_ust__event_probe__##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PROTO(_args)) \ { \ struct lttng_ust_event_common *__event = (struct lttng_ust_event_common *) __tp_data; \ size_t __dynamic_len_idx = 0; \ - const size_t __num_fields = _TP_ARRAY_SIZE(__event_fields___##_provider##___##_name) - 1; \ + const size_t __num_fields = LTTNG_UST__TP_ARRAY_SIZE(lttng_ust__event_fields___##_provider##___##_name) - 1; \ + struct lttng_ust_probe_ctx __probe_ctx; \ union { \ size_t __dynamic_len[__num_fields]; \ char __interpreter_stack_data[2 * sizeof(unsigned long) * __num_fields]; \ @@ -863,7 +991,7 @@ void __event_probe__##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PROTO(_args) struct lttng_ust_channel_buffer *__chan = __event_recorder->chan; \ struct lttng_ust_channel_common *__chan_common = __chan->parent; \ \ - if (!_TP_SESSION_CHECK(session, __chan_common->session)) \ + if (!LTTNG_UST__TP_SESSION_CHECK(session, __chan_common->session)) \ return; \ if (caa_unlikely(!CMM_ACCESS_ONCE(__chan_common->session->active))) \ return; \ @@ -876,14 +1004,16 @@ void __event_probe__##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PROTO(_args) } \ if (caa_unlikely(!CMM_ACCESS_ONCE(__event->enabled))) \ return; \ - if (caa_unlikely(!TP_RCU_LINK_TEST())) \ + if (caa_unlikely(!LTTNG_UST_TP_RCU_LINK_TEST())) \ return; \ - if (caa_unlikely(CMM_ACCESS_ONCE(__event->eval_filter))) { \ - __event_prepare_interpreter_stack__##_provider##___##_name(__stackvar.__interpreter_stack_data, \ - LTTNG_UST__TP_ARGS_DATA_VAR(_args)); \ + __probe_ctx.struct_size = sizeof(struct lttng_ust_probe_ctx); \ + __probe_ctx.ip = LTTNG_UST__TP_IP_PARAM(LTTNG_UST_TP_IP_PARAM); \ + if (caa_unlikely(CMM_ACCESS_ONCE(__event->eval_filter))) { \ + lttng_ust__event_prepare_interpreter_stack__##_provider##___##_name(__stackvar.__interpreter_stack_data, \ + LTTNG_UST__TP_ARGS_DATA_VAR(_args)); \ __interpreter_stack_prepared = true; \ - if (caa_likely(__event->run_filter(__event, \ - __stackvar.__interpreter_stack_data, NULL) != LTTNG_UST_EVENT_FILTER_ACCEPT)) \ + if (caa_likely(__event->run_filter(__event, \ + __stackvar.__interpreter_stack_data, &__probe_ctx, NULL) != LTTNG_UST_EVENT_FILTER_ACCEPT)) \ return; \ } \ switch (__event->type) { \ @@ -892,13 +1022,13 @@ void __event_probe__##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PROTO(_args) size_t __event_len, __event_align; \ struct lttng_ust_event_recorder *__event_recorder = (struct lttng_ust_event_recorder *) __event->child; \ struct lttng_ust_channel_buffer *__chan = __event_recorder->chan; \ - struct lttng_ust_ring_buffer_ctx __ctx; \ + struct lttng_ust_ring_buffer_ctx __ctx; \ \ - __event_len = __event_get_size__##_provider##___##_name(__stackvar.__dynamic_len, \ + __event_len = lttng_ust__event_get_size__##_provider##___##_name(__stackvar.__dynamic_len, \ LTTNG_UST__TP_ARGS_DATA_VAR(_args)); \ - __event_align = __event_get_align__##_provider##___##_name(LTTNG_UST__TP_ARGS_VAR(_args)); \ + __event_align = lttng_ust__event_get_align__##_provider##___##_name(LTTNG_UST__TP_ARGS_VAR(_args)); \ lttng_ust_ring_buffer_ctx_init(&__ctx, __event_recorder, __event_len, __event_align, \ - _TP_IP_PARAM(TP_IP_PARAM)); \ + &__probe_ctx); \ __ret = __chan->ops->event_reserve(&__ctx); \ if (__ret < 0) \ return; \ @@ -915,11 +1045,12 @@ void __event_probe__##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PROTO(_args) __notif_ctx.eval_capture = CMM_ACCESS_ONCE(__event_notifier->eval_capture); \ \ if (caa_unlikely(!__interpreter_stack_prepared && __notif_ctx.eval_capture)) \ - __event_prepare_interpreter_stack__##_provider##___##_name(__stackvar.__interpreter_stack_data, \ - LTTNG_UST__TP_ARGS_DATA_VAR(_args)); \ + lttng_ust__event_prepare_interpreter_stack__##_provider##___##_name(__stackvar.__interpreter_stack_data, \ + LTTNG_UST__TP_ARGS_DATA_VAR(_args)); \ \ __event_notifier->notification_send(__event_notifier, \ __stackvar.__interpreter_stack_data, \ + &__probe_ctx, \ &__notif_ctx); \ break; \ } \ @@ -928,30 +1059,7 @@ void __event_probe__##_provider##___##_name(LTTNG_UST__TP_ARGS_DATA_PROTO(_args) #include LTTNG_UST_TRACEPOINT_INCLUDE -#undef __get_dynamic_len - -/* - * Stage 5.1 of tracepoint event generation. - * - * Create probe signature - */ - -/* Reset all macros within LTTNG_UST_TRACEPOINT_EVENT */ -#include - -#undef LTTNG_UST_TP_ARGS -#define LTTNG_UST_TP_ARGS(...) __VA_ARGS__ - -#define _TP_EXTRACT_STRING2(...) #__VA_ARGS__ - -#undef LTTNG_UST__TRACEPOINT_EVENT_CLASS -#define LTTNG_UST__TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ -static const char __tp_event_signature___##_provider##___##_name[] = \ - _TP_EXTRACT_STRING2(_args); - -#include LTTNG_UST_TRACEPOINT_INCLUDE - -#undef _TP_EXTRACT_STRING2 +#undef lttng_ust__get_dynamic_len /* * Stage 6 of tracepoint event generation. @@ -1021,19 +1129,6 @@ LTTNG_UST_TP_EXTERN_C const char * const _model_emf_uri___##__provider##___##__n /* * Stage 7.0 of tracepoint event generation. * - * Declare toplevel descriptor for the whole probe. - * Unlike C, C++ does not allow tentative definitions. Therefore, we - * need to explicitly declare the variable with "extern", using hidden - * visibility to keep this symbol from being exported to the global - * symbol table. - */ - -extern const struct lttng_ust_probe_desc LTTNG_UST__TP_COMBINE_TOKENS(__probe_desc___, LTTNG_UST_TRACEPOINT_PROVIDER) - __attribute__((visibility("hidden"))); - -/* - * Stage 7.1 of tracepoint event generation. - * * Create events description structures. We use a weakref because * loglevels are optional. If not declared, the event will point to * a loglevel that contains NULL. @@ -1049,29 +1144,26 @@ extern const struct lttng_ust_probe_desc LTTNG_UST__TP_COMBINE_TOKENS(__probe_de #include #undef LTTNG_UST__TRACEPOINT_EVENT_INSTANCE -#define LTTNG_UST__TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ +#define LTTNG_UST__TRACEPOINT_EVENT_INSTANCE(_template_provider, _template_name, _provider, _name, _args) \ static const int * \ __ref_loglevel___##_provider##___##_name \ __attribute__((weakref ("_loglevel___" #_provider "___" #_name))); \ static const char * \ __ref_model_emf_uri___##_provider##___##_name \ __attribute__((weakref ("_model_emf_uri___" #_provider "___" #_name)));\ -static const struct lttng_ust_event_desc __event_desc___##_provider##_##_name = { \ +static const struct lttng_ust_event_desc lttng_ust__event_desc___##_provider##_##_name = { \ .struct_size = sizeof(struct lttng_ust_event_desc), \ .event_name = #_name, \ - .probe_desc = &__probe_desc___##_provider, \ - .probe_callback = (void (*)(void)) &__event_probe__##_provider##___##_template, \ - .fields = __event_fields___##_provider##___##_template, \ - .nr_fields = _TP_ARRAY_SIZE(__event_fields___##_provider##___##_template) - 1, \ + .probe_desc = <tng_ust__probe_desc___##_provider, \ + .tp_class = <tng_ust__event_class___##_template_provider##___##_template_name, \ .loglevel = &__ref_loglevel___##_provider##___##_name, \ - .signature = __tp_event_signature___##_provider##___##_template, \ .model_emf_uri = &__ref_model_emf_uri___##_provider##___##_name, \ }; #include LTTNG_UST_TRACEPOINT_INCLUDE /* - * Stage 7.2 of tracepoint event generation. + * Stage 7.1 of tracepoint event generation. * * Create array of events. */ @@ -1080,10 +1172,10 @@ static const struct lttng_ust_event_desc __event_desc___##_provider##_##_name = #include #undef LTTNG_UST__TRACEPOINT_EVENT_INSTANCE -#define LTTNG_UST__TRACEPOINT_EVENT_INSTANCE(_provider, _template, _name, _args) \ - &__event_desc___##_provider##_##_name, +#define LTTNG_UST__TRACEPOINT_EVENT_INSTANCE(_template_provider, _template_name, _provider, _name, _args) \ + <tng_ust__event_desc___##_provider##_##_name, -static const struct lttng_ust_event_desc * const LTTNG_UST__TP_COMBINE_TOKENS(__event_desc___, LTTNG_UST_TRACEPOINT_PROVIDER)[] = { +static const struct lttng_ust_event_desc * const LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__provider_event_desc___, LTTNG_UST_TRACEPOINT_PROVIDER)[] = { #include LTTNG_UST_TRACEPOINT_INCLUDE NULL, /* Dummy, C99 forbids 0-len array. */ }; @@ -1095,17 +1187,17 @@ static const struct lttng_ust_event_desc * const LTTNG_UST__TP_COMBINE_TOKENS(__ * Create a toplevel descriptor for the whole probe. */ -const struct lttng_ust_probe_desc LTTNG_UST__TP_COMBINE_TOKENS(__probe_desc___, LTTNG_UST_TRACEPOINT_PROVIDER) = { +const struct lttng_ust_probe_desc LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__probe_desc___, LTTNG_UST_TRACEPOINT_PROVIDER) = { .struct_size = sizeof(struct lttng_ust_probe_desc), - .provider_name = __tp_stringify(LTTNG_UST_TRACEPOINT_PROVIDER), - .event_desc = LTTNG_UST__TP_COMBINE_TOKENS(__event_desc___, LTTNG_UST_TRACEPOINT_PROVIDER), - .nr_events = _TP_ARRAY_SIZE(LTTNG_UST__TP_COMBINE_TOKENS(__event_desc___, LTTNG_UST_TRACEPOINT_PROVIDER)) - 1, + .provider_name = lttng_ust__tp_stringify(LTTNG_UST_TRACEPOINT_PROVIDER), + .event_desc = LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__provider_event_desc___, LTTNG_UST_TRACEPOINT_PROVIDER), + .nr_events = LTTNG_UST__TP_ARRAY_SIZE(LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__provider_event_desc___, LTTNG_UST_TRACEPOINT_PROVIDER)) - 1, .major = LTTNG_UST_PROVIDER_MAJOR, .minor = LTTNG_UST_PROVIDER_MINOR, }; -static int LTTNG_UST__TP_COMBINE_TOKENS(__probe_register_refcount___, LTTNG_UST_TRACEPOINT_PROVIDER); -static struct lttng_ust_registered_probe *LTTNG_UST__TP_COMBINE_TOKENS(__lttng_ust_probe_register_cookie___, LTTNG_UST_TRACEPOINT_PROVIDER); +static int LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__probe_register_refcount___, LTTNG_UST_TRACEPOINT_PROVIDER); +static struct lttng_ust_registered_probe *LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__probe_register_cookie___, LTTNG_UST_TRACEPOINT_PROVIDER); /* * Stage 9 of tracepoint event generation. @@ -1116,19 +1208,30 @@ static struct lttng_ust_registered_probe *LTTNG_UST__TP_COMBINE_TOKENS(__lttng_u * linking the probe statically. * * Register refcount is protected by libc dynamic loader mutex. + * + * Note that when building this code as C++, the definition of constructors + * and destructors invoking the registration and unregistration functions + * must be performed _after_ the initialization of the probes. + * + * This is because we rely on the order of initialization of static variables + * and anonymous namespaces (their order of declaration) to ensure probes are + * fully initialized, see + * https://en.cppreference.com/w/cpp/language/initialization. This is especially + * important when LTTNG_UST_ALLOCATE_COMPOUND_LITERAL_ON_HEAP is defined as + * compound literals are then dynamically initialized. */ /* Reset all macros within LTTNG_UST_TRACEPOINT_EVENT */ #include + static void -LTTNG_UST__TP_COMBINE_TOKENS(__lttng_ust_events_init__, LTTNG_UST_TRACEPOINT_PROVIDER)(void) - lttng_ust_notrace __attribute__((constructor)); +LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__events_init__, LTTNG_UST_TRACEPOINT_PROVIDER)(void) lttng_ust_notrace; static void -LTTNG_UST__TP_COMBINE_TOKENS(__lttng_ust_events_init__, LTTNG_UST_TRACEPOINT_PROVIDER)(void) +LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__events_init__, LTTNG_UST_TRACEPOINT_PROVIDER)(void) { struct lttng_ust_registered_probe *reg_probe; - if (LTTNG_UST__TP_COMBINE_TOKENS(__probe_register_refcount___, + if (LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__probe_register_refcount___, LTTNG_UST_TRACEPOINT_PROVIDER)++) { return; } @@ -1141,28 +1244,49 @@ LTTNG_UST__TP_COMBINE_TOKENS(__lttng_ust_events_init__, LTTNG_UST_TRACEPOINT_PRO * error will appear. */ LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust_tracepoint_provider_check_, LTTNG_UST_TRACEPOINT_PROVIDER)(); - assert(!LTTNG_UST__TP_COMBINE_TOKENS(__lttng_ust_probe_register_cookie___, LTTNG_UST_TRACEPOINT_PROVIDER)); - reg_probe = lttng_ust_probe_register(<TNG_UST__TP_COMBINE_TOKENS(__probe_desc___, LTTNG_UST_TRACEPOINT_PROVIDER)); + assert(!LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__probe_register_cookie___, LTTNG_UST_TRACEPOINT_PROVIDER)); + reg_probe = lttng_ust_probe_register(<TNG_UST__TP_COMBINE_TOKENS(lttng_ust__probe_desc___, LTTNG_UST_TRACEPOINT_PROVIDER)); if (!reg_probe) { fprintf(stderr, "LTTng-UST: Error while registering tracepoint probe.\n"); abort(); } - LTTNG_UST__TP_COMBINE_TOKENS(__lttng_ust_probe_register_cookie___, LTTNG_UST_TRACEPOINT_PROVIDER) = reg_probe; + LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__probe_register_cookie___, LTTNG_UST_TRACEPOINT_PROVIDER) = reg_probe; } static void -LTTNG_UST__TP_COMBINE_TOKENS(__lttng_ust_events_exit__, LTTNG_UST_TRACEPOINT_PROVIDER)(void) - lttng_ust_notrace __attribute__((destructor)); +LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__events_exit__, LTTNG_UST_TRACEPOINT_PROVIDER)(void) lttng_ust_notrace; static void -LTTNG_UST__TP_COMBINE_TOKENS(__lttng_ust_events_exit__, LTTNG_UST_TRACEPOINT_PROVIDER)(void) +LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__events_exit__, LTTNG_UST_TRACEPOINT_PROVIDER)(void) { - if (--LTTNG_UST__TP_COMBINE_TOKENS(__probe_register_refcount___, + if (--LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__probe_register_refcount___, LTTNG_UST_TRACEPOINT_PROVIDER)) { return; } - lttng_ust_probe_unregister(LTTNG_UST__TP_COMBINE_TOKENS(__lttng_ust_probe_register_cookie___, LTTNG_UST_TRACEPOINT_PROVIDER)); - LTTNG_UST__TP_COMBINE_TOKENS(__lttng_ust_probe_register_cookie___, LTTNG_UST_TRACEPOINT_PROVIDER) = NULL; + lttng_ust_probe_unregister(LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__probe_register_cookie___, LTTNG_UST_TRACEPOINT_PROVIDER)); + LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__probe_register_cookie___, LTTNG_UST_TRACEPOINT_PROVIDER) = NULL; } +LTTNG_UST_DECLARE_CONSTRUCTOR_DESTRUCTOR( + LTTNG_UST_TRACEPOINT_PROVIDER, + LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__events_init__, LTTNG_UST_TRACEPOINT_PROVIDER), + LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust__events_exit__, LTTNG_UST_TRACEPOINT_PROVIDER), + lttng_ust_notrace) + +/* + * LTTNG_UST_TRACEPOINT_PROVIDER_HIDDEN_DEFINITION: Define this before + * including a tracepoint instrumentation header to hide symbols + * associated with the tracepoint provider. This is useful if the + * tracepoint definition (including the header after defining + * LTTNG_UST_TRACEPOINT_DEFINE) is in the same module as the provider + * (including the header after defining + * LTTNG_UST_TRACEPOINT_CREATE_PROBES). + */ +#undef LTTNG_UST__TRACEPOINT_PROVIDER_DEFINITION_VISIBILITY +#ifdef LTTNG_UST_TRACEPOINT_PROVIDER_HIDDEN_DEFINITION +#define LTTNG_UST__TRACEPOINT_PROVIDER_DEFINITION_VISIBILITY __attribute__((visibility("hidden"))) +#else +#define LTTNG_UST__TRACEPOINT_PROVIDER_DEFINITION_VISIBILITY __attribute__((visibility("default"))) +#endif + int LTTNG_UST__TP_COMBINE_TOKENS(lttng_ust_tracepoint_provider_, LTTNG_UST_TRACEPOINT_PROVIDER) - __attribute__((visibility("default"))); + LTTNG_UST__TRACEPOINT_PROVIDER_DEFINITION_VISIBILITY;