mirror of
https://github.com/ipxe/ipxe
synced 2026-02-11 22:00:06 +03:00
[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 <mcb30@ipxe.org>
This commit is contained in:
@@ -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.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user