diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/perf/Makefile | 29 | ||||
| -rw-r--r-- | tools/perf/builtin-list.c | 3 | ||||
| -rw-r--r-- | tools/perf/builtin-record.c | 95 | ||||
| -rw-r--r-- | tools/perf/builtin-report.c | 12 | ||||
| -rw-r--r-- | tools/perf/util/parse-events.c | 10 | ||||
| -rw-r--r-- | tools/perf/util/symbol.c | 17 | ||||
| -rw-r--r-- | tools/perf/util/symbol.h | 24 |
7 files changed, 121 insertions, 69 deletions
diff --git a/tools/perf/Makefile b/tools/perf/Makefile index 60411e94113b..c045b4271e57 100644 --- a/tools/perf/Makefile +++ b/tools/perf/Makefile | |||
| @@ -382,22 +382,29 @@ endif | |||
| 382 | ifdef NO_DEMANGLE | 382 | ifdef NO_DEMANGLE |
| 383 | BASIC_CFLAGS += -DNO_DEMANGLE | 383 | BASIC_CFLAGS += -DNO_DEMANGLE |
| 384 | else | 384 | else |
| 385 | |||
| 386 | has_bfd := $(shell sh -c "(echo '\#include <bfd.h>'; echo 'int main(void) { bfd_demangle(0, 0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o /dev/null $(ALL_LDFLAGS) -lbfd > /dev/null 2>&1 && echo y") | 385 | has_bfd := $(shell sh -c "(echo '\#include <bfd.h>'; echo 'int main(void) { bfd_demangle(0, 0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o /dev/null $(ALL_LDFLAGS) -lbfd > /dev/null 2>&1 && echo y") |
| 387 | 386 | ||
| 388 | has_bfd_iberty := $(shell sh -c "(echo '\#include <bfd.h>'; echo 'int main(void) { bfd_demangle(0, 0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o /dev/null $(ALL_LDFLAGS) -lbfd -liberty > /dev/null 2>&1 && echo y") | ||
| 389 | |||
| 390 | has_bfd_iberty_z := $(shell sh -c "(echo '\#include <bfd.h>'; echo 'int main(void) { bfd_demangle(0, 0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o /dev/null $(ALL_LDFLAGS) -lbfd -liberty -lz > /dev/null 2>&1 && echo y") | ||
| 391 | |||
| 392 | ifeq ($(has_bfd),y) | 387 | ifeq ($(has_bfd),y) |
| 393 | EXTLIBS += -lbfd | 388 | EXTLIBS += -lbfd |
| 394 | else ifeq ($(has_bfd_iberty),y) | ||
| 395 | EXTLIBS += -lbfd -liberty | ||
| 396 | else ifeq ($(has_bfd_iberty_z),y) | ||
| 397 | EXTLIBS += -lbfd -liberty -lz | ||
| 398 | else | 389 | else |
| 399 | msg := $(warning No bfd.h/libbfd found, install binutils-dev[el] to gain symbol demangling) | 390 | has_bfd_iberty := $(shell sh -c "(echo '\#include <bfd.h>'; echo 'int main(void) { bfd_demangle(0, 0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o /dev/null $(ALL_LDFLAGS) -lbfd -liberty > /dev/null 2>&1 && echo y") |
| 400 | BASIC_CFLAGS += -DNO_DEMANGLE | 391 | ifeq ($(has_bfd_iberty),y) |
| 392 | EXTLIBS += -lbfd -liberty | ||
| 393 | else | ||
| 394 | has_bfd_iberty_z := $(shell sh -c "(echo '\#include <bfd.h>'; echo 'int main(void) { bfd_demangle(0, 0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o /dev/null $(ALL_LDFLAGS) -lbfd -liberty -lz > /dev/null 2>&1 && echo y") | ||
| 395 | ifeq ($(has_bfd_iberty_z),y) | ||
| 396 | EXTLIBS += -lbfd -liberty -lz | ||
| 397 | else | ||
| 398 | has_cplus_demangle := $(shell sh -c "(echo 'extern char *cplus_demangle(const char *, int);'; echo 'int main(void) { cplus_demangle(0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o /dev/null $(ALL_LDFLAGS) -liberty > /dev/null 2>&1 && echo y") | ||
| 399 | ifeq ($(has_cplus_demangle),y) | ||
| 400 | EXTLIBS += -liberty | ||
| 401 | BASIC_CFLAGS += -DHAVE_CPLUS_DEMANGLE | ||
| 402 | else | ||
| 403 | msg := $(warning No bfd.h/libbfd found, install binutils-dev[el] to gain symbol demangling) | ||
| 404 | BASIC_CFLAGS += -DNO_DEMANGLE | ||
| 405 | endif | ||
| 406 | endif | ||
| 407 | endif | ||
| 401 | endif | 408 | endif |
| 402 | endif | 409 | endif |
| 403 | 410 | ||
diff --git a/tools/perf/builtin-list.c b/tools/perf/builtin-list.c index f990fa8a35c9..d88c6961274c 100644 --- a/tools/perf/builtin-list.c +++ b/tools/perf/builtin-list.c | |||
| @@ -10,11 +10,12 @@ | |||
| 10 | 10 | ||
| 11 | #include "perf.h" | 11 | #include "perf.h" |
| 12 | 12 | ||
| 13 | #include "util/parse-options.h" | ||
| 14 | #include "util/parse-events.h" | 13 | #include "util/parse-events.h" |
| 14 | #include "util/cache.h" | ||
| 15 | 15 | ||
| 16 | int cmd_list(int argc __used, const char **argv __used, const char *prefix __used) | 16 | int cmd_list(int argc __used, const char **argv __used, const char *prefix __used) |
| 17 | { | 17 | { |
| 18 | setup_pager(); | ||
| 18 | print_events(); | 19 | print_events(); |
| 19 | return 0; | 20 | return 0; |
| 20 | } | 21 | } |
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 0345aad8eba5..3d051b9cf25f 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
| @@ -34,7 +34,9 @@ static int output; | |||
| 34 | static const char *output_name = "perf.data"; | 34 | static const char *output_name = "perf.data"; |
| 35 | static int group = 0; | 35 | static int group = 0; |
| 36 | static unsigned int realtime_prio = 0; | 36 | static unsigned int realtime_prio = 0; |
| 37 | static int raw_samples = 0; | ||
| 37 | static int system_wide = 0; | 38 | static int system_wide = 0; |
| 39 | static int profile_cpu = -1; | ||
| 38 | static pid_t target_pid = -1; | 40 | static pid_t target_pid = -1; |
| 39 | static int inherit = 1; | 41 | static int inherit = 1; |
| 40 | static int force = 0; | 42 | static int force = 0; |
| @@ -203,46 +205,48 @@ static void sig_atexit(void) | |||
| 203 | kill(getpid(), signr); | 205 | kill(getpid(), signr); |
| 204 | } | 206 | } |
| 205 | 207 | ||
| 206 | static void pid_synthesize_comm_event(pid_t pid, int full) | 208 | static pid_t pid_synthesize_comm_event(pid_t pid, int full) |
| 207 | { | 209 | { |
| 208 | struct comm_event comm_ev; | 210 | struct comm_event comm_ev; |
| 209 | char filename[PATH_MAX]; | 211 | char filename[PATH_MAX]; |
| 210 | char bf[BUFSIZ]; | 212 | char bf[BUFSIZ]; |
| 211 | int fd; | 213 | FILE *fp; |
| 212 | size_t size; | 214 | size_t size = 0; |
| 213 | char *field, *sep; | ||
| 214 | DIR *tasks; | 215 | DIR *tasks; |
| 215 | struct dirent dirent, *next; | 216 | struct dirent dirent, *next; |
| 217 | pid_t tgid = 0; | ||
| 216 | 218 | ||
| 217 | snprintf(filename, sizeof(filename), "/proc/%d/stat", pid); | 219 | snprintf(filename, sizeof(filename), "/proc/%d/status", pid); |
| 218 | 220 | ||
| 219 | fd = open(filename, O_RDONLY); | 221 | fp = fopen(filename, "r"); |
| 220 | if (fd < 0) { | 222 | if (fd == NULL) { |
| 221 | /* | 223 | /* |
| 222 | * We raced with a task exiting - just return: | 224 | * We raced with a task exiting - just return: |
| 223 | */ | 225 | */ |
| 224 | if (verbose) | 226 | if (verbose) |
| 225 | fprintf(stderr, "couldn't open %s\n", filename); | 227 | fprintf(stderr, "couldn't open %s\n", filename); |
| 226 | return; | 228 | return 0; |
| 227 | } | ||
| 228 | if (read(fd, bf, sizeof(bf)) < 0) { | ||
| 229 | fprintf(stderr, "couldn't read %s\n", filename); | ||
| 230 | exit(EXIT_FAILURE); | ||
| 231 | } | 229 | } |
| 232 | close(fd); | ||
| 233 | 230 | ||
| 234 | /* 9027 (cat) R 6747 9027 6747 34816 9027 ... */ | ||
| 235 | memset(&comm_ev, 0, sizeof(comm_ev)); | 231 | memset(&comm_ev, 0, sizeof(comm_ev)); |
| 236 | field = strchr(bf, '('); | 232 | while (!comm_ev.comm[0] || !comm_ev.pid) { |
| 237 | if (field == NULL) | 233 | if (fgets(bf, sizeof(bf), fp) == NULL) |
| 238 | goto out_failure; | 234 | goto out_failure; |
| 239 | sep = strchr(++field, ')'); | 235 | |
| 240 | if (sep == NULL) | 236 | if (memcmp(bf, "Name:", 5) == 0) { |
| 241 | goto out_failure; | 237 | char *name = bf + 5; |
| 242 | size = sep - field; | 238 | while (*name && isspace(*name)) |
| 243 | memcpy(comm_ev.comm, field, size++); | 239 | ++name; |
| 244 | 240 | size = strlen(name) - 1; | |
| 245 | comm_ev.pid = pid; | 241 | memcpy(comm_ev.comm, name, size++); |
| 242 | } else if (memcmp(bf, "Tgid:", 5) == 0) { | ||
| 243 | char *tgids = bf + 5; | ||
| 244 | while (*tgids && isspace(*tgids)) | ||
| 245 | ++tgids; | ||
| 246 | tgid = comm_ev.pid = atoi(tgids); | ||
| 247 | } | ||
| 248 | } | ||
| 249 | |||
| 246 | comm_ev.header.type = PERF_EVENT_COMM; | 250 | comm_ev.header.type = PERF_EVENT_COMM; |
| 247 | size = ALIGN(size, sizeof(u64)); | 251 | size = ALIGN(size, sizeof(u64)); |
| 248 | comm_ev.header.size = sizeof(comm_ev) - (sizeof(comm_ev.comm) - size); | 252 | comm_ev.header.size = sizeof(comm_ev) - (sizeof(comm_ev.comm) - size); |
| @@ -251,7 +255,7 @@ static void pid_synthesize_comm_event(pid_t pid, int full) | |||
| 251 | comm_ev.tid = pid; | 255 | comm_ev.tid = pid; |
| 252 | 256 | ||
| 253 | write_output(&comm_ev, comm_ev.header.size); | 257 | write_output(&comm_ev, comm_ev.header.size); |
| 254 | return; | 258 | goto out_fclose; |
| 255 | } | 259 | } |
| 256 | 260 | ||
| 257 | snprintf(filename, sizeof(filename), "/proc/%d/task", pid); | 261 | snprintf(filename, sizeof(filename), "/proc/%d/task", pid); |
| @@ -268,7 +272,10 @@ static void pid_synthesize_comm_event(pid_t pid, int full) | |||
| 268 | write_output(&comm_ev, comm_ev.header.size); | 272 | write_output(&comm_ev, comm_ev.header.size); |
| 269 | } | 273 | } |
| 270 | closedir(tasks); | 274 | closedir(tasks); |
| 271 | return; | 275 | |
| 276 | out_fclose: | ||
| 277 | fclose(fp); | ||
| 278 | return tgid; | ||
| 272 | 279 | ||
| 273 | out_failure: | 280 | out_failure: |
| 274 | fprintf(stderr, "couldn't get COMM and pgid, malformed %s\n", | 281 | fprintf(stderr, "couldn't get COMM and pgid, malformed %s\n", |
| @@ -276,7 +283,7 @@ out_failure: | |||
| 276 | exit(EXIT_FAILURE); | 283 | exit(EXIT_FAILURE); |
| 277 | } | 284 | } |
| 278 | 285 | ||
| 279 | static void pid_synthesize_mmap_samples(pid_t pid) | 286 | static void pid_synthesize_mmap_samples(pid_t pid, pid_t tgid) |
| 280 | { | 287 | { |
| 281 | char filename[PATH_MAX]; | 288 | char filename[PATH_MAX]; |
| 282 | FILE *fp; | 289 | FILE *fp; |
| @@ -328,7 +335,7 @@ static void pid_synthesize_mmap_samples(pid_t pid) | |||
| 328 | mmap_ev.len -= mmap_ev.start; | 335 | mmap_ev.len -= mmap_ev.start; |
| 329 | mmap_ev.header.size = (sizeof(mmap_ev) - | 336 | mmap_ev.header.size = (sizeof(mmap_ev) - |
| 330 | (sizeof(mmap_ev.filename) - size)); | 337 | (sizeof(mmap_ev.filename) - size)); |
| 331 | mmap_ev.pid = pid; | 338 | mmap_ev.pid = tgid; |
| 332 | mmap_ev.tid = pid; | 339 | mmap_ev.tid = pid; |
| 333 | 340 | ||
| 334 | write_output(&mmap_ev, mmap_ev.header.size); | 341 | write_output(&mmap_ev, mmap_ev.header.size); |
| @@ -347,14 +354,14 @@ static void synthesize_all(void) | |||
| 347 | 354 | ||
| 348 | while (!readdir_r(proc, &dirent, &next) && next) { | 355 | while (!readdir_r(proc, &dirent, &next) && next) { |
| 349 | char *end; | 356 | char *end; |
| 350 | pid_t pid; | 357 | pid_t pid, tgid; |
| 351 | 358 | ||
| 352 | pid = strtol(dirent.d_name, &end, 10); | 359 | pid = strtol(dirent.d_name, &end, 10); |
| 353 | if (*end) /* only interested in proper numerical dirents */ | 360 | if (*end) /* only interested in proper numerical dirents */ |
| 354 | continue; | 361 | continue; |
| 355 | 362 | ||
| 356 | pid_synthesize_comm_event(pid, 1); | 363 | tgid = pid_synthesize_comm_event(pid, 1); |
| 357 | pid_synthesize_mmap_samples(pid); | 364 | pid_synthesize_mmap_samples(pid, tgid); |
| 358 | } | 365 | } |
| 359 | 366 | ||
| 360 | closedir(proc); | 367 | closedir(proc); |
| @@ -392,7 +399,7 @@ static void create_counter(int counter, int cpu, pid_t pid) | |||
| 392 | PERF_FORMAT_TOTAL_TIME_RUNNING | | 399 | PERF_FORMAT_TOTAL_TIME_RUNNING | |
| 393 | PERF_FORMAT_ID; | 400 | PERF_FORMAT_ID; |
| 394 | 401 | ||
| 395 | attr->sample_type = PERF_SAMPLE_IP | PERF_SAMPLE_TID; | 402 | attr->sample_type |= PERF_SAMPLE_IP | PERF_SAMPLE_TID; |
| 396 | 403 | ||
| 397 | if (freq) { | 404 | if (freq) { |
| 398 | attr->sample_type |= PERF_SAMPLE_PERIOD; | 405 | attr->sample_type |= PERF_SAMPLE_PERIOD; |
| @@ -412,6 +419,8 @@ static void create_counter(int counter, int cpu, pid_t pid) | |||
| 412 | if (call_graph) | 419 | if (call_graph) |
| 413 | attr->sample_type |= PERF_SAMPLE_CALLCHAIN; | 420 | attr->sample_type |= PERF_SAMPLE_CALLCHAIN; |
| 414 | 421 | ||
| 422 | if (raw_samples) | ||
| 423 | attr->sample_type |= PERF_SAMPLE_RAW; | ||
| 415 | 424 | ||
| 416 | attr->mmap = track; | 425 | attr->mmap = track; |
| 417 | attr->comm = track; | 426 | attr->comm = track; |
| @@ -426,6 +435,8 @@ try_again: | |||
| 426 | 435 | ||
| 427 | if (err == EPERM) | 436 | if (err == EPERM) |
| 428 | die("Permission error - are you root?\n"); | 437 | die("Permission error - are you root?\n"); |
| 438 | else if (err == ENODEV && profile_cpu != -1) | ||
| 439 | die("No such device - did you specify an out-of-range profile CPU?\n"); | ||
| 429 | 440 | ||
| 430 | /* | 441 | /* |
| 431 | * If it's cycles then fall back to hrtimer | 442 | * If it's cycles then fall back to hrtimer |
| @@ -559,16 +570,22 @@ static int __cmd_record(int argc, const char **argv) | |||
| 559 | if (pid == -1) | 570 | if (pid == -1) |
| 560 | pid = getpid(); | 571 | pid = getpid(); |
| 561 | 572 | ||
| 562 | open_counters(-1, pid); | 573 | open_counters(profile_cpu, pid); |
| 563 | } else for (i = 0; i < nr_cpus; i++) | 574 | } else { |
| 564 | open_counters(i, target_pid); | 575 | if (profile_cpu != -1) { |
| 576 | open_counters(profile_cpu, target_pid); | ||
| 577 | } else { | ||
| 578 | for (i = 0; i < nr_cpus; i++) | ||
| 579 | open_counters(i, target_pid); | ||
| 580 | } | ||
| 581 | } | ||
| 565 | 582 | ||
| 566 | if (file_new) | 583 | if (file_new) |
| 567 | perf_header__write(header, output); | 584 | perf_header__write(header, output); |
| 568 | 585 | ||
| 569 | if (!system_wide) { | 586 | if (!system_wide) { |
| 570 | pid_synthesize_comm_event(pid, 0); | 587 | pid_t tgid = pid_synthesize_comm_event(pid, 0); |
| 571 | pid_synthesize_mmap_samples(pid); | 588 | pid_synthesize_mmap_samples(pid, tgid); |
| 572 | } else | 589 | } else |
| 573 | synthesize_all(); | 590 | synthesize_all(); |
| 574 | 591 | ||
| @@ -636,10 +653,14 @@ static const struct option options[] = { | |||
| 636 | "record events on existing pid"), | 653 | "record events on existing pid"), |
| 637 | OPT_INTEGER('r', "realtime", &realtime_prio, | 654 | OPT_INTEGER('r', "realtime", &realtime_prio, |
| 638 | "collect data with this RT SCHED_FIFO priority"), | 655 | "collect data with this RT SCHED_FIFO priority"), |
| 656 | OPT_BOOLEAN('R', "raw-samples", &raw_samples, | ||
| 657 | "collect raw sample records from all opened counters"), | ||
| 639 | OPT_BOOLEAN('a', "all-cpus", &system_wide, | 658 | OPT_BOOLEAN('a', "all-cpus", &system_wide, |
| 640 | "system-wide collection from all CPUs"), | 659 | "system-wide collection from all CPUs"), |
| 641 | OPT_BOOLEAN('A', "append", &append_file, | 660 | OPT_BOOLEAN('A', "append", &append_file, |
| 642 | "append to the output file to do incremental profiling"), | 661 | "append to the output file to do incremental profiling"), |
| 662 | OPT_INTEGER('C', "profile_cpu", &profile_cpu, | ||
| 663 | "CPU to profile on"), | ||
| 643 | OPT_BOOLEAN('f', "force", &force, | 664 | OPT_BOOLEAN('f', "force", &force, |
| 644 | "overwrite existing data file"), | 665 | "overwrite existing data file"), |
| 645 | OPT_LONG('c', "count", &default_interval, | 666 | OPT_LONG('c', "count", &default_interval, |
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 99274cec0adb..b53a60fc12de 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
| @@ -1526,11 +1526,11 @@ process_sample_event(event_t *event, unsigned long offset, unsigned long head) | |||
| 1526 | more_data += sizeof(u64); | 1526 | more_data += sizeof(u64); |
| 1527 | } | 1527 | } |
| 1528 | 1528 | ||
| 1529 | dprintf("%p [%p]: PERF_EVENT_SAMPLE (IP, %d): %d: %p period: %Ld\n", | 1529 | dprintf("%p [%p]: PERF_EVENT_SAMPLE (IP, %d): %d/%d: %p period: %Ld\n", |
| 1530 | (void *)(offset + head), | 1530 | (void *)(offset + head), |
| 1531 | (void *)(long)(event->header.size), | 1531 | (void *)(long)(event->header.size), |
| 1532 | event->header.misc, | 1532 | event->header.misc, |
| 1533 | event->ip.pid, | 1533 | event->ip.pid, event->ip.tid, |
| 1534 | (void *)(long)ip, | 1534 | (void *)(long)ip, |
| 1535 | (long long)period); | 1535 | (long long)period); |
| 1536 | 1536 | ||
| @@ -1590,10 +1590,11 @@ process_sample_event(event_t *event, unsigned long offset, unsigned long head) | |||
| 1590 | if (show & show_mask) { | 1590 | if (show & show_mask) { |
| 1591 | struct symbol *sym = resolve_symbol(thread, &map, &dso, &ip); | 1591 | struct symbol *sym = resolve_symbol(thread, &map, &dso, &ip); |
| 1592 | 1592 | ||
| 1593 | if (dso_list && dso && dso->name && !strlist__has_entry(dso_list, dso->name)) | 1593 | if (dso_list && (!dso || !dso->name || |
| 1594 | !strlist__has_entry(dso_list, dso->name))) | ||
| 1594 | return 0; | 1595 | return 0; |
| 1595 | 1596 | ||
| 1596 | if (sym_list && sym && !strlist__has_entry(sym_list, sym->name)) | 1597 | if (sym_list && (!sym || !strlist__has_entry(sym_list, sym->name))) |
| 1597 | return 0; | 1598 | return 0; |
| 1598 | 1599 | ||
| 1599 | if (hist_entry__add(thread, map, dso, sym, ip, chain, level, period)) { | 1600 | if (hist_entry__add(thread, map, dso, sym, ip, chain, level, period)) { |
| @@ -1612,10 +1613,11 @@ process_mmap_event(event_t *event, unsigned long offset, unsigned long head) | |||
| 1612 | struct thread *thread = threads__findnew(event->mmap.pid); | 1613 | struct thread *thread = threads__findnew(event->mmap.pid); |
| 1613 | struct map *map = map__new(&event->mmap); | 1614 | struct map *map = map__new(&event->mmap); |
| 1614 | 1615 | ||
| 1615 | dprintf("%p [%p]: PERF_EVENT_MMAP %d: [%p(%p) @ %p]: %s\n", | 1616 | dprintf("%p [%p]: PERF_EVENT_MMAP %d/%d: [%p(%p) @ %p]: %s\n", |
| 1616 | (void *)(offset + head), | 1617 | (void *)(offset + head), |
| 1617 | (void *)(long)(event->header.size), | 1618 | (void *)(long)(event->header.size), |
| 1618 | event->mmap.pid, | 1619 | event->mmap.pid, |
| 1620 | event->mmap.tid, | ||
| 1619 | (void *)(long)event->mmap.start, | 1621 | (void *)(long)event->mmap.start, |
| 1620 | (void *)(long)event->mmap.len, | 1622 | (void *)(long)event->mmap.len, |
| 1621 | (void *)(long)event->mmap.pgoff, | 1623 | (void *)(long)event->mmap.pgoff, |
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 4858d83b3b67..044178408783 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c | |||
| @@ -379,6 +379,7 @@ static int parse_tracepoint_event(const char **strp, | |||
| 379 | struct perf_counter_attr *attr) | 379 | struct perf_counter_attr *attr) |
| 380 | { | 380 | { |
| 381 | const char *evt_name; | 381 | const char *evt_name; |
| 382 | char *flags; | ||
| 382 | char sys_name[MAX_EVENT_LENGTH]; | 383 | char sys_name[MAX_EVENT_LENGTH]; |
| 383 | char id_buf[4]; | 384 | char id_buf[4]; |
| 384 | int fd; | 385 | int fd; |
| @@ -400,6 +401,15 @@ static int parse_tracepoint_event(const char **strp, | |||
| 400 | strncpy(sys_name, *strp, sys_length); | 401 | strncpy(sys_name, *strp, sys_length); |
| 401 | sys_name[sys_length] = '\0'; | 402 | sys_name[sys_length] = '\0'; |
| 402 | evt_name = evt_name + 1; | 403 | evt_name = evt_name + 1; |
| 404 | |||
| 405 | flags = strchr(evt_name, ':'); | ||
| 406 | if (flags) { | ||
| 407 | *flags = '\0'; | ||
| 408 | flags++; | ||
| 409 | if (!strncmp(flags, "record", strlen(flags))) | ||
| 410 | attr->sample_type |= PERF_SAMPLE_RAW; | ||
| 411 | } | ||
| 412 | |||
| 403 | evt_length = strlen(evt_name); | 413 | evt_length = strlen(evt_name); |
| 404 | if (evt_length >= MAX_EVENT_LENGTH) | 414 | if (evt_length >= MAX_EVENT_LENGTH) |
| 405 | return 0; | 415 | return 0; |
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index f1dcede14307..5c0f42e6b33b 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
| @@ -7,23 +7,8 @@ | |||
| 7 | #include <gelf.h> | 7 | #include <gelf.h> |
| 8 | #include <elf.h> | 8 | #include <elf.h> |
| 9 | 9 | ||
| 10 | #ifndef NO_DEMANGLE | ||
| 11 | #include <bfd.h> | ||
| 12 | #else | ||
| 13 | static inline | ||
| 14 | char *bfd_demangle(void __used *v, const char __used *c, int __used i) | ||
| 15 | { | ||
| 16 | return NULL; | ||
| 17 | } | ||
| 18 | #endif | ||
| 19 | |||
| 20 | const char *sym_hist_filter; | 10 | const char *sym_hist_filter; |
| 21 | 11 | ||
| 22 | #ifndef DMGL_PARAMS | ||
| 23 | #define DMGL_PARAMS (1 << 0) /* Include function args */ | ||
| 24 | #define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ | ||
| 25 | #endif | ||
| 26 | |||
| 27 | enum dso_origin { | 12 | enum dso_origin { |
| 28 | DSO__ORIG_KERNEL = 0, | 13 | DSO__ORIG_KERNEL = 0, |
| 29 | DSO__ORIG_JAVA_JIT, | 14 | DSO__ORIG_JAVA_JIT, |
| @@ -816,6 +801,8 @@ more: | |||
| 816 | } | 801 | } |
| 817 | out: | 802 | out: |
| 818 | free(name); | 803 | free(name); |
| 804 | if (ret < 0 && strstr(self->name, " (deleted)") != NULL) | ||
| 805 | return 0; | ||
| 819 | return ret; | 806 | return ret; |
| 820 | } | 807 | } |
| 821 | 808 | ||
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h index 1e003ec2f4b1..b53bf0125c1b 100644 --- a/tools/perf/util/symbol.h +++ b/tools/perf/util/symbol.h | |||
| @@ -7,6 +7,30 @@ | |||
| 7 | #include <linux/rbtree.h> | 7 | #include <linux/rbtree.h> |
| 8 | #include "module.h" | 8 | #include "module.h" |
| 9 | 9 | ||
| 10 | #ifdef HAVE_CPLUS_DEMANGLE | ||
| 11 | extern char *cplus_demangle(const char *, int); | ||
| 12 | |||
| 13 | static inline char *bfd_demangle(void __used *v, const char *c, int i) | ||
| 14 | { | ||
| 15 | return cplus_demangle(c, i); | ||
| 16 | } | ||
| 17 | #else | ||
| 18 | #ifdef NO_DEMANGLE | ||
| 19 | static inline char *bfd_demangle(void __used *v, const char __used *c, | ||
| 20 | int __used i) | ||
| 21 | { | ||
| 22 | return NULL; | ||
| 23 | } | ||
| 24 | #else | ||
| 25 | #include <bfd.h> | ||
| 26 | #endif | ||
| 27 | #endif | ||
| 28 | |||
| 29 | #ifndef DMGL_PARAMS | ||
| 30 | #define DMGL_PARAMS (1 << 0) /* Include function args */ | ||
| 31 | #define DMGL_ANSI (1 << 1) /* Include const, volatile, etc */ | ||
| 32 | #endif | ||
| 33 | |||
| 10 | struct symbol { | 34 | struct symbol { |
| 11 | struct rb_node rb_node; | 35 | struct rb_node rb_node; |
| 12 | u64 start; | 36 | u64 start; |
