X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;ds=sidebyside;f=include%2Flttng%2Ftracepoint.h;h=49db615a0996e49b067534e388baaa360a820292;hb=74d65852d2dcb025a00fa5abcb56f6b7521395a4;hp=c4668eab025f6360aff6c5bcec135cca61f58235;hpb=ae14f8220190e23cc9d9ec6023c1813a8fb2ad32;p=lttng-ust.git diff --git a/include/lttng/tracepoint.h b/include/lttng/tracepoint.h index c4668eab..49db615a 100644 --- a/include/lttng/tracepoint.h +++ b/include/lttng/tracepoint.h @@ -1,28 +1,12 @@ -#ifndef _LTTNG_TRACEPOINT_H -#define _LTTNG_TRACEPOINT_H - /* - * Copyright 2011-2012 - Mathieu Desnoyers - * - * 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. + * SPDX-License-Identifier: MIT + * + * Copyright (C) 2011-2012 Mathieu Desnoyers */ +#ifndef _LTTNG_TRACEPOINT_H +#define _LTTNG_TRACEPOINT_H + #include #include #include @@ -31,8 +15,10 @@ #include #include /* for dlopen */ #include /* for memset */ + #include /* for sdt */ #include +#include #ifdef LTTNG_UST_HAVE_SDT_INTEGRATION /* @@ -175,8 +161,9 @@ extern "C" { */ #define _DECLARE_TRACEPOINT(_provider, _name, ...) \ extern struct lttng_ust_tracepoint __tracepoint_##_provider##___##_name; \ -static inline __attribute__((always_inline, unused)) lttng_ust_notrace \ -void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__)); \ +static inline \ +void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__)) \ + __attribute__((always_inline, unused)) lttng_ust_notrace; \ static \ void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__)) \ { \ @@ -198,9 +185,10 @@ void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__)) \ end: \ tp_rcu_read_unlock(); \ } \ -static inline lttng_ust_notrace \ +static inline \ void __tracepoint_register_##_provider##___##_name(char *name, \ - void (*func)(void), void *data); \ + void (*func)(void), void *data) \ + lttng_ust_notrace; \ static inline \ void __tracepoint_register_##_provider##___##_name(char *name, \ void (*func)(void), void *data) \ @@ -208,9 +196,10 @@ void __tracepoint_register_##_provider##___##_name(char *name, \ __tracepoint_probe_register(name, func, data, \ __tracepoint_##_provider##___##_name.signature); \ } \ -static inline lttng_ust_notrace \ +static inline \ void __tracepoint_unregister_##_provider##___##_name(char *name, \ - void (*func)(void), void *data); \ + void (*func)(void), void *data) \ + lttng_ust_notrace; \ static inline \ void __tracepoint_unregister_##_provider##___##_name(char *name, \ void (*func)(void), void *data) \ @@ -226,8 +215,18 @@ extern int __tracepoint_probe_unregister(const char *name, void (*func)(void), /* * tracepoint dynamic linkage handling (callbacks). Hidden visibility: * shared across objects in a module/main executable. + * + * IMPORTANT: this structure is part of the ABI between instrumented + * applications and UST. Fields need to be only added at the end, never + * reordered, never removed. + * + * The field @struct_size should be used to determine the size of the + * structure. It should be queried before using additional fields added + * at the end of the structure. */ struct lttng_ust_tracepoint_dlopen { + uint32_t struct_size; + void *liblttngust_handle; int (*tracepoint_register_lib)(struct lttng_ust_tracepoint * const *tracepoints_start, @@ -236,6 +235,8 @@ struct lttng_ust_tracepoint_dlopen { void (*rcu_read_lock_sym)(void); void (*rcu_read_unlock_sym)(void); void *(*rcu_dereference_sym)(void *p); + + /* End of base ABI. Fields below should be used after checking struct_size. */ }; extern struct lttng_ust_tracepoint_dlopen tracepoint_dlopen; @@ -251,7 +252,9 @@ int __tracepoint_registered int __tracepoint_ptrs_registered __attribute__((weak, visibility("hidden"))); struct lttng_ust_tracepoint_dlopen tracepoint_dlopen - __attribute__((weak, visibility("hidden"))); + __attribute__((weak, visibility("hidden"))) = { + .struct_size = sizeof(struct lttng_ust_tracepoint_dlopen), +}; /* * Deal with gcc O1 optimisation issues with weak hidden symbols. gcc * 4.8 and prior does not have the same behavior for symbol scoping on @@ -269,17 +272,31 @@ struct lttng_ust_tracepoint_dlopen *tracepoint_dlopen_ptr * Tracepoint dynamic linkage handling (callbacks). Hidden visibility: shared * across objects in a module/main executable. The callbacks are used to * control and check if the destructors should be executed. + * + * IMPORTANT: this structure is part of the ABI between instrumented + * applications and UST. Fields need to be only added at the end, never + * reordered, never removed. + * + * The field @struct_size should be used to determine the size of the + * structure. It should be queried before using additional fields added + * at the end of the structure. */ struct lttng_ust_tracepoint_destructors_syms { + uint32_t struct_size; + void (*tracepoint_disable_destructors)(void); int (*tracepoint_get_destructors_state)(void); + + /* End of base ABI. Fields below should be used after checking struct_size. */ }; extern struct lttng_ust_tracepoint_destructors_syms tracepoint_destructors_syms; extern struct lttng_ust_tracepoint_destructors_syms *tracepoint_destructors_syms_ptr; struct lttng_ust_tracepoint_destructors_syms tracepoint_destructors_syms - __attribute__((weak, visibility("hidden"))); + __attribute__((weak, visibility("hidden"))) = { + .struct_size = sizeof(struct lttng_ust_tracepoint_destructors_syms), +}; struct lttng_ust_tracepoint_destructors_syms *tracepoint_destructors_syms_ptr __attribute__((weak, visibility("hidden"))); @@ -295,8 +312,9 @@ static inline void tracepoint_disable_destructors(void) } #ifndef _LGPL_SOURCE -static inline void lttng_ust_notrace -__tracepoint__init_urcu_sym(void); +static inline void +__tracepoint__init_urcu_sym(void) + lttng_ust_notrace; static inline void __tracepoint__init_urcu_sym(void) { @@ -323,16 +341,18 @@ __tracepoint__init_urcu_sym(void) "tp_rcu_dereference_sym")); } #else -static inline void lttng_ust_notrace -__tracepoint__init_urcu_sym(void); +static inline void +__tracepoint__init_urcu_sym(void) + lttng_ust_notrace; static inline void __tracepoint__init_urcu_sym(void) { } #endif -static void lttng_ust_notrace __attribute__((constructor)) -__tracepoints__init(void); +static void +__tracepoints__init(void) + lttng_ust_notrace __attribute__((constructor)); static void __tracepoints__init(void) { @@ -347,14 +367,15 @@ __tracepoints__init(void) tracepoint_dlopen_ptr = &tracepoint_dlopen; if (!tracepoint_dlopen_ptr->liblttngust_handle) tracepoint_dlopen_ptr->liblttngust_handle = - dlopen("liblttng-ust-tracepoint.so.1", RTLD_NOW | RTLD_GLOBAL); + dlopen(LTTNG_UST_TRACEPOINT_LIB_SONAME, RTLD_NOW | RTLD_GLOBAL); if (!tracepoint_dlopen_ptr->liblttngust_handle) return; __tracepoint__init_urcu_sym(); } -static void lttng_ust_notrace __attribute__((destructor)) -__tracepoints__destroy(void); +static void +__tracepoints__destroy(void) + lttng_ust_notrace __attribute__((destructor)); static void __tracepoints__destroy(void) { @@ -430,14 +451,13 @@ extern struct lttng_ust_tracepoint * const __stop___tracepoints_ptrs[] __attribute__((section("__tracepoints_strings"))) = \ #_provider ":" #_name; \ struct lttng_ust_tracepoint __tracepoint_##_provider##___##_name \ - __attribute__((section("__tracepoints"))) = \ - { \ + __attribute__((section("__tracepoints"))) = { \ + sizeof(struct lttng_ust_tracepoint), \ __tp_strtab_##_provider##___##_name, \ 0, \ NULL, \ _TRACEPOINT_UNDEFINED_REF(_provider), \ _TP_EXTRACT_STRING(_args), \ - { }, \ }; \ static struct lttng_ust_tracepoint * \ __tracepoint_ptr_##_provider##___##_name \ @@ -445,8 +465,9 @@ extern struct lttng_ust_tracepoint * const __stop___tracepoints_ptrs[] __lttng_ust_variable_attribute_no_sanitize_address = \ &__tracepoint_##_provider##___##_name; -static void lttng_ust_notrace __attribute__((constructor)) -__tracepoints__ptrs_init(void); +static void +__tracepoints__ptrs_init(void) + lttng_ust_notrace __attribute__((constructor)); static void __tracepoints__ptrs_init(void) { @@ -456,7 +477,7 @@ __tracepoints__ptrs_init(void) tracepoint_dlopen_ptr = &tracepoint_dlopen; if (!tracepoint_dlopen_ptr->liblttngust_handle) tracepoint_dlopen_ptr->liblttngust_handle = - dlopen("liblttng-ust-tracepoint.so.1", RTLD_NOW | RTLD_GLOBAL); + dlopen(LTTNG_UST_TRACEPOINT_LIB_SONAME, RTLD_NOW | RTLD_GLOBAL); if (!tracepoint_dlopen_ptr->liblttngust_handle) return; if (!tracepoint_destructors_syms_ptr) @@ -485,8 +506,9 @@ __tracepoints__ptrs_init(void) } } -static void lttng_ust_notrace __attribute__((destructor)) -__tracepoints__ptrs_destroy(void); +static void +__tracepoints__ptrs_destroy(void) + lttng_ust_notrace __attribute__((destructor)); static void __tracepoints__ptrs_destroy(void) {