Fix: loglevel and model_emf_uri build fix
[lttng-ust.git] / include / lttng / ust-tracepoint-event.h
index aa8b50f86e5a44aa055a72f3e89e46772efe8c10..e26105efb77a471de93790f6f0e2fb862ec585a5 100644 (file)
 #include <lttng/ringbuffer-config.h>
 #include <lttng/ust-compiler.h>
 #include <lttng/tracepoint.h>
+#include <byteswap.h>
 #include <string.h>
 
+#define __LTTNG_UST_NULL_STRING        "(null)"
+
 #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_bp((head)->next), __typeof__(*pos), member);       \
@@ -127,12 +130,36 @@ static const char                                                 \
 /* Enumeration entry (single value) */
 #undef ctf_enum_value
 #define ctf_enum_value(_string, _value)                                        \
-       { _value, _value, _string },
+       {                                                               \
+               .start = {                                              \
+                       .value = lttng_is_signed_type(__typeof__(_value)) ? \
+                               (long long) (_value) : (_value),        \
+                       .signedness = lttng_is_signed_type(__typeof__(_value)), \
+               },                                                      \
+               .end = {                                                \
+                       .value = lttng_is_signed_type(__typeof__(_value)) ? \
+                               (long long) (_value) : (_value),        \
+                       .signedness = lttng_is_signed_type(__typeof__(_value)), \
+               },                                                      \
+               .string = (_string),                                    \
+       },
 
 /* Enumeration entry (range) */
 #undef ctf_enum_range
 #define ctf_enum_range(_string, _range_start, _range_end)              \
-       { _range_start, _range_end, _string },
+       {                                                               \
+               .start = {                                              \
+                       .value = lttng_is_signed_type(__typeof__(_range_start)) ? \
+                               (long long) (_range_start) : (_range_start), \
+                       .signedness = lttng_is_signed_type(__typeof__(_range_start)), \
+               },                                                      \
+               .end = {                                                \
+                       .value = lttng_is_signed_type(__typeof__(_range_end)) ? \
+                               (long long) (_range_end) : (_range_end), \
+                       .signedness = lttng_is_signed_type(__typeof__(_range_end)), \
+               },                                                      \
+               .string = (_string),                                    \
+       },
 
 #undef TP_ENUM_VALUES
 #define TP_ENUM_VALUES(...)                                            \
@@ -142,6 +169,7 @@ static const char                                                   \
 #define TRACEPOINT_ENUM(_provider, _name, _values)                     \
        const struct lttng_enum_entry __enum_values__##_provider##_##_name[] = { \
                _values                                                 \
+               ctf_enum_value("", 0)   /* Dummy, 0-len array forbidden by C99. */ \
        };
 
 #include TRACEPOINT_INCLUDE
@@ -261,6 +289,7 @@ static const char                                                   \
 #define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields)                            \
        static const struct lttng_event_field __event_fields___##_provider##___##_name[] = { \
                _fields                                                                      \
+               ctf_integer(int, dummy, 0)      /* Dummy, C99 forbids 0-len array. */        \
        };
 
 #undef TRACEPOINT_ENUM
@@ -268,7 +297,7 @@ static const char                                                   \
        static const struct lttng_enum_desc __enum_##_provider##_##_name = {            \
                .name = #_provider "_" #_name,                                          \
                .entries = __enum_values__##_provider##_##_name,                        \
-               .nr_entries = _TP_ARRAY_SIZE(__enum_values__##_provider##_##_name),     \
+               .nr_entries = _TP_ARRAY_SIZE(__enum_values__##_provider##_##_name) - 1, \
        };
 
 #include TRACEPOINT_INCLUDE
@@ -328,7 +357,8 @@ static void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args));
 
 #undef _ctf_string
 #define _ctf_string(_item, _src, _nowrite)                                    \
-       __event_len += __dynamic_len[__dynamic_len_idx++] = strlen(_src) + 1;
+       __event_len += __dynamic_len[__dynamic_len_idx++] =                    \
+               strlen((_src) ? (_src) : __LTTNG_UST_NULL_STRING) + 1;
 
 #undef _ctf_enum
 #define _ctf_enum(_provider, _name, _type, _item, _src, _nowrite)              \
@@ -384,18 +414,24 @@ size_t __event_get_size__##_provider##___##_name(size_t *__dynamic_len, _TP_ARGS
                case 2:                                                        \
                {                                                              \
                        union { _type t; int16_t v; } __tmp = { (_type) (_src) }; \
+                       if (_byte_order != BYTE_ORDER)                         \
+                               __tmp.v = 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);                   \
                        __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);                   \
                        __ctf_tmp_int64 = (int64_t) __tmp.v;                   \
                        break;                                                 \
                }                                                              \
