From a8909ba54718ed54cefb1b839a5d41a065df09f9 Mon Sep 17 00:00:00 2001 From: Paul Woegerer Date: Wed, 18 Jul 2012 15:28:44 -0400 Subject: [PATCH] Make lttng-ust robust against -finstrument-functions. [ Edit by Mathieu Desnoyers: We need to declare the no_instrument_function attribute on function declarations (rather than definition) for g++. Moved the attribute prior to the function declaration (rather than after) to follow the coding style within LTTng-UST. ] Signed-off-by: Mathieu Desnoyers --- include/Makefile.am | 1 + include/lttng/ringbuffer-config.h | 17 +++++++++++++++ include/lttng/tracepoint.h | 32 ++++++++++++++++++++++------ include/lttng/ust-compiler.h | 21 ++++++++++++++++++ include/lttng/ust-tracepoint-event.h | 23 +++++++++++++++----- 5 files changed, 82 insertions(+), 12 deletions(-) create mode 100644 include/lttng/ust-compiler.h diff --git a/include/Makefile.am b/include/Makefile.am index 633260ba..208e74e9 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -14,6 +14,7 @@ nobase_include_HEADERS = \ lttng/ringbuffer-abi.h \ lttng/ust-tracer.h \ lttng/ust-config.h \ + lttng/ust-compiler.h \ lttng/ust.h \ lttng/ust-endian.h \ lttng/ringbuffer-config.h \ diff --git a/include/lttng/ringbuffer-config.h b/include/lttng/ringbuffer-config.h index 24e7dbeb..650b56b2 100644 --- a/include/lttng/ringbuffer-config.h +++ b/include/lttng/ringbuffer-config.h @@ -27,6 +27,7 @@ #include #include #include "lttng/align.h" +#include struct lttng_ust_lib_ring_buffer; struct channel; @@ -228,6 +229,11 @@ struct lttng_ust_lib_ring_buffer_ctx { * @largest_align: largest alignment within data payload types * @cpu: processor id */ +static inline lttng_ust_notrace +void lib_ring_buffer_ctx_init(struct lttng_ust_lib_ring_buffer_ctx *ctx, + struct channel *chan, void *priv, + size_t data_size, int largest_align, + int cpu, struct lttng_ust_shm_handle *handle); static inline void lib_ring_buffer_ctx_init(struct lttng_ust_lib_ring_buffer_ctx *ctx, struct channel *chan, void *priv, @@ -275,6 +281,8 @@ void lib_ring_buffer_ctx_init(struct lttng_ust_lib_ring_buffer_ctx *ctx, * Calculate the offset needed to align the type. * size_of_type must be non-zero. */ +static inline lttng_ust_notrace +unsigned int lib_ring_buffer_align(size_t align_drift, size_t size_of_type); static inline unsigned int lib_ring_buffer_align(size_t align_drift, size_t size_of_type) { @@ -289,6 +297,8 @@ unsigned int lib_ring_buffer_align(size_t align_drift, size_t size_of_type) * Calculate the offset needed to align the type. * size_of_type must be non-zero. */ +static inline lttng_ust_notrace +unsigned int lib_ring_buffer_align(size_t align_drift, size_t size_of_type); static inline unsigned int lib_ring_buffer_align(size_t align_drift, size_t size_of_type) { @@ -301,6 +311,9 @@ unsigned int lib_ring_buffer_align(size_t align_drift, size_t size_of_type) * lib_ring_buffer_align_ctx - Align context offset on "alignment" * @ctx: ring buffer context. */ +static inline lttng_ust_notrace +void lib_ring_buffer_align_ctx(struct lttng_ust_lib_ring_buffer_ctx *ctx, + size_t alignment); static inline void lib_ring_buffer_align_ctx(struct lttng_ust_lib_ring_buffer_ctx *ctx, size_t alignment) @@ -313,6 +326,10 @@ void lib_ring_buffer_align_ctx(struct lttng_ust_lib_ring_buffer_ctx *ctx, * lib_ring_buffer_check_config() returns 0 on success. * Used internally to check for valid configurations at channel creation. */ +static inline lttng_ust_notrace +int lib_ring_buffer_check_config(const struct lttng_ust_lib_ring_buffer_config *config, + unsigned int switch_timer_interval, + unsigned int read_timer_interval); static inline int lib_ring_buffer_check_config(const struct lttng_ust_lib_ring_buffer_config *config, unsigned int switch_timer_interval, diff --git a/include/lttng/tracepoint.h b/include/lttng/tracepoint.h index 5bab476b..e1de626c 100644 --- a/include/lttng/tracepoint.h +++ b/include/lttng/tracepoint.h @@ -22,6 +22,7 @@ #include /* for memset */ #include #include /* for sdt */ +#include #ifdef LTTNG_UST_HAVE_SDT_INTEGRATION #define SDT_USE_VARIADIC @@ -137,7 +138,10 @@ extern "C" { #define _DECLARE_TRACEPOINT(_provider, _name, ...) \ extern struct tracepoint __tracepoint_##_provider##___##_name; \ -static inline void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__)) \ +static inline 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__)) \ { \ struct tracepoint_probe *__tp_probe; \ \ @@ -157,14 +161,22 @@ static inline void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_A end: \ tp_rcu_read_unlock_bp(); \ } \ -static inline void __tracepoint_register_##_provider##___##_name(char *name, \ - void (*func)(void), void *data) \ +static inline lttng_ust_notrace \ +void __tracepoint_register_##_provider##___##_name(char *name, \ + void (*func)(void), void *data); \ +static inline \ +void __tracepoint_register_##_provider##___##_name(char *name, \ + void (*func)(void), void *data) \ { \ __tracepoint_probe_register(name, func, data, \ __tracepoint_##_provider##___##_name.signature); \ } \ -static inline void __tracepoint_unregister_##_provider##___##_name(char *name, \ - void (*func)(void), void *data) \ +static inline lttng_ust_notrace \ +void __tracepoint_unregister_##_provider##___##_name(char *name, \ + void (*func)(void), void *data); \ +static inline \ +void __tracepoint_unregister_##_provider##___##_name(char *name, \ + void (*func)(void), void *data) \ { \ __tracepoint_probe_unregister(name, func, data); \ } @@ -249,7 +261,10 @@ int __tracepoint_registered struct tracepoint_dlopen tracepoint_dlopen __attribute__((weak, visibility("hidden"))); -static void __attribute__((constructor)) __tracepoints__init(void) +static void lttng_ust_notrace __attribute__((constructor)) +__tracepoints__init(void); +static void +__tracepoints__init(void) { if (__tracepoint_registered++) return; @@ -285,7 +300,10 @@ static void __attribute__((constructor)) __tracepoints__init(void) __start___tracepoints_ptrs); } -static void __attribute__((destructor)) __tracepoints__destroy(void) +static void lttng_ust_notrace __attribute__((destructor)) +__tracepoints__destroy(void); +static void +__tracepoints__destroy(void) { int ret; diff --git a/include/lttng/ust-compiler.h b/include/lttng/ust-compiler.h new file mode 100644 index 00000000..c35a23e1 --- /dev/null +++ b/include/lttng/ust-compiler.h @@ -0,0 +1,21 @@ +#ifndef _LTTNG_UST_COMPILER_H +#define _LTTNG_UST_COMPILER_H + +/* + * Copyright 2011-2012 - Mathieu Desnoyers + * Paul Woegerer + * + * 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. + */ + +#define lttng_ust_notrace __attribute__((no_instrument_function)) + +#endif /* _LTTNG_UST_COMPILER_H */ diff --git a/include/lttng/ust-tracepoint-event.h b/include/lttng/ust-tracepoint-event.h index 8db1e688..aac32b96 100644 --- a/include/lttng/ust-tracepoint-event.h +++ b/include/lttng/ust-tracepoint-event.h @@ -16,6 +16,7 @@ #include #include #include +#include #include /* @@ -243,8 +244,11 @@ static void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)); #define TP_FIELDS(...) __VA_ARGS__ #undef TRACEPOINT_EVENT_CLASS -#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ -static inline size_t __event_get_size__##_provider##___##_name(size_t *__dynamic_len, _TP_ARGS_DATA_PROTO(_args)) \ +#define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ +static inline lttng_ust_notrace \ +size_t __event_get_size__##_provider##___##_name(size_t *__dynamic_len, _TP_ARGS_DATA_PROTO(_args)); \ +static inline \ +size_t __event_get_size__##_provider##___##_name(size_t *__dynamic_len, _TP_ARGS_DATA_PROTO(_args)) \ { \ size_t __event_len = 0; \ unsigned int __dynamic_len_idx = 0; \ @@ -360,6 +364,8 @@ void __event_prepare_filter_stack__##_provider##___##_name(char *__stack_data,\ #undef TRACEPOINT_EVENT_CLASS #define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ +static inline lttng_ust_notrace \ +size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args)); \ static inline \ size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args)) \ { \ @@ -438,7 +444,10 @@ size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args)) \ */ #undef TRACEPOINT_EVENT_CLASS #define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields) \ -static void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args))\ +static lttng_ust_notrace \ +void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)); \ +static \ +void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args)) \ { \ struct ltt_event *__event = __tp_data; \ struct ltt_channel *__chan = __event->chan; \ @@ -593,7 +602,9 @@ static struct lttng_probe_desc _TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PR /* Reset all macros within TRACEPOINT_EVENT */ #include -static void __attribute__((constructor)) +static void lttng_ust_notrace __attribute__((constructor)) +_TP_COMBINE_TOKENS(__lttng_events_init__, TRACEPOINT_PROVIDER)(void); +static void _TP_COMBINE_TOKENS(__lttng_events_init__, TRACEPOINT_PROVIDER)(void) { int ret; @@ -602,7 +613,9 @@ _TP_COMBINE_TOKENS(__lttng_events_init__, TRACEPOINT_PROVIDER)(void) assert(!ret); } -static void __attribute__((destructor)) +static void lttng_ust_notrace __attribute__((destructor)) +_TP_COMBINE_TOKENS(__lttng_events_exit__, TRACEPOINT_PROVIDER)(void); +static void _TP_COMBINE_TOKENS(__lttng_events_exit__, TRACEPOINT_PROVIDER)(void) { ltt_probe_unregister(&_TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PROVIDER)); -- 2.34.1