diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-05-27 03:10:38 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-05-27 02:10:35 -0400 |
| commit | 16f762a2ac5ecf8a11f6f0332e46cc3459220da5 (patch) | |
| tree | a54f013d037637a91ceac237b2b0455b29cf45d4 | |
| parent | 815e777f913ed54ddb449d2854015c65b4ecbfe3 (diff) | |
perf_counter tools: Introduce stricter C code checking
Tighten up our C code requirements:
- disallow warnings
- disallow declarations-mixed-with-statements
- require proper prototypes
- require C99 (with gcc extensions)
Fix up a ton of problems these measures unearth:
- unused functions
- needlessly global functions
- missing prototypes
- code mixed with declarations
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: John Kacur <jkacur@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <20090526222155.GJ4424@ghostprotocols.net>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
| -rw-r--r-- | Documentation/perf_counter/Makefile | 2 | ||||
| -rw-r--r-- | Documentation/perf_counter/builtin-help.c | 2 | ||||
| -rw-r--r-- | Documentation/perf_counter/builtin-record.c | 38 | ||||
| -rw-r--r-- | Documentation/perf_counter/builtin-report.c | 103 | ||||
| -rw-r--r-- | Documentation/perf_counter/builtin-stat.c | 3 | ||||
| -rw-r--r-- | Documentation/perf_counter/builtin-top.c | 2 | ||||
| -rw-r--r-- | Documentation/perf_counter/util/abspath.c | 2 | ||||
| -rw-r--r-- | Documentation/perf_counter/util/cache.h | 2 | ||||
| -rw-r--r-- | Documentation/perf_counter/util/util.h | 2 |
9 files changed, 82 insertions, 74 deletions
diff --git a/Documentation/perf_counter/Makefile b/Documentation/perf_counter/Makefile index 10c13a6f2bc9..efb05892db69 100644 --- a/Documentation/perf_counter/Makefile +++ b/Documentation/perf_counter/Makefile | |||
| @@ -159,7 +159,7 @@ uname_V := $(shell sh -c 'uname -v 2>/dev/null || echo not') | |||
| 159 | 159 | ||
| 160 | # CFLAGS and LDFLAGS are for the users to override from the command line. | 160 | # CFLAGS and LDFLAGS are for the users to override from the command line. |
| 161 | 161 | ||
| 162 | CFLAGS = -ggdb3 -Wall | 162 | CFLAGS = -ggdb3 -Wall -Werror -Wstrict-prototypes -Wmissing-declarations -Wmissing-prototypes -std=gnu99 -Wdeclaration-after-statement |
| 163 | LDFLAGS = -lpthread -lrt -lelf | 163 | LDFLAGS = -lpthread -lrt -lelf |
| 164 | ALL_CFLAGS = $(CFLAGS) | 164 | ALL_CFLAGS = $(CFLAGS) |
| 165 | ALL_LDFLAGS = $(LDFLAGS) | 165 | ALL_LDFLAGS = $(LDFLAGS) |
diff --git a/Documentation/perf_counter/builtin-help.c b/Documentation/perf_counter/builtin-help.c index 6616de0ef053..d2bd3177b98c 100644 --- a/Documentation/perf_counter/builtin-help.c +++ b/Documentation/perf_counter/builtin-help.c | |||
| @@ -399,7 +399,7 @@ static void get_html_page_path(struct strbuf *page_path, const char *page) | |||
| 399 | * HTML. | 399 | * HTML. |
| 400 | */ | 400 | */ |
| 401 | #ifndef open_html | 401 | #ifndef open_html |
| 402 | void open_html(const char *path) | 402 | static void open_html(const char *path) |
| 403 | { | 403 | { |
| 404 | execl_perf_cmd("web--browse", "-c", "help.browser", path, NULL); | 404 | execl_perf_cmd("web--browse", "-c", "help.browser", path, NULL); |
| 405 | } | 405 | } |
diff --git a/Documentation/perf_counter/builtin-record.c b/Documentation/perf_counter/builtin-record.c index ec2b787b23bd..68abfdf71d39 100644 --- a/Documentation/perf_counter/builtin-record.c +++ b/Documentation/perf_counter/builtin-record.c | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | 1 | ||
| 2 | 2 | ||
| 3 | #include "perf.h" | 3 | #include "perf.h" |
| 4 | #include "builtin.h" | ||
| 4 | #include "util/util.h" | 5 | #include "util/util.h" |
| 5 | #include "util/parse-options.h" | 6 | #include "util/parse-options.h" |
| 6 | #include "util/parse-events.h" | 7 | #include "util/parse-events.h" |
| @@ -144,26 +145,32 @@ static int nr_poll; | |||
| 144 | static int nr_cpu; | 145 | static int nr_cpu; |
| 145 | 146 | ||
| 146 | struct mmap_event { | 147 | struct mmap_event { |
| 147 | struct perf_event_header header; | 148 | struct perf_event_header header; |
| 148 | __u32 pid, tid; | 149 | __u32 pid; |
| 149 | __u64 start; | 150 | __u32 tid; |
| 150 | __u64 len; | 151 | __u64 start; |
| 151 | __u64 pgoff; | 152 | __u64 len; |
| 152 | char filename[PATH_MAX]; | 153 | __u64 pgoff; |
| 154 | char filename[PATH_MAX]; | ||
| 153 | }; | 155 | }; |
| 156 | |||
| 154 | struct comm_event { | 157 | struct comm_event { |
| 155 | struct perf_event_header header; | 158 | struct perf_event_header header; |
| 156 | __u32 pid,tid; | 159 | __u32 pid; |
| 157 | char comm[16]; | 160 | __u32 tid; |
| 161 | char comm[16]; | ||
| 158 | }; | 162 | }; |
| 159 | 163 | ||
| 160 | static pid_t pid_synthesize_comm_event(pid_t pid) | 164 | static pid_t pid_synthesize_comm_event(pid_t pid) |
| 161 | { | 165 | { |
| 166 | struct comm_event comm_ev; | ||
| 162 | char filename[PATH_MAX]; | 167 | char filename[PATH_MAX]; |
| 168 | pid_t spid, ppid; | ||
| 163 | char bf[BUFSIZ]; | 169 | char bf[BUFSIZ]; |
| 164 | struct comm_event comm_ev; | 170 | int fd, nr, ret; |
| 171 | char comm[18]; | ||
| 165 | size_t size; | 172 | size_t size; |
| 166 | int fd; | 173 | char state; |
| 167 | 174 | ||
| 168 | snprintf(filename, sizeof(filename), "/proc/%d/stat", pid); | 175 | snprintf(filename, sizeof(filename), "/proc/%d/stat", pid); |
| 169 | 176 | ||
| @@ -178,12 +185,8 @@ static pid_t pid_synthesize_comm_event(pid_t pid) | |||
| 178 | } | 185 | } |
| 179 | close(fd); | 186 | close(fd); |
| 180 | 187 | ||
| 181 | pid_t spid, ppid; | ||
| 182 | char state; | ||
| 183 | char comm[18]; | ||
| 184 | |||
| 185 | memset(&comm_ev, 0, sizeof(comm_ev)); | 188 | memset(&comm_ev, 0, sizeof(comm_ev)); |
| 186 | int nr = sscanf(bf, "%d %s %c %d %d ", | 189 | nr = sscanf(bf, "%d %s %c %d %d ", |
| 187 | &spid, comm, &state, &ppid, &comm_ev.pid); | 190 | &spid, comm, &state, &ppid, &comm_ev.pid); |
| 188 | if (nr != 5) { | 191 | if (nr != 5) { |
| 189 | fprintf(stderr, "couldn't get COMM and pgid, malformed %s\n", | 192 | fprintf(stderr, "couldn't get COMM and pgid, malformed %s\n", |
| @@ -198,7 +201,8 @@ static pid_t pid_synthesize_comm_event(pid_t pid) | |||
| 198 | memcpy(comm_ev.comm, comm + 1, size); | 201 | memcpy(comm_ev.comm, comm + 1, size); |
| 199 | size = ALIGN(size, sizeof(uint64_t)); | 202 | size = ALIGN(size, sizeof(uint64_t)); |
| 200 | comm_ev.header.size = sizeof(comm_ev) - (sizeof(comm_ev.comm) - size); | 203 | comm_ev.header.size = sizeof(comm_ev) - (sizeof(comm_ev.comm) - size); |
| 201 | int ret = write(output, &comm_ev, comm_ev.header.size); | 204 | |
| 205 | ret = write(output, &comm_ev, comm_ev.header.size); | ||
| 202 | if (ret < 0) { | 206 | if (ret < 0) { |
| 203 | perror("failed to write"); | 207 | perror("failed to write"); |
| 204 | exit(-1); | 208 | exit(-1); |
diff --git a/Documentation/perf_counter/builtin-report.c b/Documentation/perf_counter/builtin-report.c index 2d65d9c12aad..7f1255dcd222 100644 --- a/Documentation/perf_counter/builtin-report.c +++ b/Documentation/perf_counter/builtin-report.c | |||
| @@ -1,4 +1,5 @@ | |||
| 1 | #include "util/util.h" | 1 | #include "util/util.h" |
| 2 | #include "builtin.h" | ||
| 2 | 3 | ||
| 3 | #include <libelf.h> | 4 | #include <libelf.h> |
| 4 | #include <gelf.h> | 5 | #include <gelf.h> |
| @@ -22,7 +23,7 @@ static int input; | |||
| 22 | static int show_mask = SHOW_KERNEL | SHOW_USER | SHOW_HV; | 23 | static int show_mask = SHOW_KERNEL | SHOW_USER | SHOW_HV; |
| 23 | 24 | ||
| 24 | static int dump_trace = 0; | 25 | static int dump_trace = 0; |
| 25 | static int verbose; | 26 | static int verbose; |
| 26 | 27 | ||
| 27 | static unsigned long page_size; | 28 | static unsigned long page_size; |
| 28 | static unsigned long mmap_window = 32; | 29 | static unsigned long mmap_window = 32; |
| @@ -60,10 +61,10 @@ typedef union event_union { | |||
| 60 | } event_t; | 61 | } event_t; |
| 61 | 62 | ||
| 62 | struct symbol { | 63 | struct symbol { |
| 63 | struct rb_node rb_node; | 64 | struct rb_node rb_node; |
| 64 | uint64_t start; | 65 | __u64 start; |
| 65 | uint64_t end; | 66 | __u64 end; |
| 66 | char name[0]; | 67 | char name[0]; |
| 67 | }; | 68 | }; |
| 68 | 69 | ||
| 69 | static struct symbol *symbol__new(uint64_t start, uint64_t len, const char *name) | 70 | static struct symbol *symbol__new(uint64_t start, uint64_t len, const char *name) |
| @@ -86,7 +87,7 @@ static void symbol__delete(struct symbol *self) | |||
| 86 | 87 | ||
| 87 | static size_t symbol__fprintf(struct symbol *self, FILE *fp) | 88 | static size_t symbol__fprintf(struct symbol *self, FILE *fp) |
| 88 | { | 89 | { |
| 89 | return fprintf(fp, " %lx-%lx %s\n", | 90 | return fprintf(fp, " %llx-%llx %s\n", |
| 90 | self->start, self->end, self->name); | 91 | self->start, self->end, self->name); |
| 91 | } | 92 | } |
| 92 | 93 | ||
| @@ -147,10 +148,12 @@ static void dso__insert_symbol(struct dso *self, struct symbol *sym) | |||
| 147 | 148 | ||
| 148 | static struct symbol *dso__find_symbol(struct dso *self, uint64_t ip) | 149 | static struct symbol *dso__find_symbol(struct dso *self, uint64_t ip) |
| 149 | { | 150 | { |
| 151 | struct rb_node *n; | ||
| 152 | |||
| 150 | if (self == NULL) | 153 | if (self == NULL) |
| 151 | return NULL; | 154 | return NULL; |
| 152 | 155 | ||
| 153 | struct rb_node *n = self->syms.rb_node; | 156 | n = self->syms.rb_node; |
| 154 | 157 | ||
| 155 | while (n) { | 158 | while (n) { |
| 156 | struct symbol *s = rb_entry(n, struct symbol, rb_node); | 159 | struct symbol *s = rb_entry(n, struct symbol, rb_node); |
| @@ -221,33 +224,42 @@ static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep, | |||
| 221 | 224 | ||
| 222 | static int dso__load(struct dso *self) | 225 | static int dso__load(struct dso *self) |
| 223 | { | 226 | { |
| 224 | int fd = open(self->name, O_RDONLY), err = -1; | 227 | Elf_Data *symstrs; |
| 228 | uint32_t nr_syms; | ||
| 229 | int fd, err = -1; | ||
| 230 | uint32_t index; | ||
| 231 | GElf_Ehdr ehdr; | ||
| 232 | GElf_Shdr shdr; | ||
| 233 | Elf_Data *syms; | ||
| 234 | GElf_Sym sym; | ||
| 235 | Elf_Scn *sec; | ||
| 236 | Elf *elf; | ||
| 225 | 237 | ||
| 238 | |||
| 239 | fd = open(self->name, O_RDONLY); | ||
| 226 | if (fd == -1) | 240 | if (fd == -1) |
| 227 | return -1; | 241 | return -1; |
| 228 | 242 | ||
| 229 | Elf *elf = elf_begin(fd, ELF_C_READ_MMAP, NULL); | 243 | elf = elf_begin(fd, ELF_C_READ_MMAP, NULL); |
| 230 | if (elf == NULL) { | 244 | if (elf == NULL) { |
| 231 | fprintf(stderr, "%s: cannot read %s ELF file.\n", | 245 | fprintf(stderr, "%s: cannot read %s ELF file.\n", |
| 232 | __func__, self->name); | 246 | __func__, self->name); |
| 233 | goto out_close; | 247 | goto out_close; |
| 234 | } | 248 | } |
| 235 | 249 | ||
| 236 | GElf_Ehdr ehdr; | ||
| 237 | if (gelf_getehdr(elf, &ehdr) == NULL) { | 250 | if (gelf_getehdr(elf, &ehdr) == NULL) { |
| 238 | fprintf(stderr, "%s: cannot get elf header.\n", __func__); | 251 | fprintf(stderr, "%s: cannot get elf header.\n", __func__); |
| 239 | goto out_elf_end; | 252 | goto out_elf_end; |
| 240 | } | 253 | } |
| 241 | 254 | ||
| 242 | GElf_Shdr shdr; | 255 | sec = elf_section_by_name(elf, &ehdr, &shdr, ".symtab", NULL); |
| 243 | Elf_Scn *sec = elf_section_by_name(elf, &ehdr, &shdr, ".symtab", NULL); | ||
| 244 | if (sec == NULL) | 256 | if (sec == NULL) |
| 245 | sec = elf_section_by_name(elf, &ehdr, &shdr, ".dynsym", NULL); | 257 | sec = elf_section_by_name(elf, &ehdr, &shdr, ".dynsym", NULL); |
| 246 | 258 | ||
| 247 | if (sec == NULL) | 259 | if (sec == NULL) |
| 248 | goto out_elf_end; | 260 | goto out_elf_end; |
| 249 | 261 | ||
| 250 | Elf_Data *syms = elf_getdata(sec, NULL); | 262 | syms = elf_getdata(sec, NULL); |
| 251 | if (syms == NULL) | 263 | if (syms == NULL) |
| 252 | goto out_elf_end; | 264 | goto out_elf_end; |
| 253 | 265 | ||
| @@ -255,14 +267,12 @@ static int dso__load(struct dso *self) | |||
| 255 | if (sec == NULL) | 267 | if (sec == NULL) |
| 256 | goto out_elf_end; | 268 | goto out_elf_end; |
| 257 | 269 | ||
| 258 | Elf_Data *symstrs = elf_getdata(sec, NULL); | 270 | symstrs = elf_getdata(sec, NULL); |
| 259 | if (symstrs == NULL) | 271 | if (symstrs == NULL) |
| 260 | goto out_elf_end; | 272 | goto out_elf_end; |
| 261 | 273 | ||
| 262 | const uint32_t nr_syms = shdr.sh_size / shdr.sh_entsize; | 274 | nr_syms = shdr.sh_size / shdr.sh_entsize; |
| 263 | 275 | ||
| 264 | GElf_Sym sym; | ||
| 265 | uint32_t index; | ||
| 266 | elf_symtab__for_each_symbol(syms, nr_syms, index, sym) { | 276 | elf_symtab__for_each_symbol(syms, nr_syms, index, sym) { |
| 267 | struct symbol *f; | 277 | struct symbol *f; |
| 268 | 278 | ||
| @@ -342,7 +352,7 @@ out_delete_dso: | |||
| 342 | return NULL; | 352 | return NULL; |
| 343 | } | 353 | } |
| 344 | 354 | ||
| 345 | void dsos__fprintf(FILE *fp) | 355 | static void dsos__fprintf(FILE *fp) |
| 346 | { | 356 | { |
| 347 | struct dso *pos; | 357 | struct dso *pos; |
| 348 | 358 | ||
| @@ -365,7 +375,7 @@ static int hex(char ch) | |||
| 365 | * While we find nice hex chars, build a long_val. | 375 | * While we find nice hex chars, build a long_val. |
| 366 | * Return number of chars processed. | 376 | * Return number of chars processed. |
| 367 | */ | 377 | */ |
| 368 | int hex2long(char *ptr, unsigned long *long_val) | 378 | static int hex2long(char *ptr, unsigned long *long_val) |
| 369 | { | 379 | { |
| 370 | const char *p = ptr; | 380 | const char *p = ptr; |
| 371 | *long_val = 0; | 381 | *long_val = 0; |
| @@ -493,12 +503,6 @@ out_delete: | |||
| 493 | return NULL; | 503 | return NULL; |
| 494 | } | 504 | } |
| 495 | 505 | ||
| 496 | static size_t map__fprintf(struct map *self, FILE *fp) | ||
| 497 | { | ||
| 498 | return fprintf(fp, " %lx-%lx %lx %s\n", | ||
| 499 | self->start, self->end, self->pgoff, self->dso->name); | ||
| 500 | } | ||
| 501 | |||
| 502 | struct thread; | 506 | struct thread; |
| 503 | 507 | ||
| 504 | static const char *thread__name(struct thread *self, char *bf, size_t size); | 508 | static const char *thread__name(struct thread *self, char *bf, size_t size); |
| @@ -531,11 +535,6 @@ static struct symhist *symhist__new(struct symbol *sym, uint64_t ip, | |||
| 531 | return self; | 535 | return self; |
| 532 | } | 536 | } |
| 533 | 537 | ||
| 534 | void symhist__delete(struct symhist *self) | ||
| 535 | { | ||
| 536 | free(self); | ||
| 537 | } | ||
| 538 | |||
| 539 | static void symhist__inc(struct symhist *self) | 538 | static void symhist__inc(struct symhist *self) |
| 540 | { | 539 | { |
| 541 | ++self->count; | 540 | ++self->count; |
| @@ -608,6 +607,8 @@ static int thread__symbol_incnew(struct thread *self, struct symbol *sym, | |||
| 608 | struct symhist *sh; | 607 | struct symhist *sh; |
| 609 | 608 | ||
| 610 | while (*p != NULL) { | 609 | while (*p != NULL) { |
| 610 | uint64_t start; | ||
| 611 | |||
| 611 | parent = *p; | 612 | parent = *p; |
| 612 | sh = rb_entry(parent, struct symhist, rb_node); | 613 | sh = rb_entry(parent, struct symhist, rb_node); |
| 613 | 614 | ||
| @@ -617,7 +618,7 @@ static int thread__symbol_incnew(struct thread *self, struct symbol *sym, | |||
| 617 | } | 618 | } |
| 618 | 619 | ||
| 619 | /* Handle unresolved symbols too */ | 620 | /* Handle unresolved symbols too */ |
| 620 | const uint64_t start = !sh->sym ? sh->ip : sh->sym->start; | 621 | start = !sh->sym ? sh->ip : sh->sym->start; |
| 621 | 622 | ||
| 622 | if (ip < start) | 623 | if (ip < start) |
| 623 | p = &(*p)->rb_left; | 624 | p = &(*p)->rb_left; |
| @@ -639,17 +640,6 @@ static int thread__set_comm(struct thread *self, const char *comm) | |||
| 639 | return self->comm ? 0 : -ENOMEM; | 640 | return self->comm ? 0 : -ENOMEM; |
| 640 | } | 641 | } |
| 641 | 642 | ||
| 642 | size_t thread__maps_fprintf(struct thread *self, FILE *fp) | ||
| 643 | { | ||
| 644 | struct map *pos; | ||
| 645 | size_t ret = 0; | ||
| 646 | |||
| 647 | list_for_each_entry(pos, &self->maps, node) | ||
| 648 | ret += map__fprintf(pos, fp); | ||
| 649 | |||
| 650 | return ret; | ||
| 651 | } | ||
| 652 | |||
| 653 | static size_t thread__fprintf(struct thread *self, FILE *fp) | 643 | static size_t thread__fprintf(struct thread *self, FILE *fp) |
| 654 | { | 644 | { |
| 655 | int ret = fprintf(fp, "thread: %d %s\n", self->pid, self->comm); | 645 | int ret = fprintf(fp, "thread: %d %s\n", self->pid, self->comm); |
| @@ -657,13 +647,14 @@ static size_t thread__fprintf(struct thread *self, FILE *fp) | |||
| 657 | 647 | ||
| 658 | for (nd = rb_first(&self->symhists); nd; nd = rb_next(nd)) { | 648 | for (nd = rb_first(&self->symhists); nd; nd = rb_next(nd)) { |
| 659 | struct symhist *pos = rb_entry(nd, struct symhist, rb_node); | 649 | struct symhist *pos = rb_entry(nd, struct symhist, rb_node); |
| 650 | |||
| 660 | ret += symhist__fprintf(pos, 0, fp); | 651 | ret += symhist__fprintf(pos, 0, fp); |
| 661 | } | 652 | } |
| 662 | 653 | ||
| 663 | return ret; | 654 | return ret; |
| 664 | } | 655 | } |
| 665 | 656 | ||
| 666 | static struct rb_root threads = RB_ROOT; | 657 | static struct rb_root threads; |
| 667 | 658 | ||
| 668 | static struct thread *threads__findnew(pid_t pid) | 659 | static struct thread *threads__findnew(pid_t pid) |
| 669 | { | 660 | { |
| @@ -699,11 +690,11 @@ static void thread__insert_map(struct thread *self, struct map *map) | |||
| 699 | 690 | ||
| 700 | static struct map *thread__find_map(struct thread *self, uint64_t ip) | 691 | static struct map *thread__find_map(struct thread *self, uint64_t ip) |
| 701 | { | 692 | { |
| 693 | struct map *pos; | ||
| 694 | |||
| 702 | if (self == NULL) | 695 | if (self == NULL) |
| 703 | return NULL; | 696 | return NULL; |
| 704 | 697 | ||
| 705 | struct map *pos; | ||
| 706 | |||
| 707 | list_for_each_entry(pos, &self->maps, node) | 698 | list_for_each_entry(pos, &self->maps, node) |
| 708 | if (ip >= pos->start && ip <= pos->end) | 699 | if (ip >= pos->start && ip <= pos->end) |
| 709 | return pos; | 700 | return pos; |
| @@ -711,7 +702,7 @@ static struct map *thread__find_map(struct thread *self, uint64_t ip) | |||
| 711 | return NULL; | 702 | return NULL; |
| 712 | } | 703 | } |
| 713 | 704 | ||
| 714 | void threads__fprintf(FILE *fp) | 705 | static void threads__fprintf(FILE *fp) |
| 715 | { | 706 | { |
| 716 | struct rb_node *nd; | 707 | struct rb_node *nd; |
| 717 | for (nd = rb_first(&threads); nd; nd = rb_next(nd)) { | 708 | for (nd = rb_first(&threads); nd; nd = rb_next(nd)) { |
| @@ -720,7 +711,7 @@ void threads__fprintf(FILE *fp) | |||
| 720 | } | 711 | } |
| 721 | } | 712 | } |
| 722 | 713 | ||
| 723 | static struct rb_root global_symhists = RB_ROOT; | 714 | static struct rb_root global_symhists; |
| 724 | 715 | ||
| 725 | static void threads__insert_symhist(struct symhist *sh) | 716 | static void threads__insert_symhist(struct symhist *sh) |
| 726 | { | 717 | { |
| @@ -852,7 +843,7 @@ more: | |||
| 852 | (void *)(long)(event->header.size), | 843 | (void *)(long)(event->header.size), |
| 853 | event->header.misc, | 844 | event->header.misc, |
| 854 | event->ip.pid, | 845 | event->ip.pid, |
| 855 | (void *)event->ip.ip); | 846 | (void *)(long)ip); |
| 856 | } | 847 | } |
| 857 | 848 | ||
| 858 | if (thread == NULL) { | 849 | if (thread == NULL) { |
| @@ -866,9 +857,12 @@ more: | |||
| 866 | level = 'k'; | 857 | level = 'k'; |
| 867 | dso = kernel_dso; | 858 | dso = kernel_dso; |
| 868 | } else if (event->header.misc & PERF_EVENT_MISC_USER) { | 859 | } else if (event->header.misc & PERF_EVENT_MISC_USER) { |
| 860 | struct map *map; | ||
| 861 | |||
| 869 | show = SHOW_USER; | 862 | show = SHOW_USER; |
| 870 | level = '.'; | 863 | level = '.'; |
| 871 | struct map *map = thread__find_map(thread, ip); | 864 | |
| 865 | map = thread__find_map(thread, ip); | ||
| 872 | if (map != NULL) { | 866 | if (map != NULL) { |
| 873 | dso = map->dso; | 867 | dso = map->dso; |
| 874 | ip -= map->start + map->pgoff; | 868 | ip -= map->start + map->pgoff; |
| @@ -896,9 +890,9 @@ more: | |||
| 896 | fprintf(stderr, "%p [%p]: PERF_EVENT_MMAP: [%p(%p) @ %p]: %s\n", | 890 | fprintf(stderr, "%p [%p]: PERF_EVENT_MMAP: [%p(%p) @ %p]: %s\n", |
| 897 | (void *)(offset + head), | 891 | (void *)(offset + head), |
| 898 | (void *)(long)(event->header.size), | 892 | (void *)(long)(event->header.size), |
| 899 | (void *)event->mmap.start, | 893 | (void *)(long)event->mmap.start, |
| 900 | (void *)event->mmap.len, | 894 | (void *)(long)event->mmap.len, |
| 901 | (void *)event->mmap.pgoff, | 895 | (void *)(long)event->mmap.pgoff, |
| 902 | event->mmap.filename); | 896 | event->mmap.filename); |
| 903 | } | 897 | } |
| 904 | if (thread == NULL || map == NULL) { | 898 | if (thread == NULL || map == NULL) { |
| @@ -964,6 +958,11 @@ done: | |||
| 964 | return 0; | 958 | return 0; |
| 965 | } | 959 | } |
| 966 | 960 | ||
| 961 | if (verbose >= 2) { | ||
| 962 | dsos__fprintf(stdout); | ||
| 963 | threads__fprintf(stdout); | ||
| 964 | } | ||
| 965 | |||
| 967 | threads__sort_symhists(); | 966 | threads__sort_symhists(); |
| 968 | threads__symhists_fprintf(total, stdout); | 967 | threads__symhists_fprintf(total, stdout); |
| 969 | 968 | ||
diff --git a/Documentation/perf_counter/builtin-stat.c b/Documentation/perf_counter/builtin-stat.c index e7cb9412212b..ce661e2fa8dd 100644 --- a/Documentation/perf_counter/builtin-stat.c +++ b/Documentation/perf_counter/builtin-stat.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | */ | 30 | */ |
| 31 | 31 | ||
| 32 | #include "perf.h" | 32 | #include "perf.h" |
| 33 | #include "builtin.h" | ||
| 33 | #include "util/util.h" | 34 | #include "util/util.h" |
| 34 | #include "util/parse-options.h" | 35 | #include "util/parse-options.h" |
| 35 | #include "util/parse-events.h" | 36 | #include "util/parse-events.h" |
| @@ -108,7 +109,7 @@ static void create_perfstat_counter(int counter) | |||
| 108 | } | 109 | } |
| 109 | } | 110 | } |
| 110 | 111 | ||
| 111 | int do_perfstat(int argc, const char **argv) | 112 | static int do_perfstat(int argc, const char **argv) |
| 112 | { | 113 | { |
| 113 | unsigned long long t0, t1; | 114 | unsigned long long t0, t1; |
| 114 | int counter; | 115 | int counter; |
diff --git a/Documentation/perf_counter/builtin-top.c b/Documentation/perf_counter/builtin-top.c index 6b1c66f99e4d..a890872638c1 100644 --- a/Documentation/perf_counter/builtin-top.c +++ b/Documentation/perf_counter/builtin-top.c | |||
| @@ -42,8 +42,8 @@ | |||
| 42 | * Released under the GPL v2. (and only v2, not any later version) | 42 | * Released under the GPL v2. (and only v2, not any later version) |
| 43 | */ | 43 | */ |
| 44 | 44 | ||
| 45 | |||
| 46 | #include "perf.h" | 45 | #include "perf.h" |
| 46 | #include "builtin.h" | ||
| 47 | #include "util/util.h" | 47 | #include "util/util.h" |
| 48 | #include "util/util.h" | 48 | #include "util/util.h" |
| 49 | #include "util/parse-options.h" | 49 | #include "util/parse-options.h" |
diff --git a/Documentation/perf_counter/util/abspath.c b/Documentation/perf_counter/util/abspath.c index 649f34f83365..61d33b81fc97 100644 --- a/Documentation/perf_counter/util/abspath.c +++ b/Documentation/perf_counter/util/abspath.c | |||
| @@ -5,7 +5,7 @@ | |||
| 5 | * symlink to a directory, we do not want to say it is a directory when | 5 | * symlink to a directory, we do not want to say it is a directory when |
| 6 | * dealing with tracked content in the working tree. | 6 | * dealing with tracked content in the working tree. |
| 7 | */ | 7 | */ |
| 8 | int is_directory(const char *path) | 8 | static int is_directory(const char *path) |
| 9 | { | 9 | { |
| 10 | struct stat st; | 10 | struct stat st; |
| 11 | return (!stat(path, &st) && S_ISDIR(st.st_mode)); | 11 | return (!stat(path, &st) && S_ISDIR(st.st_mode)); |
diff --git a/Documentation/perf_counter/util/cache.h b/Documentation/perf_counter/util/cache.h index 71080512fa86..393d6146d13b 100644 --- a/Documentation/perf_counter/util/cache.h +++ b/Documentation/perf_counter/util/cache.h | |||
| @@ -104,6 +104,8 @@ char *strip_path_suffix(const char *path, const char *suffix); | |||
| 104 | 104 | ||
| 105 | extern char *mkpath(const char *fmt, ...) __attribute__((format (printf, 1, 2))); | 105 | extern char *mkpath(const char *fmt, ...) __attribute__((format (printf, 1, 2))); |
| 106 | extern char *perf_path(const char *fmt, ...) __attribute__((format (printf, 1, 2))); | 106 | extern char *perf_path(const char *fmt, ...) __attribute__((format (printf, 1, 2))); |
| 107 | /* perf_mkstemp() - create tmp file honoring TMPDIR variable */ | ||
| 108 | extern int perf_mkstemp(char *path, size_t len, const char *template); | ||
| 107 | 109 | ||
| 108 | extern char *mksnpath(char *buf, size_t n, const char *fmt, ...) | 110 | extern char *mksnpath(char *buf, size_t n, const char *fmt, ...) |
| 109 | __attribute__((format (printf, 3, 4))); | 111 | __attribute__((format (printf, 3, 4))); |
diff --git a/Documentation/perf_counter/util/util.h b/Documentation/perf_counter/util/util.h index 36e40c38e093..76590a16c271 100644 --- a/Documentation/perf_counter/util/util.h +++ b/Documentation/perf_counter/util/util.h | |||
| @@ -309,6 +309,8 @@ extern ssize_t xread(int fd, void *buf, size_t len); | |||
| 309 | extern ssize_t xwrite(int fd, const void *buf, size_t len); | 309 | extern ssize_t xwrite(int fd, const void *buf, size_t len); |
| 310 | extern int xdup(int fd); | 310 | extern int xdup(int fd); |
| 311 | extern FILE *xfdopen(int fd, const char *mode); | 311 | extern FILE *xfdopen(int fd, const char *mode); |
| 312 | extern int xmkstemp(char *template); | ||
| 313 | |||
| 312 | static inline size_t xsize_t(off_t len) | 314 | static inline size_t xsize_t(off_t len) |
| 313 | { | 315 | { |
| 314 | return (size_t)len; | 316 | return (size_t)len; |