@@ -415,18 +451,24 @@ size_t __event_get_size__##_provider##___##_name(size_t *__dynamic_len, _TP_ARGS
                case 2:                                                        \
                {                                                              \
                        union { _type t; uint16_t v; } __tmp = { (_type) (_src) }; \
+                       if (_byte_order != BYTE_ORDER)                         \
+                               __tmp.v = 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);                   \
                        __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);                   \
                        __ctf_tmp_uint64 = (uint64_t) __tmp.v;                 \
                        break;                                                 \
                }                                                              \
@@ -471,7 +513,8 @@ size_t __event_get_size__##_provider##___##_name(size_t *__dynamic_len, _TP_ARGS
 #undef _ctf_string
 #define _ctf_string(_item, _src, _nowrite)                                    \
        {                                                                      \
-               const void *__ctf_tmp_ptr = (_src);                            \
+               const void *__ctf_tmp_ptr =                                    \
+                       ((_src) ? (_src) : __LTTNG_UST_NULL_STRING);           \
                memcpy(__stack_data, &__ctf_tmp_ptr, sizeof(void *));          \
                __stack_data += sizeof(void *);                                \
        }
@@ -608,13 +651,19 @@ size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args))      \
 
 #undef _ctf_string
 #define _ctf_string(_item, _src, _nowrite)                             \
-       lib_ring_buffer_align_ctx(&__ctx, lttng_alignof(*(_src)));      \
-       if (__chan->ops->u.has_strcpy)                                  \
-               __chan->ops->event_strcpy(&__ctx, _src,                 \
-                       __get_dynamic_len(dest));                       \
-       else                                                            \
-               __chan->ops->event_write(&__ctx, _src,                  \
-                       __get_dynamic_len(dest));
+       {                                                                       \
+               const char *__ctf_tmp_string =                                  \
+                       ((_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));                       \
+       }
+
 
 #undef _ctf_enum
 #define _ctf_enum(_provider, _name, _type, _item, _src, _nowrite)      \
@@ -642,11 +691,23 @@ size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args))      \
 #define _TP_SESSION_CHECK(session, csession)   1
 #endif /* TP_SESSION_CHECK */
 
+/*
+ * Use of __builtin_return_address(0) sometimes seems to cause stack
+ * corruption on 32-bit PowerPC. Disable this feature on that
+ * 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)
 #else /* TP_IP_PARAM */
+
+#if defined(__PPC__) && !defined(__PPC64__)
+#define _TP_IP_PARAM(x)                NULL
+#else /* #if defined(__PPC__) && !defined(__PPC64__) */
 #define _TP_IP_PARAM(x)                __builtin_return_address(0)
+#endif /* #else #if defined(__PPC__) && !defined(__PPC64__) */
+
 #endif /* TP_IP_PARAM */
 
 /*
@@ -663,14 +724,15 @@ void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args));      \
 static                                                                       \
 void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args))              \
 {                                                                            \
-       struct lttng_event *__event = (struct lttng_event *) __tp_data;                       \
+       struct lttng_event *__event = (struct lttng_event *) __tp_data;       \
        struct lttng_channel *__chan = __event->chan;                         \
        struct lttng_ust_lib_ring_buffer_ctx __ctx;                           \
+       struct lttng_stack_ctx __lttng_ctx;                                   \
        size_t __event_len, __event_align;                                    \
        size_t __dynamic_len_idx = 0;                                         \
        union {                                                               \
-               size_t __dynamic_len[_TP_ARRAY_SIZE(__event_fields___##_provider##___##_name)]; \
-               char __filter_stack_data[2 * sizeof(unsigned long) * _TP_ARRAY_SIZE(__event_fields___##_provider##___##_name)]; \
+               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)]; \
        } __stackvar;                                                         \
        int __ret;                                                            \
                                                                              \
@@ -703,8 +765,12 @@ void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args))          \
        __event_len = __event_get_size__##_provider##___##_name(__stackvar.__dynamic_len, \
                 _TP_ARGS_DATA_VAR(_args));                                   \
        __event_align = __event_get_align__##_provider##___##_name(_TP_ARGS_VAR(_args)); \
+       memset(&__lttng_ctx, 0, sizeof(__lttng_ctx));                         \
+       __lttng_ctx.event = __event;                                          \
+       __lttng_ctx.chan_ctx = tp_rcu_dereference_bp(__chan->ctx);            \
+       __lttng_ctx.event_ctx = tp_rcu_dereference_bp(__event->ctx);          \
        lib_ring_buffer_ctx_init(&__ctx, __chan->chan, __event, __event_len,  \
-                                __event_align, -1, __chan->handle);          \
+                                __event_align, -1, __chan->handle, &__lttng_ctx); \
        __ctx.ip = _TP_IP_PARAM(TP_IP_PARAM);                                 \
        __ret = __chan->ops->event_reserve(&__ctx, __event->id);              \
        if (__ret < 0)                                                        \
@@ -733,7 +799,7 @@ void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args))           \
 
 #undef TRACEPOINT_EVENT_CLASS
 #define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields)       \
-const char __tp_event_signature___##_provider##___##_name[] =          \
+static const char __tp_event_signature___##_provider##___##_name[] =   \
                _TP_EXTRACT_STRING2(_args);
 
 #include TRACEPOINT_INCLUDE
@@ -752,14 +818,29 @@ const char __tp_event_signature___##_provider##___##_name[] =             \
 /* Reset all macros within TRACEPOINT_EVENT */
 #include <lttng/ust-tracepoint-event-reset.h>
 
