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 <[email protected]>
Cc: John Garry <[email protected]>
Cc: Will Deacon <[email protected]>
Cc: Mathieu Poirier <[email protected]>
Cc: Leo Yan <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Ingo Molnar <[email protected]>
Cc: Arnaldo Carvalho de Melo <[email protected]>
Cc: Mark Rutland <[email protected]>
Cc: Alexander Shishkin <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Kemeng Shi <[email protected]>
Cc: Ian Rogers <[email protected]>
Cc: Andi Kleen <[email protected]>
Cc: Kan Liang <[email protected]>
Cc: Jin Yao <[email protected]>
Cc: Adrian Hunter <[email protected]>
Cc: Suzuki K Poulose <[email protected]>
Cc: Al Grant <[email protected]>
Cc: James Clark <[email protected]>
Cc: Wilco Dijkstra <[email protected]>
---
 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 522ea3236bcc..40082d70eec1 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

Reply via email to