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.tru...@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

Reply via email to