The commit e592488c01d5 ("perf annotate: Support source line numbers in annotate") support source line numbers in annotate.
But we can get filename:line number by symbol__get_source_line() Furthermore, the way can't exactly match source code lines to actual line numbers. For example, Actual source code is as below ... 21 }; 22 23 unsigned int limited_wgt; 24 25 unsigned int get_cond_maxprice(int wgt) 26 { ... However, the output of annotate with the way about regmatch is as below. 4 Disassembly of section .text: 6 0000000000400966 <get_cond_maxprice>: 7 get_cond_maxprice(): 26 }; 28 unsigned int limited_wgt; 30 unsigned int get_cond_maxprice(int wgt) 31 { The root cause is from objdump -S. Because the source code of objdump used to print more code lines than actual one code line according to a particular line number. In the near future, I'll fix the problem about line numbers. Cc: Andi Kleen <a...@linux.intel.com> Cc: Namhyung Kim <namhy...@kernel.org> Cc: Jiri Olsa <jo...@redhat.com> Signed-off-by: Taeung Song <treeze.tae...@gmail.com> --- tools/perf/util/annotate.c | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c index 273f21f..bc54e41 100644 --- a/tools/perf/util/annotate.c +++ b/tools/perf/util/annotate.c @@ -19,14 +19,12 @@ #include "evsel.h" #include "block-range.h" #include "arch/common.h" -#include <regex.h> #include <pthread.h> #include <linux/bitops.h> #include <sys/utsname.h> const char *disassembler_style; const char *objdump_path; -static regex_t file_lineno; static struct ins_ops *ins__find(struct arch *arch, const char *name); static void ins__sort(struct arch *arch); @@ -1151,7 +1149,6 @@ static int symbol__parse_objdump_line(struct symbol *sym, struct map *map, char *line = NULL, *parsed_line, *tmp, *tmp2, *c; size_t line_len; s64 line_ip, offset = -1; - regmatch_t match[2]; if (getline(&line, &line_len, file) < 0) return -1; @@ -1169,12 +1166,6 @@ static int symbol__parse_objdump_line(struct symbol *sym, struct map *map, line_ip = -1; parsed_line = line; - /* /filename:linenr ? Save line number and ignore. */ - if (regexec(&file_lineno, line, 2, match, 0) == 0) { - *line_nr = atoi(line + match[1].rm_so); - return 0; - } - /* * Strip leading spaces: */ @@ -1235,11 +1226,6 @@ static int symbol__parse_objdump_line(struct symbol *sym, struct map *map, return 0; } -static __attribute__((constructor)) void symbol__init_regexpr(void) -{ - regcomp(&file_lineno, "^/[^:]+:([0-9]+)", REG_EXTENDED); -} - static void delete_last_nop(struct symbol *sym) { struct annotation *notes = symbol__annotation(sym); @@ -1435,7 +1421,7 @@ int symbol__disassemble(struct symbol *sym, struct map *map, const char *arch_na snprintf(command, sizeof(command), "%s %s%s --start-address=0x%016" PRIx64 " --stop-address=0x%016" PRIx64 - " -l -d %s %s -C %s 2>/dev/null|grep -v %s|expand", + " -d %s %s -C %s 2>/dev/null|grep -v %s|expand", objdump_path ? objdump_path : "objdump", disassembler_style ? "-M " : "", disassembler_style ? disassembler_style : "", -- 2.7.4