diff options
Diffstat (limited to 'plugin_function.c')
-rw-r--r-- | plugin_function.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/plugin_function.c b/plugin_function.c index 1e88a7f7..5f13a21f 100644 --- a/plugin_function.c +++ b/plugin_function.c @@ -49,12 +49,20 @@ struct pevent_plugin_option plugin_options[] = .set = 1, }, { + .name = "offset", + .plugin_alias = "ftrace", + .description = + "Show function names as well as their offsets", + .set = 0, + }, + { .name = NULL, } }; static struct pevent_plugin_option *ftrace_parent = &plugin_options[0]; static struct pevent_plugin_option *ftrace_indent = &plugin_options[1]; +static struct pevent_plugin_option *ftrace_offset = &plugin_options[2]; static void add_child(struct func_stack *stack, const char *child, int pos) { @@ -122,6 +130,18 @@ static int add_and_get_index(const char *parent, const char *child, int cpu) return 0; } +static void show_function(struct trace_seq *s, struct pevent *pevent, + const char *func, unsigned long long function) +{ + unsigned long long offset; + + trace_seq_printf(s, "%s", func); + if (ftrace_offset->set) { + offset = pevent_find_function_address(pevent, function); + trace_seq_printf(s, "+0x%x ", (int)(function - offset)); + } +} + static int function_handler(struct trace_seq *s, struct pevent_record *record, struct event_format *event, void *context) { @@ -148,14 +168,14 @@ static int function_handler(struct trace_seq *s, struct pevent_record *record, trace_seq_printf(s, "%*s", index*3, ""); if (func) - trace_seq_printf(s, "%s", func); + show_function(s, pevent, func, function); else trace_seq_printf(s, "0x%llx", function); if (ftrace_parent->set) { trace_seq_printf(s, " <-- "); if (parent) - trace_seq_printf(s, "%s", parent); + show_function(s, pevent, parent, pfunction); else trace_seq_printf(s, "0x%llx", pfunction); } |