]> git.ipfire.org Git - thirdparty/kernel/stable.git/blobdiff - tools/perf/builtin-script.c
perf script: Print source line for each jump in brstackinsn
[thirdparty/kernel/stable.git] / tools / perf / builtin-script.c
index b1f57401ff23940d4be38d4a02dbe08223b800fc..af63b7c37c8a52ec261fe7d8db17144e5181b2f1 100644 (file)
@@ -1162,7 +1162,8 @@ out:
 static int ip__fprintf_jump(uint64_t ip, struct branch_entry *en,
                            struct perf_insn *x, u8 *inbuf, int len,
                            int insn, FILE *fp, int *total_cycles,
-                           struct perf_event_attr *attr)
+                           struct perf_event_attr *attr,
+                           struct thread *thread)
 {
        int ilen = 0;
        int printed = fprintf(fp, "\t%016" PRIx64 "\t%-30s\t", ip,
@@ -1171,6 +1172,16 @@ static int ip__fprintf_jump(uint64_t ip, struct branch_entry *en,
        if (PRINT_FIELD(BRSTACKINSNLEN))
                printed += fprintf(fp, "ilen: %d\t", ilen);
 
+       if (PRINT_FIELD(SRCLINE)) {
+               struct addr_location al;
+
+               addr_location__init(&al);
+               thread__find_map(thread, x->cpumode, ip, &al);
+               printed += map__fprintf_srcline(al.map, al.addr, " srcline: ", fp);
+               printed += fprintf(fp, "\t");
+               addr_location__exit(&al);
+       }
+
        printed += fprintf(fp, "#%s%s%s%s",
                              en->flags.predicted ? " PRED" : "",
                              en->flags.mispred ? " MISPRED" : "",
@@ -1182,6 +1193,7 @@ static int ip__fprintf_jump(uint64_t ip, struct branch_entry *en,
                if (insn)
                        printed += fprintf(fp, " %.2f IPC", (float)insn / en->flags.cycles);
        }
+
        return printed + fprintf(fp, "\n");
 }
 
@@ -1260,7 +1272,7 @@ static int perf_sample__fprintf_brstackinsn(struct perf_sample *sample,
                                           x.cpumode, x.cpu, &lastsym, attr, fp);
                printed += ip__fprintf_jump(entries[nr - 1].from, &entries[nr - 1],
                                            &x, buffer, len, 0, fp, &total_cycles,
-                                           attr);
+                                           attr, thread);
                if (PRINT_FIELD(SRCCODE))
                        printed += print_srccode(thread, x.cpumode, entries[nr - 1].from);
        }
@@ -1291,7 +1303,7 @@ static int perf_sample__fprintf_brstackinsn(struct perf_sample *sample,
                        printed += ip__fprintf_sym(ip, thread, x.cpumode, x.cpu, &lastsym, attr, fp);
                        if (ip == end) {
                                printed += ip__fprintf_jump(ip, &entries[i], &x, buffer + off, len - off, ++insn, fp,
-                                                           &total_cycles, attr);
+                                                           &total_cycles, attr, thread);
                                if (PRINT_FIELD(SRCCODE))
                                        printed += print_srccode(thread, x.cpumode, ip);
                                break;