From a818861c6353e2601dadad442acad19fc1c508b7 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Mon, 15 Oct 2012 22:07:58 -0400 Subject: [PATCH] callsite: extract instruction pointer from call sites Signed-off-by: Mathieu Desnoyers --- include/lttng/tracepoint-types.h | 5 +++-- include/lttng/tracepoint.h | 35 ++++++++++++++++++++------------ liblttng-ust/ltt-events.c | 4 +++- liblttng-ust/tracepoint.c | 5 +++-- 4 files changed, 31 insertions(+), 18 deletions(-) diff --git a/include/lttng/tracepoint-types.h b/include/lttng/tracepoint-types.h index 27500d40..838446fa 100644 --- a/include/lttng/tracepoint-types.h +++ b/include/lttng/tracepoint-types.h @@ -32,11 +32,12 @@ struct tracepoint { #define TRACEPOINT_CALLSITE_PADDING 16 struct tracepoint_callsite { - const struct tracepoint *tp; + const char *name; const char *func; const char *file; + void *ip; unsigned int lineno; char padding[TRACEPOINT_CALLSITE_PADDING]; -}; +} __attribute__((packed)); #endif /* _LTTNG_TRACEPOINT_TYPES_H */ diff --git a/include/lttng/tracepoint.h b/include/lttng/tracepoint.h index 8086b648..61d227d5 100644 --- a/include/lttng/tracepoint.h +++ b/include/lttng/tracepoint.h @@ -220,25 +220,34 @@ struct tracepoint_callsite_dlopen tracepoint_callsite_dlopen int __tracepoint_callsite_registered __attribute__((weak, visibility("hidden"))); +#if (CAA_BITS_PER_LONG == 64) +#define __TP_ASM_PTR ".quad " +#else +#define __TP_ASM_PTR ".long " +#endif + /* * Note: to allow PIC code, we need to allow the linker to update the pointers * in the __tracepoints_callsite_ptrs section. * Therefore, this section is _not_ const (read-only). */ #define TRACEPOINT_CALLSITE(_provider, _name) \ - static struct tracepoint_callsite \ - __tracepoint_callsite_##_provider##___##_name \ - __attribute__((section("__tracepoint_callsite"))) = \ - { \ - .tp = &__tracepoint_##_provider##___##_name, \ - .func = __func__, \ - .file = __FILE__, \ - .lineno = __LINE__, \ - }; \ - static struct tracepoint_callsite * \ - __tracepoint_callsite_ptr_##_provider##___##_name \ - __attribute__((used, section("__tracepoint_callsite_ptrs"))) = \ - &__tracepoint_callsite_##_provider##___##_name +do { \ + asm volatile ( ".pushsection __tracepoint_callsite, \"aw\"\n\t" \ + "1:\n\t" \ + __TP_ASM_PTR "%c0, %c1, %c2, 2f\n\t" \ + ".int %c3\n\t" \ + ".space 16\n\t" /* padding */ \ + ".popsection\n\t" \ + ".pushsection __tracepoint_callsite_ptrs, \"aw\"\n\t" \ + __TP_ASM_PTR "1b\n\t" \ + ".popsection\n\t" \ + "2:\n\t" \ + : : "i" (#_provider ":" #_name), \ + "i" (__func__), \ + "i" (__FILE__), \ + "i" (__LINE__)); \ +} while (0) /* * These weak symbols, the constructor, and destructor take care of diff --git a/liblttng-ust/ltt-events.c b/liblttng-ust/ltt-events.c index 2109b8c2..6b9170a0 100644 --- a/liblttng-ust/ltt-events.c +++ b/liblttng-ust/ltt-events.c @@ -1016,11 +1016,13 @@ int _ltt_callsite_metadata_statedump(struct ltt_session *session, "callsite {\n" " name = \"%s\";\n" " func = \"%s\";\n" + " ip = %p;\n" " file = \"%s\";\n" " line = %u;\n" "};\n\n", - callsite->tp_cs->tp->name, + callsite->tp_cs->name, callsite->tp_cs->func, + callsite->tp_cs->ip, callsite->tp_cs->file, callsite->tp_cs->lineno); if (ret) diff --git a/liblttng-ust/tracepoint.c b/liblttng-ust/tracepoint.c index 3abed871..6585daa8 100644 --- a/liblttng-ust/tracepoint.c +++ b/liblttng-ust/tracepoint.c @@ -736,9 +736,10 @@ int tracepoint_register_lib_callsite(struct tracepoint_callsite * const *tp_star for (i = 0; i < tp_count; i++) { if (!tp_start[i]) /* Check for dummy */ continue; - DBG("registered callsite for tracepoint \"%s\" at %s@%s:%u", - tp_start[i]->tp->name, + DBG("registered callsite for tracepoint \"%s\" at %s@%p:%s:%u", + tp_start[i]->name, tp_start[i]->func, + tp_start[i]->ip, tp_start[i]->file, tp_start[i]->lineno); real_count++; -- 2.34.1