Allow tracepoint providers to be compiled with g++
authorZifei Tong <soariez@gmail.com>
Thu, 30 May 2013 14:11:52 +0000 (10:11 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 30 May 2013 14:11:52 +0000 (10:11 -0400)
Move enumeration definition out of lttng_ust_lib_ring_buffer_config to
make them visible at global scope for C++ compilers.

Modify designated initializers: reordering initializers, add missing
initializers, reformat nested initializers, in order to make g++
compile.

Relevant discussion:

> So each field need to be listed ? We usually don't put NULL
> initialization for structures that are always in zero-initialized
> memory. (coding style)

This is related to a known issue of g++:
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55606 (Bug 55606 - sorry,
unimplemented: non-trivial designated initializers not supported).

g++'s 'trivial designated initializers' means no out-of-order
initialization, no missing
initialization (except the fields on the tail of a struct), and nested
initialization should be done in the form {.foo = {.bar = 1}} instead of
{.foo.bar = 1}. That's why I made such modification.

> Are those changes also compatible with the LLVM c++ compiler ?
Actually, clang++ have designated initializers better supported than g++.
All the modification about designated initializers are not required for
clang++. No need to add NULL initialization, reorder initializations or
change {.foo.bar = 1} into {.foo = {.bar = 1}}. These (ugly) hacks are just
to make g++ happy.

[ Updates done by Mathieu Desnoyers to fix merge conflicts. Updated
  README. ]

Fixes #338

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
README
include/lttng/ringbuffer-config.h
include/lttng/tracepoint-event.h
include/lttng/ust-events.h
include/lttng/ust-tracepoint-event.h
tests/hello.cxx/Makefile.am
tests/hello.cxx/tp.c [deleted file]
tests/hello.cxx/tp.cpp [new file with mode: 0644]

diff --git a/README b/README
index 2a335ceccac6d2cddecf82591525c56e8aecc7f4..1f6b9d2ca66e859b0ec8a63a47cd295c177563c3 100644 (file)
--- a/README
+++ b/README
@@ -110,9 +110,8 @@ USAGE:
     object.
   - Enable instrumentation and control tracing with the "lttng" command
     from lttng-tools. See lttng-tools doc/quickstart.txt.
-  - Note for C++ support: although an application instrumented with
-    tracepoints can be compiled with g++, tracepoint probes should be
-    compiled with gcc (only tested with gcc so far).
+  - Note for C++ support: since LTTng-UST 2.3, both tracepoints and
+    tracepoint probes can be compiled with g++.
 
 
 ENVIRONMENT VARIABLES:
index ca52fc71fb02e90776e9d6157c9e100b5682f3fa..42889ccd0e4b5e8a197589c3294afbadafc79211 100644 (file)
@@ -134,47 +134,64 @@ struct lttng_ust_lib_ring_buffer_client_cb {
  * has the responsibility to perform wakeups.
  */
 #define LTTNG_UST_RING_BUFFER_CONFIG_PADDING   32
+
+enum lttng_ust_lib_ring_buffer_alloc_types {
+       RING_BUFFER_ALLOC_PER_CPU,
+       RING_BUFFER_ALLOC_GLOBAL,
+};
+
+enum lttng_ust_lib_ring_buffer_sync_types {
+       RING_BUFFER_SYNC_PER_CPU,       /* Wait-free */
+       RING_BUFFER_SYNC_GLOBAL,        /* Lock-free */
+};
+
+enum lttng_ust_lib_ring_buffer_mode_types {
+       RING_BUFFER_OVERWRITE,          /* Overwrite when buffer full */
+       RING_BUFFER_DISCARD,            /* Discard when buffer full */
+};
+
+enum lttng_ust_lib_ring_buffer_output_types {
+       RING_BUFFER_SPLICE,
+       RING_BUFFER_MMAP,
+       RING_BUFFER_READ,               /* TODO */
+       RING_BUFFER_ITERATOR,
+       RING_BUFFER_NONE,
+};
+
+enum lttng_ust_lib_ring_buffer_backend_types {
+       RING_BUFFER_PAGE,
+       RING_BUFFER_VMAP,               /* TODO */
+       RING_BUFFER_STATIC,             /* TODO */
+};
+
+enum lttng_ust_lib_ring_buffer_oops_types {
+       RING_BUFFER_NO_OOPS_CONSISTENCY,
+       RING_BUFFER_OOPS_CONSISTENCY,
+};
+
+enum lttng_ust_lib_ring_buffer_ipi_types {
+       RING_BUFFER_IPI_BARRIER,
+       RING_BUFFER_NO_IPI_BARRIER,
+};
+
+enum lttng_ust_lib_ring_buffer_wakeup_types {
+       RING_BUFFER_WAKEUP_BY_TIMER,    /* wake up performed by timer */
+       RING_BUFFER_WAKEUP_BY_WRITER,   /*
+                                        * writer wakes up reader,
+                                        * not lock-free
+                                        * (takes spinlock).
+                                        */
+};
+
 struct lttng_ust_lib_ring_buffer_config {
-       enum {
-               RING_BUFFER_ALLOC_PER_CPU,
-               RING_BUFFER_ALLOC_GLOBAL,
-       } alloc;
-       enum {
-               RING_BUFFER_SYNC_PER_CPU,       /* Wait-free */
-               RING_BUFFER_SYNC_GLOBAL,        /* Lock-free */
-       } sync;
-       enum {
-               RING_BUFFER_OVERWRITE,          /* Overwrite when buffer full */
-               RING_BUFFER_DISCARD,            /* Discard when buffer full */
-       } mode;
-       enum {
-               RING_BUFFER_SPLICE,
-               RING_BUFFER_MMAP,
-               RING_BUFFER_READ,               /* TODO */
-               RING_BUFFER_ITERATOR,
-               RING_BUFFER_NONE,
-       } output;
-       enum {
-               RING_BUFFER_PAGE,
-               RING_BUFFER_VMAP,               /* TODO */
-               RING_BUFFER_STATIC,             /* TODO */
-       } backend;
-       enum {
-               RING_BUFFER_NO_OOPS_CONSISTENCY,
-               RING_BUFFER_OOPS_CONSISTENCY,
-       } oops;
-       enum {
-               RING_BUFFER_IPI_BARRIER,
-               RING_BUFFER_NO_IPI_BARRIER,
-       } ipi;
-       enum {
-               RING_BUFFER_WAKEUP_BY_TIMER,    /* wake up performed by timer */
-               RING_BUFFER_WAKEUP_BY_WRITER,   /*
-                                                * writer wakes up reader,
-                                                * not lock-free
-                                                * (takes spinlock).
-                                                */
-       } wakeup;
+       enum lttng_ust_lib_ring_buffer_alloc_types alloc;
+       enum lttng_ust_lib_ring_buffer_sync_types sync;
+       enum lttng_ust_lib_ring_buffer_mode_types mode;
+       enum lttng_ust_lib_ring_buffer_output_types output;
+       enum lttng_ust_lib_ring_buffer_backend_types backend;
+       enum lttng_ust_lib_ring_buffer_oops_types oops;
+       enum lttng_ust_lib_ring_buffer_ipi_types ipi;
+       enum lttng_ust_lib_ring_buffer_wakeup_types wakeup;
        /*
         * tsc_bits: timestamp bits saved at each record.
         *   0 and 64 disable the timestamp compression scheme.
index 077eaa0b46d48fcf1baa0d35f4b188246275fd85..4630788c114625c7de68fdcbed122f69568bb63b 100644 (file)
  * SOFTWARE.
  */
 
+#ifdef TRACEPOINT_CREATE_PROBES
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-#ifdef TRACEPOINT_CREATE_PROBES
-
 #define __tp_stringify1(x)     #x
 #define __tp_stringify(x)      __tp_stringify1(x)
 
@@ -65,10 +65,10 @@ extern "C" {
 #undef TRACEPOINT_INCLUDE_FILE
 #undef TRACEPOINT_INCLUDE
 
-#define TRACEPOINT_CREATE_PROBES
-
-#endif /* TRACEPOINT_CREATE_PROBES */
-
 #ifdef __cplusplus
 }
 #endif
+
+#define TRACEPOINT_CREATE_PROBES
+
+#endif /* TRACEPOINT_CREATE_PROBES */
index 0b8664c3cbae0635c441f777e11d4d359e21ba5d..329ed3a8ecf34bccd0eec2a62709f185334f9c99 100644 (file)
@@ -98,15 +98,21 @@ struct lttng_enum_entry {
 
 #define __type_integer(_type, _byte_order, _base, _encoding)   \
        {                                                       \
-           .atype = atype_integer,                             \
-           .u.basic.integer =                                  \
+         .atype = atype_integer,                               \
+         .u =                                                  \
                {                                               \
-                 .size = sizeof(_type) * CHAR_BIT,             \
-                 .alignment = lttng_alignof(_type) * CHAR_BIT, \
-                 .signedness = lttng_is_signed_type(_type),    \
-                 .reverse_byte_order = _byte_order != BYTE_ORDER,      \
-                 .base = _base,                                \
-                 .encoding = lttng_encode_##_encoding,         \
+                 .basic =                                      \
+                       {                                       \
+                         .integer =                            \
+                               {                               \
+                                 .size = sizeof(_type) * CHAR_BIT,             \
+                                 .alignment = lttng_alignof(_type) * CHAR_BIT, \
+                                 .signedness = lttng_is_signed_type(_type),    \
+                                 .reverse_byte_order = _byte_order != BYTE_ORDER, \
+                                 .base = _base,                                \
+                                 .encoding = lttng_encode_##_encoding,         \
+                               }                               \
+                       }                                       \
                },                                              \
        }                                                       \
 
@@ -132,14 +138,20 @@ struct lttng_integer_type {
 
 #define __type_float(_type)                                    \
        {                                                       \
-           .atype = atype_float,                               \
-           .u.basic._float =                                   \
+         .atype = atype_float,                                 \
+         .u =                                                  \
                {                                               \
-                 .exp_dig = sizeof(_type) * CHAR_BIT           \
-                               - _float_mant_dig(_type),       \
-                 .mant_dig = _float_mant_dig(_type),           \
-                 .alignment = lttng_alignof(_type) * CHAR_BIT, \
-                 .reverse_byte_order = BYTE_ORDER != FLOAT_WORD_ORDER, \
+                 .basic =                                      \
+                       {                                       \
+                         ._float =                             \
+                               {                               \
+                                 .exp_dig = sizeof(_type) * CHAR_BIT           \
+                                                 - _float_mant_dig(_type),     \
+                                 .mant_dig = _float_mant_dig(_type),           \
+                                 .alignment = lttng_alignof(_type) * CHAR_BIT, \
+                                 .reverse_byte_order = BYTE_ORDER != FLOAT_WORD_ORDER, \
+                               }                               \
+                       }                                       \
                },                                              \
        }                                                       \
 
index c7bceef652478d4ba114788867ed98941d34379a..f6e3a5e87f98ca596adfe94cdfb3d2f626210bc8 100644 (file)
@@ -147,11 +147,14 @@ static const char                                                 \
          .type =                                               \
                {                                               \
                  .atype = atype_array,                         \
-                 .u.array =                                    \
+                 .u =                                          \
                        {                                       \
-                           .length = _length,                  \
-                           .elem_type = __type_integer(_type, BYTE_ORDER, 10, _encoding), \
-                       },                                      \
+                         .array =                              \
+                               {                               \
+                                 .elem_type = __type_integer(_type, BYTE_ORDER, 10, _encoding), \
+                                 .length = _length,            \
+                               }                               \
+                       }                                       \
                },                                              \
          .nowrite = _nowrite,                                  \
        },
@@ -164,10 +167,13 @@ static const char                                                 \
          .type =                                               \
                {                                               \
                  .atype = atype_sequence,                      \
-                 .u.sequence =                                 \
+                 .u =                                          \
                        {                                       \
-                           .length_type = __type_integer(_length_type, BYTE_ORDER, 10, none), \
-                           .elem_type = __type_integer(_type, BYTE_ORDER, 10, _encoding), \
+                         .sequence =                           \
+                               {                               \
+                                 .length_type = __type_integer(_length_type, BYTE_ORDER, 10, none), \
+                                 .elem_type = __type_integer(_type, BYTE_ORDER, 10, _encoding), \
+                               },                              \
                        },                                      \
                },                                              \
          .nowrite = _nowrite,                                  \
@@ -180,7 +186,10 @@ static const char                                                  \
          .type =                                               \
                {                                               \
                  .atype = atype_string,                        \
-                 .u.basic.string.encoding = lttng_encode_UTF8, \
+                 .u =                                          \
+                       {                                       \
+                         .basic = { .string = { .encoding = lttng_encode_UTF8 } } \
+                       },                                      \
                },                                              \
          .nowrite = _nowrite,                                  \
        },
@@ -483,7 +492,7 @@ 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 = __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;                           \
        size_t __event_len, __event_align;                                    \
@@ -612,13 +621,14 @@ 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 = {        \
-       .fields = __event_fields___##_provider##___##_template,                \
        .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), \
        .loglevel = &__ref_loglevel___##_provider##___##_name,                 \
        .signature = __tp_event_signature___##_provider##___##_template,       \
-       .u.ext.model_emf_uri = &__ref_model_emf_uri___##_provider##___##_name, \
+       .u = { .ext = { .model_emf_uri = &__ref_model_emf_uri___##_provider##___##_name } }, \
 };
 
 #include TRACEPOINT_INCLUDE
@@ -652,6 +662,9 @@ static struct lttng_probe_desc _TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PR
        .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)),
+       .head = { NULL, NULL },
+       .lazy_init_head = { NULL, NULL },
+       .lazy = 0,
        .major = LTTNG_UST_PROVIDER_MAJOR,
        .minor = LTTNG_UST_PROVIDER_MINOR,
 };
index 897416d8102143ee166f7118ed21224bb81f5361..5f6c615bb6aa39a673f181dd2354bce836b99b61 100644 (file)
@@ -1,7 +1,7 @@
 AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include -Wsystem-headers
 
 noinst_PROGRAMS = hello
-hello_SOURCES = hello.cpp tp.c ust_tests_hello.h
+hello_SOURCES = hello.cpp tp.cpp ust_tests_hello.h
 hello_LDADD = $(top_builddir)/liblttng-ust/liblttng-ust.la
 
 if LTTNG_UST_BUILD_WITH_LIBDL
diff --git a/tests/hello.cxx/tp.c b/tests/hello.cxx/tp.c
deleted file mode 100644 (file)
index 4790965..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * tp.c
- *
- * Copyright (c) 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#define TRACEPOINT_CREATE_PROBES
-#include "ust_tests_hello.h"
diff --git a/tests/hello.cxx/tp.cpp b/tests/hello.cxx/tp.cpp
new file mode 100644 (file)
index 0000000..a2099ab
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * tp.cpp
+ *
+ * Copyright (c) 2011 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#define TRACEPOINT_CREATE_PROBES
+#include "ust_tests_hello.h"
This page took 0.032619 seconds and 4 git commands to generate.