Messages in this thread Patch in this message | | | From | Alexandre Truong <> | Subject | [PATCH v2 2/4] perf tools: add a mechanism to inject stack frames | Date | Fri, 12 Feb 2021 17:03:41 +0000 |
| |
Add a mechanism for platforms to inject stack frames for the leaf frame caller if there is enough information to determine a frame is missing from dwarf or other post processing mechanisms.
Signed-off-by: Alexandre Truong <alexandre.truong@arm.com> --- tools/perf/util/machine.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index ab8a6b3e801d..7f03ffa016b0 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c @@ -2671,6 +2671,12 @@ static int find_prev_cpumode(struct ip_callchain *chain, struct thread *thread, return err; } +static u64 get_leaf_frame_caller(struct perf_sample *sample __maybe_unused, + struct thread *thread __maybe_unused) +{ + return 0; +} + static int thread__resolve_callchain_sample(struct thread *thread, struct callchain_cursor *cursor, struct evsel *evsel, @@ -2687,6 +2693,8 @@ static int thread__resolve_callchain_sample(struct thread *thread, int i, j, err, nr_entries; int skip_idx = -1; int first_call = 0; + u64 leaf_frame_caller; + int pos; if (chain) chain_nr = chain->nr; @@ -2811,6 +2819,21 @@ static int thread__resolve_callchain_sample(struct thread *thread, continue; } + pos = callchain_param.order == ORDER_CALLEE ? 2 : chain_nr - 2; + + if (i == pos) { + leaf_frame_caller = get_leaf_frame_caller(sample, thread); + + if (leaf_frame_caller && leaf_frame_caller != ip) { + + err = add_callchain_ip(thread, cursor, parent, + root_al, &cpumode, leaf_frame_caller, + false, NULL, NULL, 0); + if (err) + return (err < 0) ? err : 0; + } + } + err = add_callchain_ip(thread, cursor, parent, root_al, &cpumode, ip, false, NULL, NULL, 0); -- 2.23.0
| |