#ifndef _LTTNG_TRACEPOINT_TYPES_H
#define _LTTNG_TRACEPOINT_TYPES_H
+#include <stdint.h>
+
+/*
+ * Tracepoint probe definition
+ *
+ * IMPORTANT: this structure is part of the ABI between instrumented
+ * applications and UST. This structure is fixed-size because it is part
+ * of a public array of structures. Rather than extending this
+ * structure, struct lttng_ust_tracepoint should be extended instead.
+ */
+
struct lttng_ust_tracepoint_probe {
void (*func)(void);
void *data;
};
-#define LTTNG_UST_TRACEPOINT_PADDING 16
+/*
+ * Tracepoint definition
+ *
+ * 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 {
+ uint32_t struct_size;
+
const char *name;
int state;
struct lttng_ust_tracepoint_probe *probes;
int *tracepoint_provider_ref;
const char *signature;
- char padding[LTTNG_UST_TRACEPOINT_PADDING];
+
+ /* End of base ABI. Fields below should be used after checking struct_size. */
};
#endif /* _LTTNG_TRACEPOINT_TYPES_H */
/*
* 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,
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;
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
* 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")));
__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 \