Fix: Cast from pointer to different integer size warning
[lttng-ust.git] / include / lttng / ust-tracepoint-event.h
index f6e3a5e87f98ca596adfe94cdfb3d2f626210bc8..11762aaacc3ef664ceee14a54a8b9ab6b558c03c 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <urcu/compiler.h>
 #include <urcu/rculist.h>
 #include <lttng/ust-events.h>
@@ -301,10 +302,66 @@ size_t __event_get_size__##_provider##___##_name(size_t *__dynamic_len, _TP_ARGS
 #undef _ctf_integer_ext
 #define _ctf_integer_ext(_type, _item, _src, _byte_order, _base, _nowrite)     \
        if (lttng_is_signed_type(_type)) {                                     \
-               int64_t __ctf_tmp_int64 = (int64_t) (_type) (_src);            \
+               int64_t __ctf_tmp_int64;                                       \
+               switch (sizeof(_type)) {                                       \
+               case 1:                                                        \
+               {                                                              \
+                       union { _type t; int8_t v; } __tmp = { (_type) (_src) }; \
+                       __ctf_tmp_int64 = (int64_t) __tmp.v;                   \
+                       break;                                                 \
+               }                                                              \
+               case 2:                                                        \
+               {                                                              \
+                       union { _type t; int16_t v; } __tmp = { (_type) (_src) }; \
+                       __ctf_tmp_int64 = (int64_t) __tmp.v;                   \
+                       break;                                                 \
+               }                                                              \
+               case 4:                                                        \
+               {                                                              \
+                       union { _type t; int32_t v; } __tmp = { (_type) (_src) }; \
+                       __ctf_tmp_int64 = (int64_t) __tmp.v;                   \
+                       break;                                                 \
+               }                                                              \
+               case 8:                                                        \
+               {                                                              \
+                       union { _type t; int64_t v; } __tmp = { (_type) (_src) }; \
+                       __ctf_tmp_int64 = (int64_t) __tmp.v;                   \
+                       break;                                                 \
+               }                                                              \
+               default:                                                       \
+                       abort();                                               \
+               };                                                             \
                memcpy(__stack_data, &__ctf_tmp_int64, sizeof(int64_t));       \
        } else {                                                               \
-               uint64_t __ctf_tmp_uint64 = (uint64_t) (_type) (_src);         \
+               uint64_t __ctf_tmp_uint64;                                     \
+               switch (sizeof(_type)) {                                       \
+               case 1:                                                        \
+               {                                                              \
+                       union { _type t; uint8_t v; } __tmp = { (_type) (_src) }; \
+                       __ctf_tmp_uint64 = (uint64_t) __tmp.v;                 \
+                       break;                                                 \
+               }                                                              \
+               case 2:                                                        \
+               {                                                              \
+                       union { _type t; uint16_t v; } __tmp = { (_type) (_src) }; \
+                       __ctf_tmp_uint64 = (uint64_t) __tmp.v;                 \
+                       break;                                                 \
+               }                                                              \
+               case 4:                                                        \
+               {                                                              \
+                       union { _type t; uint32_t v; } __tmp = { (_type) (_src) }; \
+                       __ctf_tmp_uint64 = (uint64_t) __tmp.v;                 \
+                       break;                                                 \
+               }                                                              \
+               case 8:                                                        \
+               {                                                              \
+                       union { _type t; uint64_t v; } __tmp = { (_type) (_src) }; \
+                       __ctf_tmp_uint64 = (uint64_t) __tmp.v;                 \
+                       break;                                                 \
+               }                                                              \
+               default:                                                       \
+                       abort();                                               \
+               };                                                             \
                memcpy(__stack_data, &__ctf_tmp_uint64, sizeof(uint64_t));     \
        }                                                                      \
        __stack_data += sizeof(int64_t);
@@ -532,6 +589,7 @@ void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args))           \
        __event_align = __event_get_align__##_provider##___##_name(_TP_ARGS_VAR(_args)); \
        lib_ring_buffer_ctx_init(&__ctx, __chan->chan, __event, __event_len,  \
                                 __event_align, -1, __chan->handle);          \
+       __ctx.ip = __builtin_return_address(0);                               \
        __ret = __chan->ops->event_reserve(&__ctx, __event->id);              \
        if (__ret < 0)                                                        \
                return;                                                       \
@@ -697,7 +755,10 @@ _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));
-       assert(!ret);
+       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);
+               abort();
+       }
 }
 
 static void lttng_ust_notrace __attribute__((destructor))
This page took 0.025124 seconds and 4 git commands to generate.