From 46d522007b647e0b64d18d0ed518205c2bbad424 Mon Sep 17 00:00:00 2001 From: Zifei Tong Date: Thu, 30 May 2013 10:11:52 -0400 Subject: [PATCH] Allow tracepoint providers to be compiled with g++ 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 --- README | 5 +- include/lttng/ringbuffer-config.h | 97 ++++++++++++++++------------ include/lttng/tracepoint-event.h | 12 ++-- include/lttng/ust-events.h | 42 +++++++----- include/lttng/ust-tracepoint-event.h | 35 ++++++---- tests/hello.cxx/Makefile.am | 2 +- tests/hello.cxx/{tp.c => tp.cpp} | 2 +- 7 files changed, 118 insertions(+), 77 deletions(-) rename tests/hello.cxx/{tp.c => tp.cpp} (99%) diff --git a/README b/README index 2a335cec..1f6b9d2c 100644 --- 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: diff --git a/include/lttng/ringbuffer-config.h b/include/lttng/ringbuffer-config.h index ca52fc71..42889ccd 100644 --- a/include/lttng/ringbuffer-config.h +++ b/include/lttng/ringbuffer-config.h @@ -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. diff --git a/include/lttng/tracepoint-event.h b/include/lttng/tracepoint-event.h index 077eaa0b..4630788c 100644 --- a/include/lttng/tracepoint-event.h +++ b/include/lttng/tracepoint-event.h @@ -20,12 +20,12 @@ * 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 */ diff --git a/include/lttng/ust-events.h b/include/lttng/ust-events.h index 0b8664c3..329ed3a8 100644 --- a/include/lttng/ust-events.h +++ b/include/lttng/ust-events.h @@ -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, \ + } \ + } \ }, \ } \ diff --git a/include/lttng/ust-tracepoint-event.h b/include/lttng/ust-tracepoint-event.h index c7bceef6..f6e3a5e8 100644 --- a/include/lttng/ust-tracepoint-event.h +++ b/include/lttng/ust-tracepoint-event.h @@ -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, }; diff --git a/tests/hello.cxx/Makefile.am b/tests/hello.cxx/Makefile.am index 897416d8..5f6c615b 100644 --- a/tests/hello.cxx/Makefile.am +++ b/tests/hello.cxx/Makefile.am @@ -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.cpp similarity index 99% rename from tests/hello.cxx/tp.c rename to tests/hello.cxx/tp.cpp index 4790965e..a2099abc 100644 --- a/tests/hello.cxx/tp.c +++ b/tests/hello.cxx/tp.cpp @@ -1,5 +1,5 @@ /* - * tp.c + * tp.cpp * * Copyright (c) 2011 Mathieu Desnoyers * -- 2.34.1