From ea0fcb9460403a16d4e2a5e1d48ee6279794450c Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sat, 4 Dec 2010 02:55:11 +0000 Subject: [fnrec] Enhance function recording Enhance the information collected by the function recorder to include the call site and entry/exit counts. This allows fnrec.pl to produce a call tree such as: step (from core/getkey.c:46 = 0x17e90) { ref_increment (from core/process.c:93 = 0x73ec) { } net_step (from core/process.c:96 = 0x73f1) { net_poll (from net/netdevice.c:741 = 0xbce6) { netdev_poll (from net/netdevice.c:700 = 0xbc58) { } netdev_rx_dequeue (from net/netdevice.c:709 = 0xbc65) { } } } ref_decrement (from core/process.c:96 = 0x73f9) { } } Note that inlined functions are reported, confusingly, as extra calls to the *containing* function. Minimise this confusion by adding the attribute "no_instrument_function" to all functions declared as inline. (Static functions that have been inlined autonomously by gcc will still be problematic, but these are far fewer in number.) Signed-off-by: Michael Brown --- src/include/compiler.h | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/include') diff --git a/src/include/compiler.h b/src/include/compiler.h index f3f713000..771e0610b 100644 --- a/src/include/compiler.h +++ b/src/include/compiler.h @@ -537,6 +537,19 @@ int __debug_disable; /** Declare a function to be always inline */ #define __always_inline __attribute__ (( always_inline )) +/* Force all inline functions to not be instrumented + * + * This is required to cope with what seems to be a long-standing gcc + * bug, in which -finstrument-functions will cause instances of + * inlined functions to be reported as further calls to the + * *containing* function. This makes instrumentation very difficult + * to use. + * + * Work around this problem by adding the no_instrument_function + * attribute to all inlined functions. + */ +#define inline inline __attribute__ (( no_instrument_function )) + /** * Shared data. * -- cgit v1.2.3-55-g7522