X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=include%2Fust%2Ftracepoint.h;h=b2e03cd46bfcdbac2b01b59417ebf3ddb80e601c;hb=cc7b66ba103c213a84159c2128cd4096507bdd2b;hp=8be8697942f567c6890735ae4dc93bfb62df6bf7;hpb=fc1caebc8a71283c7766549ebed47300d1b52945;p=ust.git diff --git a/include/ust/tracepoint.h b/include/ust/tracepoint.h index 8be8697..b2e03cd 100644 --- a/include/ust/tracepoint.h +++ b/include/ust/tracepoint.h @@ -49,6 +49,18 @@ struct tracepoint { #define TP_PROTO(args...) args #define TP_ARGS(args...) args +/* + * Tracepoints should be added to the instrumented code using the + * "tracepoint()" macro. + */ +#define tracepoint(name, args...) __trace_##name(args) + +#define register_tracepoint(name, probe, data) \ + __register_trace_##name(probe, data) + +#define unregister_tracepoint(name, probe, data) \ + __unregister_trace_##name(probe, data) + #define CONFIG_TRACEPOINTS #ifdef CONFIG_TRACEPOINTS @@ -99,7 +111,7 @@ struct tracepoint { */ #define __DECLARE_TRACE(name, proto, args, data_proto, data_args) \ extern struct tracepoint __tracepoint_##name; \ - static inline void trace_##name(proto) \ + static inline void __trace_##name(proto) \ { \ __CHECK_TRACE(name, 0, TP_PROTO(data_proto), \ TP_ARGS(data_args)); \ @@ -110,14 +122,14 @@ struct tracepoint { TP_ARGS(data_args)); \ } \ static inline int \ - register_trace_##name(void (*probe)(data_proto), void *data) \ + __register_trace_##name(void (*probe)(data_proto), void *data) \ { \ return tracepoint_probe_register(#name, (void *)probe, \ data); \ \ } \ static inline int \ - unregister_trace_##name(void (*probe)(data_proto), void *data) \ + __unregister_trace_##name(void (*probe)(data_proto), void *data)\ { \ return tracepoint_probe_unregister(#name, (void *)probe, \ data); \ @@ -145,11 +157,11 @@ extern void tracepoint_update_probe_range(struct tracepoint * const *begin, { } \ static inline void _trace_##name(proto) \ { } \ - static inline int register_trace_##name(void (*probe)(proto), void *data) \ + static inline int __register_trace_##name(void (*probe)(proto), void *data) \ { \ return -ENOSYS; \ } \ - static inline int unregister_trace_##name(void (*probe)(proto), void *data) \ + static inline int __unregister_trace_##name(void (*probe)(proto), void *data) \ { \ return -ENOSYS; \ } @@ -220,17 +232,20 @@ extern int tracepoint_register_lib(struct tracepoint * const *tracepoints_start, extern int tracepoint_unregister_lib(struct tracepoint * const *tracepoints_start); #define TRACEPOINT_LIB \ - extern struct tracepoint * const __start___tracepoints[] __attribute__((weak, visibility("hidden"))); \ - extern struct tracepoint * const __stop___tracepoints[] __attribute__((weak, visibility("hidden"))); \ - static void __attribute__((constructor)) __tracepoints__init(void) \ - { \ - tracepoint_register_lib(__start___tracepoints, \ - (((long)__stop___tracepoints)-((long)__start___tracepoints)) / sizeof(*__start___tracepoints)); \ - } \ - \ - static void __attribute__((destructor)) __tracepoints__destroy(void) \ - { \ - tracepoint_unregister_lib(__start___tracepoints); \ + extern struct tracepoint * const __start___tracepoints_ptrs[] __attribute__((weak, visibility("hidden"))); \ + extern struct tracepoint * const __stop___tracepoints_ptrs[] __attribute__((weak, visibility("hidden"))); \ + static struct tracepoint * const __tracepoint_ptr_dummy \ + __attribute__((used, section("__tracepoints_ptrs"))) = NULL; \ + static void __attribute__((constructor)) __tracepoints__init(void) \ + { \ + tracepoint_register_lib(__start___tracepoints_ptrs, \ + __stop___tracepoints_ptrs - \ + __start___tracepoints_ptrs); \ + } \ + \ + static void __attribute__((destructor)) __tracepoints__destroy(void) \ + { \ + tracepoint_unregister_lib(__start___tracepoints_ptrs); \ } @@ -376,6 +391,8 @@ extern int trace_event_unregister_lib(struct trace_event * const *start_trace_ev __attribute__((weak, visibility("hidden"))); \ extern struct trace_event * const __stop___trace_events_ptrs[] \ __attribute__((weak, visibility("hidden"))); \ + static struct trace_event * const __event_ptrs_dummy \ + __attribute__((used, section("__trace_events_ptrs"))) = NULL; \ static void __attribute__((constructor)) \ __trace_events__init(void) \ { \