Fix: loglevel and model_emf_uri with g++ compiled probes
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 18 Oct 2016 21:56:42 +0000 (17:56 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 18 Oct 2016 22:01:12 +0000 (18:01 -0400)
Fix the loglevel and model_emf_uri features for probe providers compiled
with g++. They were previously effectless because of C++ symbol name
mangling. The weakref was refering to the non-mangled symbol, but C++
emits a mangled symbol for the static variable.

Fix this by emitting an extern "C" symbol with hidden visibility on C++.
With a C compiled, this simply turns a static variable into a variable
with hidden visibility.

Fixes: #1069
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/lttng/ust-tracepoint-event.h

index 0b4e5a262b537ea7de75b4502a83c7480a5c9d27..2bb4a38ee7df3e7f9751c94ec81a9d943d3db011 100644 (file)
@@ -844,14 +844,31 @@ static 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
 
+#ifdef __cplusplus
+#undef LTTNG_TP_EXTERN_C
+#endif
+
 /*
  * Stage 6.1 of tracepoint event generation.
  *
@@ -861,12 +878,29 @@ 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
 
+#ifdef __cplusplus
+#undef LTTNG_TP_EXTERN_C
+#endif
+
 /*
  * Stage 7.1 of tracepoint event generation.
  *
This page took 0.025995 seconds and 4 git commands to generate.