Fix: fetch caller address from tracef()
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 9 Jun 2015 09:51:06 +0000 (11:51 +0200)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Tue, 9 Jun 2015 09:57:33 +0000 (11:57 +0200)
Don't fetch the address within the ust trampoline, but rather the caller
address.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/lttng/lttng-ust-tracef.h
include/lttng/ust-tracepoint-event.h
liblttng-ust/lttng-ust-tracef-provider.h
liblttng-ust/tracef.c

index 1910447f141559b607f86cd5620f749732cf8f3c..3095b3db3861f6424fa32a32b218fbf1389d5e40 100644 (file)
@@ -24,7 +24,7 @@
 #include <stdarg.h>
 
 TRACEPOINT_EVENT(lttng_ust_tracef, event,
-       TP_ARGS(const char *, msg, unsigned int, len),
+       TP_ARGS(const char *, msg, unsigned int, len, void *, ip),
        TP_FIELDS(
                ctf_sequence_text(char, msg, msg, unsigned int, len)
        )
index 3f99f6626bb75871b27d85f92ba001081fee0dc2..6c32249c9a8730021d2b7c9f77ea0d315b53c7ab 100644 (file)
@@ -565,6 +565,13 @@ size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args))      \
 #define _TP_SESSION_CHECK(session, csession)   1
 #endif /* TP_SESSION_CHECK */
 
+#undef _TP_IP_PARAM
+#ifdef TP_IP_PARAM
+#define _TP_IP_PARAM()         ip
+#else /* TP_IP_PARAM */
+#define _TP_IP_PARAM()         __builtin_return_address(0)
+#endif /* TP_IP_PARAM */
+
 /*
  * Using twice size for filter stack data to hold size and pointer for
  * each field (worse case). For integers, max size required is 64-bit.
@@ -621,7 +628,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);                               \
+       __ctx.ip = _TP_IP_PARAM();                                            \
        __ret = __chan->ops->event_reserve(&__ctx, __event->id);              \
        if (__ret < 0)                                                        \
                return;                                                       \
index 1e3288843f65a9e2e86816abbdc4adf350a2f1b4..2afd7f9953dde4e35791c45ec321dd4a5a7e3424 100644 (file)
@@ -30,6 +30,7 @@
 
 #endif /* _TRACEPOINT_LTTNG_UST_TRACEF_PROVIDER_H */
 
+#define TP_IP_PARAM    /* IP context received as parameter */
 #undef TRACEPOINT_INCLUDE
 #define TRACEPOINT_INCLUDE "./lttng-ust-tracef.h"
 
index 9ef063ce754c4bdcc05edf199c47794cb9afc066..dcae3be746f45350d5d17b9decf5dae90e70de2b 100644 (file)
@@ -39,7 +39,8 @@ void _lttng_ust_tracef(const char *fmt, ...)
        /* len does not include the final \0 */
        if (len < 0)
                goto end;
-       __tracepoint_cb_lttng_ust_tracef___event(msg, len);
+       __tracepoint_cb_lttng_ust_tracef___event(msg, len,
+               __builtin_return_address(0));
        free(msg);
 end:
        va_end(ap);
This page took 0.02749 seconds and 4 git commands to generate.