perf symbols: Make sym->end be the first address after the symbol range
authorArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 14 Oct 2014 20:19:44 +0000 (17:19 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 14 Oct 2014 20:50:58 +0000 (17:50 -0300)
To follow vm_area_struct->vm_end convention.

By adhering to the convention that ->end is the first address outside
the symbol's range we can do things like:

sym->end = start + len;
len = sym->end - sym->start;

This is also now the convention used for struct map->end, fixing some
off-by-one bugs.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Chuck Ebbert <cebbert.lkml@gmail.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-agomujr7tuqaq6lu7kr6z7h6@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/annotate.c
tools/perf/util/symbol.c
tools/perf/util/symbol.h

index 3643752..7dabde1 100644 (file)
@@ -478,7 +478,7 @@ static int __symbol__inc_addr_samples(struct symbol *sym, struct map *map,
 
        pr_debug3("%s: addr=%#" PRIx64 "\n", __func__, map->unmap_ip(map, addr));
 
-       if (addr < sym->start || addr > sym->end)
+       if (addr < sym->start || addr >= sym->end)
                return -ERANGE;
 
        offset = addr - sym->start;
@@ -836,7 +836,7 @@ static int symbol__parse_objdump_line(struct symbol *sym, struct map *map,
                    end = map__rip_2objdump(map, sym->end);
 
                offset = line_ip - start;
-               if ((u64)line_ip < start || (u64)line_ip > end)
+               if ((u64)line_ip < start || (u64)line_ip >= end)
                        offset = -1;
                else
                        parsed_line = tmp2 + 1;
@@ -966,7 +966,7 @@ fallback:
                kce.kcore_filename = symfs_filename;
                kce.addr = map__rip_2objdump(map, sym->start);
                kce.offs = sym->start;
-               kce.len = sym->end + 1 - sym->start;
+               kce.len = sym->end - sym->start;
                if (!kcore_extract__create(&kce)) {
                        delete_extract = true;
                        strlcpy(symfs_filename, kce.extract_filename,
@@ -987,7 +987,7 @@ fallback:
                 disassembler_style ? "-M " : "",
                 disassembler_style ? disassembler_style : "",
                 map__rip_2objdump(map, sym->start),
-                map__rip_2objdump(map, sym->end+1),
+                map__rip_2objdump(map, sym->end),
                 symbol_conf.annotate_asm_raw ? "" : "--no-show-raw",
                 symbol_conf.annotate_src ? "-S" : "",
                 symfs_filename, filename);
index c787a43..0783311 100644 (file)
@@ -186,7 +186,7 @@ void symbols__fixup_end(struct rb_root *symbols)
                curr = rb_entry(nd, struct symbol, rb_node);
 
                if (prev->end == prev->start && prev->end != curr->start)
-                       prev->end = curr->start - 1;
+                       prev->end = curr->start;
        }
 
        /* Last entry */
@@ -229,7 +229,7 @@ struct symbol *symbol__new(u64 start, u64 len, u8 binding, const char *name)
                sym = ((void *)sym) + symbol_conf.priv_size;
 
        sym->start   = start;
-       sym->end     = len ? start + len - 1 : start;
+       sym->end     = len ? start + len : start;
        sym->binding = binding;
        sym->namelen = namelen - 1;
 
@@ -325,7 +325,7 @@ static struct symbol *symbols__find(struct rb_root *symbols, u64 ip)
 
                if (ip < s->start)
                        n = n->rb_left;
-               else if (ip > s->end)
+               else if (ip >= s->end)
                        n = n->rb_right;
                else
                        return s;
index bec4b7b..eb2c19b 100644 (file)
@@ -95,7 +95,7 @@ void symbols__delete(struct rb_root *symbols);
 
 static inline size_t symbol__size(const struct symbol *sym)
 {
-       return sym->end - sym->start + 1;
+       return sym->end - sym->start;
 }
 
 struct strlist;