diff options
Diffstat (limited to 'tools/perf/util')
| -rw-r--r-- | tools/perf/util/annotate.h | 8 | ||||
| -rw-r--r-- | tools/perf/util/cache.h | 2 | ||||
| -rw-r--r-- | tools/perf/util/hweight.c | 31 | ||||
| -rw-r--r-- | tools/perf/util/include/asm/hweight.h | 8 | ||||
| -rw-r--r-- | tools/perf/util/machine.c | 4 | ||||
| -rw-r--r-- | tools/perf/util/probe-event.c | 4 | ||||
| -rw-r--r-- | tools/perf/util/python-ext-sources | 2 | ||||
| -rw-r--r-- | tools/perf/util/unwind-libunwind.c | 28 |
8 files changed, 37 insertions, 50 deletions
diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h index 0784a9420528..cadbdc90a5cb 100644 --- a/tools/perf/util/annotate.h +++ b/tools/perf/util/annotate.h | |||
| @@ -116,11 +116,6 @@ struct annotation { | |||
| 116 | struct annotated_source *src; | 116 | struct annotated_source *src; |
| 117 | }; | 117 | }; |
| 118 | 118 | ||
| 119 | struct sannotation { | ||
| 120 | struct annotation annotation; | ||
| 121 | struct symbol symbol; | ||
| 122 | }; | ||
| 123 | |||
| 124 | static inline struct sym_hist *annotation__histogram(struct annotation *notes, int idx) | 119 | static inline struct sym_hist *annotation__histogram(struct annotation *notes, int idx) |
| 125 | { | 120 | { |
| 126 | return (((void *)¬es->src->histograms) + | 121 | return (((void *)¬es->src->histograms) + |
| @@ -129,8 +124,7 @@ static inline struct sym_hist *annotation__histogram(struct annotation *notes, i | |||
| 129 | 124 | ||
| 130 | static inline struct annotation *symbol__annotation(struct symbol *sym) | 125 | static inline struct annotation *symbol__annotation(struct symbol *sym) |
| 131 | { | 126 | { |
| 132 | struct sannotation *a = container_of(sym, struct sannotation, symbol); | 127 | return (void *)sym - symbol_conf.priv_size; |
| 133 | return &a->annotation; | ||
| 134 | } | 128 | } |
| 135 | 129 | ||
| 136 | int addr_map_symbol__inc_samples(struct addr_map_symbol *ams, int evidx); | 130 | int addr_map_symbol__inc_samples(struct addr_map_symbol *ams, int evidx); |
diff --git a/tools/perf/util/cache.h b/tools/perf/util/cache.h index 5cf9e1b5989d..d04d770d90f6 100644 --- a/tools/perf/util/cache.h +++ b/tools/perf/util/cache.h | |||
| @@ -71,7 +71,9 @@ extern char *perf_path(const char *fmt, ...) __attribute__((format (printf, 1, 2 | |||
| 71 | extern char *perf_pathdup(const char *fmt, ...) | 71 | extern char *perf_pathdup(const char *fmt, ...) |
| 72 | __attribute__((format (printf, 1, 2))); | 72 | __attribute__((format (printf, 1, 2))); |
| 73 | 73 | ||
| 74 | #ifndef __UCLIBC__ | ||
| 74 | /* Matches the libc/libbsd function attribute so we declare this unconditionally: */ | 75 | /* Matches the libc/libbsd function attribute so we declare this unconditionally: */ |
| 75 | extern size_t strlcpy(char *dest, const char *src, size_t size); | 76 | extern size_t strlcpy(char *dest, const char *src, size_t size); |
| 77 | #endif | ||
| 76 | 78 | ||
| 77 | #endif /* __PERF_CACHE_H */ | 79 | #endif /* __PERF_CACHE_H */ |
diff --git a/tools/perf/util/hweight.c b/tools/perf/util/hweight.c deleted file mode 100644 index 5c1d0d099f0d..000000000000 --- a/tools/perf/util/hweight.c +++ /dev/null | |||
| @@ -1,31 +0,0 @@ | |||
| 1 | #include <linux/bitops.h> | ||
| 2 | |||
| 3 | /** | ||
| 4 | * hweightN - returns the hamming weight of a N-bit word | ||
| 5 | * @x: the word to weigh | ||
| 6 | * | ||
| 7 | * The Hamming Weight of a number is the total number of bits set in it. | ||
| 8 | */ | ||
| 9 | |||
| 10 | unsigned int hweight32(unsigned int w) | ||
| 11 | { | ||
| 12 | unsigned int res = w - ((w >> 1) & 0x55555555); | ||
| 13 | res = (res & 0x33333333) + ((res >> 2) & 0x33333333); | ||
| 14 | res = (res + (res >> 4)) & 0x0F0F0F0F; | ||
| 15 | res = res + (res >> 8); | ||
| 16 | return (res + (res >> 16)) & 0x000000FF; | ||
| 17 | } | ||
| 18 | |||
| 19 | unsigned long hweight64(__u64 w) | ||
| 20 | { | ||
| 21 | #if BITS_PER_LONG == 32 | ||
| 22 | return hweight32((unsigned int)(w >> 32)) + hweight32((unsigned int)w); | ||
| 23 | #elif BITS_PER_LONG == 64 | ||
| 24 | __u64 res = w - ((w >> 1) & 0x5555555555555555ul); | ||
| 25 | res = (res & 0x3333333333333333ul) + ((res >> 2) & 0x3333333333333333ul); | ||
| 26 | res = (res + (res >> 4)) & 0x0F0F0F0F0F0F0F0Ful; | ||
| 27 | res = res + (res >> 8); | ||
| 28 | res = res + (res >> 16); | ||
| 29 | return (res + (res >> 32)) & 0x00000000000000FFul; | ||
| 30 | #endif | ||
| 31 | } | ||
diff --git a/tools/perf/util/include/asm/hweight.h b/tools/perf/util/include/asm/hweight.h deleted file mode 100644 index 36cf26d434a5..000000000000 --- a/tools/perf/util/include/asm/hweight.h +++ /dev/null | |||
| @@ -1,8 +0,0 @@ | |||
| 1 | #ifndef PERF_HWEIGHT_H | ||
| 2 | #define PERF_HWEIGHT_H | ||
| 3 | |||
| 4 | #include <linux/types.h> | ||
| 5 | unsigned int hweight32(unsigned int w); | ||
| 6 | unsigned long hweight64(__u64 w); | ||
| 7 | |||
| 8 | #endif /* PERF_HWEIGHT_H */ | ||
diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c index 94de3e48b490..1bca3a9f2b16 100644 --- a/tools/perf/util/machine.c +++ b/tools/perf/util/machine.c | |||
| @@ -389,7 +389,6 @@ static struct thread *__machine__findnew_thread(struct machine *machine, | |||
| 389 | if (th != NULL) { | 389 | if (th != NULL) { |
| 390 | rb_link_node(&th->rb_node, parent, p); | 390 | rb_link_node(&th->rb_node, parent, p); |
| 391 | rb_insert_color(&th->rb_node, &machine->threads); | 391 | rb_insert_color(&th->rb_node, &machine->threads); |
| 392 | machine->last_match = th; | ||
| 393 | 392 | ||
| 394 | /* | 393 | /* |
| 395 | * We have to initialize map_groups separately | 394 | * We have to initialize map_groups separately |
| @@ -400,9 +399,12 @@ static struct thread *__machine__findnew_thread(struct machine *machine, | |||
| 400 | * leader and that would screwed the rb tree. | 399 | * leader and that would screwed the rb tree. |
| 401 | */ | 400 | */ |
| 402 | if (thread__init_map_groups(th, machine)) { | 401 | if (thread__init_map_groups(th, machine)) { |
| 402 | rb_erase(&th->rb_node, &machine->threads); | ||
| 403 | thread__delete(th); | 403 | thread__delete(th); |
| 404 | return NULL; | 404 | return NULL; |
| 405 | } | 405 | } |
| 406 | |||
| 407 | machine->last_match = th; | ||
| 406 | } | 408 | } |
| 407 | 409 | ||
| 408 | return th; | 410 | return th; |
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 7f9b8632e433..94a717bf007d 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c | |||
| @@ -2052,9 +2052,11 @@ static int write_probe_trace_event(int fd, struct probe_trace_event *tev) | |||
| 2052 | pr_debug("Writing event: %s\n", buf); | 2052 | pr_debug("Writing event: %s\n", buf); |
| 2053 | if (!probe_event_dry_run) { | 2053 | if (!probe_event_dry_run) { |
| 2054 | ret = write(fd, buf, strlen(buf)); | 2054 | ret = write(fd, buf, strlen(buf)); |
| 2055 | if (ret <= 0) | 2055 | if (ret <= 0) { |
| 2056 | ret = -errno; | ||
| 2056 | pr_warning("Failed to write event: %s\n", | 2057 | pr_warning("Failed to write event: %s\n", |
| 2057 | strerror_r(errno, sbuf, sizeof(sbuf))); | 2058 | strerror_r(errno, sbuf, sizeof(sbuf))); |
| 2059 | } | ||
| 2058 | } | 2060 | } |
| 2059 | free(buf); | 2061 | free(buf); |
| 2060 | return ret; | 2062 | return ret; |
diff --git a/tools/perf/util/python-ext-sources b/tools/perf/util/python-ext-sources index 16a475a7d492..6c6a6953fa93 100644 --- a/tools/perf/util/python-ext-sources +++ b/tools/perf/util/python-ext-sources | |||
| @@ -10,7 +10,7 @@ util/ctype.c | |||
| 10 | util/evlist.c | 10 | util/evlist.c |
| 11 | util/evsel.c | 11 | util/evsel.c |
| 12 | util/cpumap.c | 12 | util/cpumap.c |
| 13 | util/hweight.c | 13 | ../../lib/hweight.c |
| 14 | util/thread_map.c | 14 | util/thread_map.c |
| 15 | util/util.c | 15 | util/util.c |
| 16 | util/xyarray.c | 16 | util/xyarray.c |
diff --git a/tools/perf/util/unwind-libunwind.c b/tools/perf/util/unwind-libunwind.c index 371219a6daf1..6edf535f65c2 100644 --- a/tools/perf/util/unwind-libunwind.c +++ b/tools/perf/util/unwind-libunwind.c | |||
| @@ -185,6 +185,28 @@ static u64 elf_section_offset(int fd, const char *name) | |||
| 185 | return offset; | 185 | return offset; |
| 186 | } | 186 | } |
| 187 | 187 | ||
| 188 | #ifndef NO_LIBUNWIND_DEBUG_FRAME | ||
| 189 | static int elf_is_exec(int fd, const char *name) | ||
| 190 | { | ||
| 191 | Elf *elf; | ||
| 192 | GElf_Ehdr ehdr; | ||
| 193 | int retval = 0; | ||
| 194 | |||
| 195 | elf = elf_begin(fd, PERF_ELF_C_READ_MMAP, NULL); | ||
| 196 | if (elf == NULL) | ||
| 197 | return 0; | ||
| 198 | if (gelf_getehdr(elf, &ehdr) == NULL) | ||
| 199 | goto out; | ||
| 200 | |||
| 201 | retval = (ehdr.e_type == ET_EXEC); | ||
| 202 | |||
| 203 | out: | ||
| 204 | elf_end(elf); | ||
| 205 | pr_debug("unwind: elf_is_exec(%s): %d\n", name, retval); | ||
| 206 | return retval; | ||
| 207 | } | ||
| 208 | #endif | ||
| 209 | |||
| 188 | struct table_entry { | 210 | struct table_entry { |
| 189 | u32 start_ip_offset; | 211 | u32 start_ip_offset; |
| 190 | u32 fde_offset; | 212 | u32 fde_offset; |
| @@ -322,8 +344,12 @@ find_proc_info(unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi, | |||
| 322 | #ifndef NO_LIBUNWIND_DEBUG_FRAME | 344 | #ifndef NO_LIBUNWIND_DEBUG_FRAME |
| 323 | /* Check the .debug_frame section for unwinding info */ | 345 | /* Check the .debug_frame section for unwinding info */ |
| 324 | if (!read_unwind_spec_debug_frame(map->dso, ui->machine, &segbase)) { | 346 | if (!read_unwind_spec_debug_frame(map->dso, ui->machine, &segbase)) { |
| 347 | int fd = dso__data_fd(map->dso, ui->machine); | ||
| 348 | int is_exec = elf_is_exec(fd, map->dso->name); | ||
| 349 | unw_word_t base = is_exec ? 0 : map->start; | ||
| 350 | |||
| 325 | memset(&di, 0, sizeof(di)); | 351 | memset(&di, 0, sizeof(di)); |
| 326 | if (dwarf_find_debug_frame(0, &di, ip, 0, map->dso->name, | 352 | if (dwarf_find_debug_frame(0, &di, ip, base, map->dso->name, |
| 327 | map->start, map->end)) | 353 | map->start, map->end)) |
| 328 | return dwarf_search_unwind_table(as, ip, &di, pi, | 354 | return dwarf_search_unwind_table(as, ip, &di, pi, |
| 329 | need_unwind_info, arg); | 355 | need_unwind_info, arg); |
