On 07/17/2012 04:13 PM, Mathieu Desnoyers wrote:

I think we want to make the notrace always active. I don't see the point
in letting UST lib be compiled with those tracing stubs in place.

OK, I'll remove that ...

We should create a include/lttng/ust-compiler.h with:

#define lttng_ust_notrace __attribute__((no_instrument_function))

so we don't duplicate the define.

... and use include/lttng/ust-compiler.h instead.

Can't we simply specify the attribute on the function definition, rather
than having to duplicate its prototype ?

No. I tried that before but unfortunately it didn't work. It only works consistently if the attribute is on the function declaration. If you try to put it on the definition it will result in compiler errors either when tracepoint providers are compiled or when tracepoint provider header files are used.

The updated patch is in the attachment.

Thanks,
Paul

--
Paul Woegerer | SW Development Engineer
Mentor Embedded(tm) | Prinz Eugen Straße 72/2/4, Vienna, 1040 Austria
P 43.1.535991320
Nucleus® | Linux® | Android(tm) | Services | UI | Multi-OS

Android is a trademark of Google Inc. Use of this trademark is subject to 
Google Permissions.
Linux is the registered trademark of Linus Torvalds in the U.S. and other 
countries.

>From 46e709a85edbca6b9c869148cadd2abac2f98acf Mon Sep 17 00:00:00 2001
From: Paul Woegerer <paul_woege...@mentor.com>
Date: Wed, 18 Jul 2012 12:27:07 +0200
Subject: [PATCH] Make lttng-ust robust against -finstrument-functions.

---
 include/Makefile.am                  |    1 +
 include/lttng/ringbuffer-config.h    |   17 +++++++++++++++++
 include/lttng/tracepoint.h           |    8 ++++++++
 include/lttng/ust-compiler.h         |   21 +++++++++++++++++++++
 include/lttng/ust-tracepoint-event.h |    8 ++++++++
 5 files changed, 55 insertions(+)
 create mode 100644 include/lttng/ust-compiler.h

diff --git a/include/Makefile.am b/include/Makefile.am
index 633260b..208e74e 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 24e7dbe..408d95a 100644
--- a/include/lttng/ringbuffer-config.h
+++ b/include/lttng/ringbuffer-config.h
@@ -27,6 +27,7 @@
 #include <urcu/arch.h>
 #include <string.h>
 #include "lttng/align.h"
+#include <lttng/ust-compiler.h>
 
 struct lttng_ust_lib_ring_buffer;
 struct channel;
@@ -232,6 +233,11 @@ static inline
 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) lttng_ust_notrace;