+/*
+ * Declare _loglevel___##__provider##___##__name as non-static, with
+ * hidden visibility for c++ handling of weakref. We do a weakref to the
+ * symbol in a later stage, which requires that the symbol is not
+ * mangled.
+ */
+#ifdef __cplusplus
+#define LTTNG_TP_EXTERN_C extern "C"
+#else
+#define LTTNG_TP_EXTERN_C
+#endif
+
 #undef TRACEPOINT_LOGLEVEL
 #define TRACEPOINT_LOGLEVEL(__provider, __name, __loglevel)               \
 static const int _loglevel_value___##__provider##___##__name = __loglevel; \
-static const int *_loglevel___##__provider##___##__name =                 \
+LTTNG_TP_EXTERN_C const int *_loglevel___##__provider##___##__name        \
+               __attribute__((visibility("hidden"))) =                    \
                &_loglevel_value___##__provider##___##__name;
 
 #include TRACEPOINT_INCLUDE
 
+#undef LTTNG_TP_EXTERN_C
+
 /*
  * Stage 6.1 of tracepoint event generation.
  *
@@ -769,12 +850,27 @@ static const int *_loglevel___##__provider##___##__name =            \
 /* Reset all macros within TRACEPOINT_EVENT */
 #include <lttng/ust-tracepoint-event-reset.h>
 
+/*
+ * Declare _model_emf_uri___##__provider##___##__name as non-static,
+ * with hidden visibility for c++ handling of weakref. We do a weakref
+ * to the symbol in a later stage, which requires that the symbol is not
+ * mangled.
+ */
+#ifdef __cplusplus
+#define LTTNG_TP_EXTERN_C extern "C"
+#else
+#define LTTNG_TP_EXTERN_C
+#endif
+
 #undef TRACEPOINT_MODEL_EMF_URI
 #define TRACEPOINT_MODEL_EMF_URI(__provider, __name, __uri)               \
-static const char *_model_emf_uri___##__provider##___##__name = __uri;
+LTTNG_TP_EXTERN_C const char *_model_emf_uri___##__provider##___##__name   \
+               __attribute__((visibility("hidden"))) = __uri;             \
 
 #include TRACEPOINT_INCLUDE
 
+#undef LTTNG_TP_EXTERN_C
+
 /*
  * Stage 7.1 of tracepoint event generation.
  *
@@ -794,12 +890,12 @@ static const int *                                                               \
 static const char *                                                           \
        __ref_model_emf_uri___##_provider##___##_name                          \
        __attribute__((weakref ("_model_emf_uri___" #_provider "___" #_name)));\
-const struct lttng_event_desc __event_desc___##_provider##_##_name = {        \
+static const struct lttng_event_desc __event_desc___##_provider##_##_name = {         \
        .name = #_provider ":" #_name,                                         \
        .probe_callback = (void (*)(void)) &__event_probe__##_provider##___##_template,\
        .ctx = NULL,                                                           \
        .fields = __event_fields___##_provider##___##_template,                \
-       .nr_fields = _TP_ARRAY_SIZE(__event_fields___##_provider##___##_template), \
+       .nr_fields = _TP_ARRAY_SIZE(__event_fields___##_provider##___##_template) - 1, \
        .loglevel = &__ref_loglevel___##_provider##___##_name,                 \
        .signature = __tp_event_signature___##_provider##___##_template,       \
        .u = {                                                                 \
@@ -826,6 +922,7 @@ const struct lttng_event_desc __event_desc___##_provider##_##_name = {             \
 
 static const struct lttng_event_desc *_TP_COMBINE_TOKENS(__event_desc___, TRACEPOINT_PROVIDER)[] = {
 #include TRACEPOINT_INCLUDE
+       NULL,   /* Dummy, C99 forbids 0-len array. */
 };
 
 
@@ -839,7 +936,7 @@ static const struct lttng_event_desc *_TP_COMBINE_TOKENS(__event_desc___, TRACEP
 static struct lttng_probe_desc _TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PROVIDER) = {
        .provider = __tp_stringify(TRACEPOINT_PROVIDER),
        .event_desc = _TP_COMBINE_TOKENS(__event_desc___, TRACEPOINT_PROVIDER),
-       .nr_events = _TP_ARRAY_SIZE(_TP_COMBINE_TOKENS(__event_desc___, TRACEPOINT_PROVIDER)),
+       .nr_events = _TP_ARRAY_SIZE(_TP_COMBINE_TOKENS(__event_desc___, TRACEPOINT_PROVIDER)) - 1,
        .head = { NULL, NULL },
        .lazy_init_head = { NULL, NULL },
        .lazy = 0,
This page took 0.033858 seconds and 4 git commands to generate.