+static inline
+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)
 {
 	ctx->chan = chan;
@@ -276,6 +282,8 @@ void lib_ring_buffer_ctx_init(struct lttng_ust_lib_ring_buffer_ctx *ctx,
  * size_of_type must be non-zero.
  */
 static inline
+unsigned int lib_ring_buffer_align(size_t align_drift, size_t size_of_type) lttng_ust_notrace;
+static inline
 unsigned int lib_ring_buffer_align(size_t align_drift, size_t size_of_type)
 {
 	return offset_align(align_drift, size_of_type);
@@ -290,6 +298,8 @@ unsigned int lib_ring_buffer_align(size_t align_drift, size_t size_of_type)
  * size_of_type must be non-zero.
  */
 static inline
+unsigned int lib_ring_buffer_align(size_t align_drift, size_t size_of_type) lttng_ust_notrace;
+static inline
 unsigned int lib_ring_buffer_align(size_t align_drift, size_t size_of_type)
 {
 	return 0;
@@ -303,6 +313,9 @@ unsigned int lib_ring_buffer_align(size_t align_drift, size_t size_of_type)
  */
 static inline
 void lib_ring_buffer_align_ctx(struct lttng_ust_lib_ring_buffer_ctx *ctx,
+			   size_t alignment) lttng_ust_notrace;
+static inline
+void lib_ring_buffer_align_ctx(struct lttng_ust_lib_ring_buffer_ctx *ctx,
 			   size_t alignment)
 {
 	ctx->buf_offset += lib_ring_buffer_align(ctx->buf_offset,
@@ -316,6 +329,10 @@ void lib_ring_buffer_align_ctx(struct lttng_ust_lib_ring_buffer_ctx *ctx,
 static inline
 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) lttng_ust_notrace;
+static inline
+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)
 {
 	if (config->alloc == RING_BUFFER_ALLOC_GLOBAL
diff --git a/include/lttng/tracepoint.h b/include/lttng/tracepoint.h
index 5bab476..77595d3 100644
--- a/include/lttng/tracepoint.h
+++ b/include/lttng/tracepoint.h
@@ -22,6 +22,7 @@
 #include <string.h>	/* for memset */
 #include <assert.h>
 #include <lttng/ust-config.h>	/* for sdt */
+#include <lttng/ust-compiler.h>
 
 #ifdef LTTNG_UST_HAVE_SDT_INTEGRATION
 #define SDT_USE_VARIADIC
@@ -137,6 +138,7 @@ 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__)) lttng_ust_notrace;	\
 static inline void __tracepoint_cb_##_provider##___##_name(_TP_ARGS_PROTO(__VA_ARGS__))	\
 {											\
 	struct tracepoint_probe *__tp_probe;						\
@@ -158,12 +160,16 @@ end:											\
 	tp_rcu_read_unlock_bp();							\
 }											\
 static inline void __tracepoint_register_##_provider##___##_name(char *name,		\
+		void (*func)(void), void *data) lttng_ust_notrace;					\
+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) lttng_ust_notrace;					\
+static inline void __tracepoint_unregister_##_provider##___##_name(char *name,		\
 		void (*func)(void), void *data)							\
 {											\
 	__tracepoint_probe_unregister(name, func, data);				\
@@ -249,6 +255,7 @@ int __tracepoint_registered
 struct tracepoint_dlopen tracepoint_dlopen
 	__attribute__((weak, visibility("hidden")));
 
+static void __attribute__((constructor)) __tracepoints__init(void) lttng_ust_notrace;
 static void __attribute__((constructor)) __tracepoints__init(void)
 {
 	if (__tracepoint_registered++)
@@ -285,6 +292,7 @@ static void __attribute__((constructor)) __tracepoints__init(void)
 				__start___tracepoints_ptrs);
 }
 
+static void __attribute__((destructor)) __tracepoints__destroy(void) lttng_ust_notrace;
 static void __attribute__((destructor)) __tracepoints__destroy(void)
 {
 	int ret;
diff --git a/include/lttng/ust-compiler.h b/include/lttng/ust-compiler.h
new file mode 100644
index 0000000..c35a23e
--- /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 <mathieu.desnoy...@efficios.com>
+ *                       Paul Woegerer <paul_woege...@mentor.com>
+ *
+ * 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 8db1e68..8628dbe 100644
--- a/include/lttng/ust-tracepoint-event.h
+++ b/include/lttng/ust-tracepoint-event.h
@@ -16,6 +16,7 @@
 #include <urcu/compiler.h>
 #include <lttng/ust-events.h>
 #include <lttng/ringbuffer-config.h>
+#include <lttng/ust-compiler.h>
 #include <string.h>
 
 /*
@@ -244,6 +245,7 @@ static void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_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)) lttng_ust_notrace; \
 static inline size_t __event_get_size__##_provider##___##_name(size_t *__dynamic_len, _TP_ARGS_DATA_PROTO(_args)) \
 {									      \
 	size_t __event_len = 0;						      \
@@ -361,6 +363,7 @@ void __event_prepare_filter_stack__##_provider##___##_name(char *__stack_data,\
 #undef TRACEPOINT_EVENT_CLASS
 #define TRACEPOINT_EVENT_CLASS(_provider, _name, _args, _fields)	      \
 static inline								      \
+size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args)) lttng_ust_notrace; \
 size_t __event_get_align__##_provider##___##_name(_TP_ARGS_PROTO(_args))      \
 {									      \
 	size_t __event_align = 1;					      \
@@ -438,6 +441,7 @@ 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)) lttng_ust_notrace; \
 static void __event_probe__##_provider##___##_name(_TP_ARGS_DATA_PROTO(_args))\
 {									      \
 	struct ltt_event *__event = __tp_data;				      \
@@ -594,6 +598,8 @@ static struct lttng_probe_desc _TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PR
 /* Reset all macros within TRACEPOINT_EVENT */
 #include <lttng/ust-tracepoint-event-reset.h>
 static void __attribute__((constructor))
+_TP_COMBINE_TOKENS(__lttng_events_init__, TRACEPOINT_PROVIDER)(void) lttng_ust_notrace;
+static void __attribute__((constructor))
 _TP_COMBINE_TOKENS(__lttng_events_init__, TRACEPOINT_PROVIDER)(void)
 {
 	int ret;
@@ -603,6 +609,8 @@ _TP_COMBINE_TOKENS(__lttng_events_init__, TRACEPOINT_PROVIDER)(void)
 }
 
 static void __attribute__((destructor))
+_TP_COMBINE_TOKENS(__lttng_events_exit__, TRACEPOINT_PROVIDER)(void) lttng_ust_notrace;
+static void __attribute__((destructor))
 _TP_COMBINE_TOKENS(__lttng_events_exit__, TRACEPOINT_PROVIDER)(void)
 {
 	ltt_probe_unregister(&_TP_COMBINE_TOKENS(__probe_desc___, TRACEPOINT_PROVIDER));
-- 
1.7.10.4

_______________________________________________
lttng-dev mailing list
lttng-dev@lists.lttng.org
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to