提交 83a0944f 编写于 作者: I Ingo Molnar

perf: Enable more compiler warnings

Related to a shadowed variable bug fix Valdis Kletnieks noticed
that perf does not get built with -Wshadow, which could have
helped us avoid the bug.

So enable -Wshadow and also enable the following warnings on
perf builds, in addition to the already enabled -Wall -Wextra
-std=gnu99 warnings:

 -Wcast-align
 -Wformat=2
 -Wshadow
 -Winit-self
 -Wpacked
 -Wredundant-decls
 -Wstack-protector
 -Wstrict-aliasing=3
 -Wswitch-default
 -Wswitch-enum
 -Wno-system-headers
 -Wundef
 -Wvolatile-register-var
 -Wwrite-strings
 -Wbad-function-cast
 -Wmissing-declarations
 -Wmissing-prototypes
 -Wnested-externs
 -Wold-style-definition
 -Wstrict-prototypes
 -Wdeclaration-after-statement

And change/fix the perf code to build cleanly under GCC 4.3.2.

The list of warnings enablement is rather arbitrary: it's based
on my (quick) reading of the GCC manpages and trying them on
perf.

I categorized the warnings based on individually enabling them
and looking whether they trigger something in the perf build.
If i liked those warnings (i.e. if they trigger for something
that arguably could be improved) i enabled the warning.

If the warnings seemed to come from language laywers spamming
the build with tons of nuisance warnings i generally kept them
off. Most of the sign conversion related warnings were in
this category. (A second patch enabling some of the sign
warnings might be welcome - sign bugs can be nasty.)

I also kept warnings that seem to make sense from their manpage
description and which produced no actual warnings on our code
base. These warnings might still be turned off if they end up
being a nuisance.

I also left out a few warnings that are not supported in older
compilers.

[ Note that these changes might break the build on older
  compilers i did not test, or on non-x86 architectures that
  produce different warnings, so more testing would be welcome. ]

Reported-by: Valdis.Kletnieks@vt.edu
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: NIngo Molnar <mingo@elte.hu>
上级 6baa0a5a
...@@ -166,7 +166,12 @@ endif ...@@ -166,7 +166,12 @@ endif
# CFLAGS and LDFLAGS are for the users to override from the command line. # CFLAGS and LDFLAGS are for the users to override from the command line.
CFLAGS = $(M64) -ggdb3 -Wall -Wextra -Wstrict-prototypes -Wmissing-declarations -Wmissing-prototypes -std=gnu99 -Wdeclaration-after-statement -Werror -O6 #
# Include saner warnings here, which can catch bugs:
#
EXTRA_WARNINGS = -Wcast-align -Wformat=2 -Wshadow -Winit-self -Wpacked -Wredundant-decls -Wstack-protector -Wstrict-aliasing=3 -Wswitch-default -Wswitch-enum -Wno-system-headers -Wundef -Wvolatile-register-var -Wwrite-strings -Wbad-function-cast -Wmissing-declarations -Wmissing-prototypes -Wnested-externs -Wold-style-definition -Wstrict-prototypes -Wdeclaration-after-statement
CFLAGS = $(M64) -ggdb3 -Wall -Wextra -std=gnu99 -Werror -O6 $(EXTRA_WARNINGS)
LDFLAGS = -lpthread -lrt -lelf -lm LDFLAGS = -lpthread -lrt -lelf -lm
ALL_CFLAGS = $(CFLAGS) ALL_CFLAGS = $(CFLAGS)
ALL_LDFLAGS = $(LDFLAGS) ALL_LDFLAGS = $(LDFLAGS)
......
...@@ -81,7 +81,7 @@ struct hist_entry { ...@@ -81,7 +81,7 @@ struct hist_entry {
struct sort_entry { struct sort_entry {
struct list_head list; struct list_head list;
char *header; const char *header;
int64_t (*cmp)(struct hist_entry *, struct hist_entry *); int64_t (*cmp)(struct hist_entry *, struct hist_entry *);
int64_t (*collapse)(struct hist_entry *, struct hist_entry *); int64_t (*collapse)(struct hist_entry *, struct hist_entry *);
...@@ -225,7 +225,7 @@ static struct sort_entry sort_sym = { ...@@ -225,7 +225,7 @@ static struct sort_entry sort_sym = {
static int sort__need_collapse = 0; static int sort__need_collapse = 0;
struct sort_dimension { struct sort_dimension {
char *name; const char *name;
struct sort_entry *entry; struct sort_entry *entry;
int taken; int taken;
}; };
...@@ -723,7 +723,7 @@ parse_line(FILE *file, struct symbol *sym, u64 start, u64 len) ...@@ -723,7 +723,7 @@ parse_line(FILE *file, struct symbol *sym, u64 start, u64 len)
const char *path = NULL; const char *path = NULL;
unsigned int hits = 0; unsigned int hits = 0;
double percent = 0.0; double percent = 0.0;
char *color; const char *color;
struct sym_ext *sym_ext = sym->priv; struct sym_ext *sym_ext = sym->priv;
offset = line_ip - start; offset = line_ip - start;
...@@ -805,7 +805,7 @@ static void free_source_line(struct symbol *sym, int len) ...@@ -805,7 +805,7 @@ static void free_source_line(struct symbol *sym, int len)
/* Get the filename:line for the colored entries */ /* Get the filename:line for the colored entries */
static void static void
get_source_line(struct symbol *sym, u64 start, int len, char *filename) get_source_line(struct symbol *sym, u64 start, int len, const char *filename)
{ {
int i; int i;
char cmd[PATH_MAX * 2]; char cmd[PATH_MAX * 2];
...@@ -851,7 +851,7 @@ get_source_line(struct symbol *sym, u64 start, int len, char *filename) ...@@ -851,7 +851,7 @@ get_source_line(struct symbol *sym, u64 start, int len, char *filename)
} }
} }
static void print_summary(char *filename) static void print_summary(const char *filename)
{ {
struct sym_ext *sym_ext; struct sym_ext *sym_ext;
struct rb_node *node; struct rb_node *node;
...@@ -867,7 +867,7 @@ static void print_summary(char *filename) ...@@ -867,7 +867,7 @@ static void print_summary(char *filename)
node = rb_first(&root_sym_ext); node = rb_first(&root_sym_ext);
while (node) { while (node) {
double percent; double percent;
char *color; const char *color;
char *path; char *path;
sym_ext = rb_entry(node, struct sym_ext, node); sym_ext = rb_entry(node, struct sym_ext, node);
...@@ -882,7 +882,7 @@ static void print_summary(char *filename) ...@@ -882,7 +882,7 @@ static void print_summary(char *filename)
static void annotate_sym(struct dso *dso, struct symbol *sym) static void annotate_sym(struct dso *dso, struct symbol *sym)
{ {
char *filename = dso->name, *d_filename; const char *filename = dso->name, *d_filename;
u64 start, end, len; u64 start, end, len;
char command[PATH_MAX*2]; char command[PATH_MAX*2];
FILE *file; FILE *file;
...@@ -892,7 +892,7 @@ static void annotate_sym(struct dso *dso, struct symbol *sym) ...@@ -892,7 +892,7 @@ static void annotate_sym(struct dso *dso, struct symbol *sym)
if (sym->module) if (sym->module)
filename = sym->module->path; filename = sym->module->path;
else if (dso == kernel_dso) else if (dso == kernel_dso)
filename = vmlinux; filename = vmlinux_name;
start = sym->obj_start; start = sym->obj_start;
if (!start) if (!start)
...@@ -964,7 +964,7 @@ static int __cmd_annotate(void) ...@@ -964,7 +964,7 @@ static int __cmd_annotate(void)
int ret, rc = EXIT_FAILURE; int ret, rc = EXIT_FAILURE;
unsigned long offset = 0; unsigned long offset = 0;
unsigned long head = 0; unsigned long head = 0;
struct stat stat; struct stat input_stat;
event_t *event; event_t *event;
uint32_t size; uint32_t size;
char *buf; char *buf;
...@@ -977,13 +977,13 @@ static int __cmd_annotate(void) ...@@ -977,13 +977,13 @@ static int __cmd_annotate(void)
exit(-1); exit(-1);
} }
ret = fstat(input, &stat); ret = fstat(input, &input_stat);
if (ret < 0) { if (ret < 0) {
perror("failed to stat file"); perror("failed to stat file");
exit(-1); exit(-1);
} }
if (!stat.st_size) { if (!input_stat.st_size) {
fprintf(stderr, "zero-sized file, nothing to do!\n"); fprintf(stderr, "zero-sized file, nothing to do!\n");
exit(0); exit(0);
} }
...@@ -1010,10 +1010,10 @@ static int __cmd_annotate(void) ...@@ -1010,10 +1010,10 @@ static int __cmd_annotate(void)
if (head + event->header.size >= page_size * mmap_window) { if (head + event->header.size >= page_size * mmap_window) {
unsigned long shift = page_size * (head / page_size); unsigned long shift = page_size * (head / page_size);
int ret; int munmap_ret;
ret = munmap(buf, page_size * mmap_window); munmap_ret = munmap(buf, page_size * mmap_window);
assert(ret == 0); assert(munmap_ret == 0);
offset += shift; offset += shift;
head -= shift; head -= shift;
...@@ -1049,7 +1049,7 @@ static int __cmd_annotate(void) ...@@ -1049,7 +1049,7 @@ static int __cmd_annotate(void)
head += size; head += size;
if (offset + head < (unsigned long)stat.st_size) if (offset + head < (unsigned long)input_stat.st_size)
goto more; goto more;
rc = EXIT_SUCCESS; rc = EXIT_SUCCESS;
...@@ -1092,7 +1092,7 @@ static const struct option options[] = { ...@@ -1092,7 +1092,7 @@ static const struct option options[] = {
"be more verbose (show symbol address, etc)"), "be more verbose (show symbol address, etc)"),
OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace, OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
"dump raw trace in ASCII"), "dump raw trace in ASCII"),
OPT_STRING('k', "vmlinux", &vmlinux, "file", "vmlinux pathname"), OPT_STRING('k', "vmlinux", &vmlinux_name, "file", "vmlinux pathname"),
OPT_BOOLEAN('m', "modules", &modules, OPT_BOOLEAN('m', "modules", &modules,
"load module symbols - WARNING: use only with -k and LIVE kernel"), "load module symbols - WARNING: use only with -k and LIVE kernel"),
OPT_BOOLEAN('l', "print-line", &print_line, OPT_BOOLEAN('l', "print-line", &print_line,
......
...@@ -456,6 +456,7 @@ int cmd_help(int argc, const char **argv, const char *prefix __used) ...@@ -456,6 +456,7 @@ int cmd_help(int argc, const char **argv, const char *prefix __used)
break; break;
case HELP_FORMAT_WEB: case HELP_FORMAT_WEB:
show_html_page(argv[0]); show_html_page(argv[0]);
default:
break; break;
} }
......
...@@ -97,6 +97,7 @@ static int repsep_fprintf(FILE *fp, const char *fmt, ...) ...@@ -97,6 +97,7 @@ static int repsep_fprintf(FILE *fp, const char *fmt, ...)
n = vasprintf(&bf, fmt, ap); n = vasprintf(&bf, fmt, ap);
if (n > 0) { if (n > 0) {
char *sep = bf; char *sep = bf;
while (1) { while (1) {
sep = strchr(sep, *field_sep); sep = strchr(sep, *field_sep);
if (sep == NULL) if (sep == NULL)
...@@ -144,7 +145,7 @@ struct hist_entry { ...@@ -144,7 +145,7 @@ struct hist_entry {
struct sort_entry { struct sort_entry {
struct list_head list; struct list_head list;
char *header; const char *header;
int64_t (*cmp)(struct hist_entry *, struct hist_entry *); int64_t (*cmp)(struct hist_entry *, struct hist_entry *);
int64_t (*collapse)(struct hist_entry *, struct hist_entry *); int64_t (*collapse)(struct hist_entry *, struct hist_entry *);
...@@ -328,7 +329,7 @@ static int sort__need_collapse = 0; ...@@ -328,7 +329,7 @@ static int sort__need_collapse = 0;
static int sort__has_parent = 0; static int sort__has_parent = 0;
struct sort_dimension { struct sort_dimension {
char *name; const char *name;
struct sort_entry *entry; struct sort_entry *entry;
int taken; int taken;
}; };
...@@ -343,7 +344,7 @@ static struct sort_dimension sort_dimensions[] = { ...@@ -343,7 +344,7 @@ static struct sort_dimension sort_dimensions[] = {
static LIST_HEAD(hist_entry__sort_list); static LIST_HEAD(hist_entry__sort_list);
static int sort_dimension__add(char *tok) static int sort_dimension__add(const char *tok)
{ {
unsigned int i; unsigned int i;
...@@ -602,6 +603,7 @@ hist_entry_callchain__fprintf(FILE *fp, struct hist_entry *self, ...@@ -602,6 +603,7 @@ hist_entry_callchain__fprintf(FILE *fp, struct hist_entry *self,
case CHAIN_GRAPH_REL: case CHAIN_GRAPH_REL:
ret += callchain__fprintf_graph(fp, chain, ret += callchain__fprintf_graph(fp, chain,
total_samples, 1, 1); total_samples, 1, 1);
case CHAIN_NONE:
default: default:
break; break;
} }
...@@ -1290,7 +1292,7 @@ process_lost_event(event_t *event, unsigned long offset, unsigned long head) ...@@ -1290,7 +1292,7 @@ process_lost_event(event_t *event, unsigned long offset, unsigned long head)
static void trace_event(event_t *event) static void trace_event(event_t *event)
{ {
unsigned char *raw_event = (void *)event; unsigned char *raw_event = (void *)event;
char *color = PERF_COLOR_BLUE; const char *color = PERF_COLOR_BLUE;
int i, j; int i, j;
if (!dump_trace) if (!dump_trace)
...@@ -1348,7 +1350,7 @@ process_read_event(event_t *event, unsigned long offset, unsigned long head) ...@@ -1348,7 +1350,7 @@ process_read_event(event_t *event, unsigned long offset, unsigned long head)
struct perf_counter_attr *attr = perf_header__find_attr(event->read.id); struct perf_counter_attr *attr = perf_header__find_attr(event->read.id);
if (show_threads) { if (show_threads) {
char *name = attr ? __event_name(attr->type, attr->config) const char *name = attr ? __event_name(attr->type, attr->config)
: "unknown"; : "unknown";
perf_read_values_add_value(&show_threads_values, perf_read_values_add_value(&show_threads_values,
event->read.pid, event->read.tid, event->read.pid, event->read.tid,
...@@ -1411,19 +1413,19 @@ process_event(event_t *event, unsigned long offset, unsigned long head) ...@@ -1411,19 +1413,19 @@ process_event(event_t *event, unsigned long offset, unsigned long head)
static u64 perf_header__sample_type(void) static u64 perf_header__sample_type(void)
{ {
u64 sample_type = 0; u64 type = 0;
int i; int i;
for (i = 0; i < header->attrs; i++) { for (i = 0; i < header->attrs; i++) {
struct perf_header_attr *attr = header->attr[i]; struct perf_header_attr *attr = header->attr[i];
if (!sample_type) if (!type)
sample_type = attr->attr.sample_type; type = attr->attr.sample_type;
else if (sample_type != attr->attr.sample_type) else if (type != attr->attr.sample_type)
die("non matching sample_type"); die("non matching sample_type");
} }
return sample_type; return type;
} }
static int __cmd_report(void) static int __cmd_report(void)
...@@ -1431,7 +1433,7 @@ static int __cmd_report(void) ...@@ -1431,7 +1433,7 @@ static int __cmd_report(void)
int ret, rc = EXIT_FAILURE; int ret, rc = EXIT_FAILURE;
unsigned long offset = 0; unsigned long offset = 0;
unsigned long head, shift; unsigned long head, shift;
struct stat stat; struct stat input_stat;
event_t *event; event_t *event;
uint32_t size; uint32_t size;
char *buf; char *buf;
...@@ -1450,13 +1452,13 @@ static int __cmd_report(void) ...@@ -1450,13 +1452,13 @@ static int __cmd_report(void)
exit(-1); exit(-1);
} }
ret = fstat(input, &stat); ret = fstat(input, &input_stat);
if (ret < 0) { if (ret < 0) {
perror("failed to stat file"); perror("failed to stat file");
exit(-1); exit(-1);
} }
if (!stat.st_size) { if (!input_stat.st_size) {
fprintf(stderr, "zero-sized file, nothing to do!\n"); fprintf(stderr, "zero-sized file, nothing to do!\n");
exit(0); exit(0);
} }
...@@ -1524,12 +1526,12 @@ static int __cmd_report(void) ...@@ -1524,12 +1526,12 @@ static int __cmd_report(void)
size = 8; size = 8;
if (head + event->header.size >= page_size * mmap_window) { if (head + event->header.size >= page_size * mmap_window) {
int ret; int munmap_ret;
shift = page_size * (head / page_size); shift = page_size * (head / page_size);
ret = munmap(buf, page_size * mmap_window); munmap_ret = munmap(buf, page_size * mmap_window);
assert(ret == 0); assert(munmap_ret == 0);
offset += shift; offset += shift;
head -= shift; head -= shift;
...@@ -1568,7 +1570,7 @@ static int __cmd_report(void) ...@@ -1568,7 +1570,7 @@ static int __cmd_report(void)
if (offset + head >= header->data_offset + header->data_size) if (offset + head >= header->data_offset + header->data_size)
goto done; goto done;
if (offset + head < (unsigned long)stat.st_size) if (offset + head < (unsigned long)input_stat.st_size)
goto more; goto more;
done: done:
...@@ -1666,7 +1668,7 @@ static const struct option options[] = { ...@@ -1666,7 +1668,7 @@ static const struct option options[] = {
"be more verbose (show symbol address, etc)"), "be more verbose (show symbol address, etc)"),
OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace, OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
"dump raw trace in ASCII"), "dump raw trace in ASCII"),
OPT_STRING('k', "vmlinux", &vmlinux, "file", "vmlinux pathname"), OPT_STRING('k', "vmlinux", &vmlinux_name, "file", "vmlinux pathname"),
OPT_BOOLEAN('m', "modules", &modules, OPT_BOOLEAN('m', "modules", &modules,
"load module symbols - WARNING: use only with -k and LIVE kernel"), "load module symbols - WARNING: use only with -k and LIVE kernel"),
OPT_BOOLEAN('n', "show-nr-samples", &show_nr_samples, OPT_BOOLEAN('n', "show-nr-samples", &show_nr_samples,
......
...@@ -120,7 +120,8 @@ static void parse_source(struct sym_entry *syme) ...@@ -120,7 +120,8 @@ static void parse_source(struct sym_entry *syme)
struct module *module; struct module *module;
struct section *section = NULL; struct section *section = NULL;
FILE *file; FILE *file;
char command[PATH_MAX*2], *path = vmlinux; char command[PATH_MAX*2];
const char *path = vmlinux_name;
u64 start, end, len; u64 start, end, len;
if (!syme) if (!syme)
...@@ -487,10 +488,12 @@ static void print_sym_table(void) ...@@ -487,10 +488,12 @@ static void print_sym_table(void)
); );
for (nd = rb_first(&tmp); nd; nd = rb_next(nd)) { for (nd = rb_first(&tmp); nd; nd = rb_next(nd)) {
struct sym_entry *syme = rb_entry(nd, struct sym_entry, rb_node); struct symbol *sym;
struct symbol *sym = (struct symbol *)(syme + 1);
double pcnt; double pcnt;
syme = rb_entry(nd, struct sym_entry, rb_node);
sym = (struct symbol *)(syme + 1);
if (++printed > print_entries || (int)syme->snap_count < count_filter) if (++printed > print_entries || (int)syme->snap_count < count_filter)
continue; continue;
...@@ -609,7 +612,7 @@ static void print_mapped_keys(void) ...@@ -609,7 +612,7 @@ static void print_mapped_keys(void)
fprintf(stdout, "\t[f] profile display filter (count). \t(%d)\n", count_filter); fprintf(stdout, "\t[f] profile display filter (count). \t(%d)\n", count_filter);
if (vmlinux) { if (vmlinux_name) {
fprintf(stdout, "\t[F] annotate display filter (percent). \t(%d%%)\n", sym_pcnt_filter); fprintf(stdout, "\t[F] annotate display filter (percent). \t(%d%%)\n", sym_pcnt_filter);
fprintf(stdout, "\t[s] annotate symbol. \t(%s)\n", name?: "NULL"); fprintf(stdout, "\t[s] annotate symbol. \t(%s)\n", name?: "NULL");
fprintf(stdout, "\t[S] stop annotation.\n"); fprintf(stdout, "\t[S] stop annotation.\n");
...@@ -638,7 +641,9 @@ static int key_mapped(int c) ...@@ -638,7 +641,9 @@ static int key_mapped(int c)
case 'F': case 'F':
case 's': case 's':
case 'S': case 'S':
return vmlinux ? 1 : 0; return vmlinux_name ? 1 : 0;
default:
break;
} }
return 0; return 0;
...@@ -724,6 +729,8 @@ static void handle_keypress(int c) ...@@ -724,6 +729,8 @@ static void handle_keypress(int c)
case 'z': case 'z':
zero = ~zero; zero = ~zero;
break; break;
default:
break;
} }
} }
...@@ -812,13 +819,13 @@ static int parse_symbols(void) ...@@ -812,13 +819,13 @@ static int parse_symbols(void)
{ {
struct rb_node *node; struct rb_node *node;
struct symbol *sym; struct symbol *sym;
int modules = vmlinux ? 1 : 0; int use_modules = vmlinux_name ? 1 : 0;
kernel_dso = dso__new("[kernel]", sizeof(struct sym_entry)); kernel_dso = dso__new("[kernel]", sizeof(struct sym_entry));
if (kernel_dso == NULL) if (kernel_dso == NULL)
return -1; return -1;
if (dso__load_kernel(kernel_dso, vmlinux, symbol_filter, verbose, modules) <= 0) if (dso__load_kernel(kernel_dso, vmlinux_name, symbol_filter, verbose, use_modules) <= 0)
goto out_delete_dso; goto out_delete_dso;
node = rb_first(&kernel_dso->syms); node = rb_first(&kernel_dso->syms);
...@@ -1114,7 +1121,7 @@ static const struct option options[] = { ...@@ -1114,7 +1121,7 @@ static const struct option options[] = {
"system-wide collection from all CPUs"), "system-wide collection from all CPUs"),
OPT_INTEGER('C', "CPU", &profile_cpu, OPT_INTEGER('C', "CPU", &profile_cpu,
"CPU to profile on"), "CPU to profile on"),
OPT_STRING('k', "vmlinux", &vmlinux, "file", "vmlinux pathname"), OPT_STRING('k', "vmlinux", &vmlinux_name, "file", "vmlinux pathname"),
OPT_INTEGER('m', "mmap-pages", &mmap_pages, OPT_INTEGER('m', "mmap-pages", &mmap_pages,
"number of mmap data pages"), "number of mmap data pages"),
OPT_INTEGER('r', "realtime", &realtime_prio, OPT_INTEGER('r', "realtime", &realtime_prio,
......
...@@ -50,7 +50,8 @@ const char *make_absolute_path(const char *path) ...@@ -50,7 +50,8 @@ const char *make_absolute_path(const char *path)
die ("Could not get current working directory"); die ("Could not get current working directory");
if (last_elem) { if (last_elem) {
int len = strlen(buf); len = strlen(buf);
if (len + strlen(last_elem) + 2 > PATH_MAX) if (len + strlen(last_elem) + 2 > PATH_MAX)
die ("Too long path name: '%s/%s'", die ("Too long path name: '%s/%s'",
buf, last_elem); buf, last_elem);
......
...@@ -52,7 +52,6 @@ extern const char *perf_mailmap_file; ...@@ -52,7 +52,6 @@ extern const char *perf_mailmap_file;
extern void maybe_flush_or_die(FILE *, const char *); extern void maybe_flush_or_die(FILE *, const char *);
extern int copy_fd(int ifd, int ofd); extern int copy_fd(int ifd, int ofd);
extern int copy_file(const char *dst, const char *src, int mode); extern int copy_file(const char *dst, const char *src, int mode);
extern ssize_t read_in_full(int fd, void *buf, size_t count);
extern ssize_t write_in_full(int fd, const void *buf, size_t count); extern ssize_t write_in_full(int fd, const void *buf, size_t count);
extern void write_or_die(int fd, const void *buf, size_t count); extern void write_or_die(int fd, const void *buf, size_t count);
extern int write_or_whine(int fd, const void *buf, size_t count, const char *msg); extern int write_or_whine(int fd, const void *buf, size_t count, const char *msg);
......
...@@ -50,6 +50,7 @@ rb_insert_callchain(struct rb_root *root, struct callchain_node *chain, ...@@ -50,6 +50,7 @@ rb_insert_callchain(struct rb_root *root, struct callchain_node *chain,
else else
p = &(*p)->rb_right; p = &(*p)->rb_right;
break; break;
case CHAIN_NONE:
default: default:
break; break;
} }
...@@ -143,6 +144,7 @@ int register_callchain_param(struct callchain_param *param) ...@@ -143,6 +144,7 @@ int register_callchain_param(struct callchain_param *param)
case CHAIN_FLAT: case CHAIN_FLAT:
param->sort = sort_chain_flat; param->sort = sort_chain_flat;
break; break;
case CHAIN_NONE:
default: default:
return -1; return -1;
} }
......
...@@ -242,9 +242,9 @@ int color_fwrite_lines(FILE *fp, const char *color, ...@@ -242,9 +242,9 @@ int color_fwrite_lines(FILE *fp, const char *color,
return 0; return 0;
} }
char *get_percent_color(double percent) const char *get_percent_color(double percent)
{ {
char *color = PERF_COLOR_NORMAL; const char *color = PERF_COLOR_NORMAL;
/* /*
* We color high-overhead entries in red, mid-overhead * We color high-overhead entries in red, mid-overhead
...@@ -263,7 +263,7 @@ char *get_percent_color(double percent) ...@@ -263,7 +263,7 @@ char *get_percent_color(double percent)
int percent_color_fprintf(FILE *fp, const char *fmt, double percent) int percent_color_fprintf(FILE *fp, const char *fmt, double percent)
{ {
int r; int r;
char *color; const char *color;
color = get_percent_color(percent); color = get_percent_color(percent);
r = color_fprintf(fp, color, fmt, percent); r = color_fprintf(fp, color, fmt, percent);
......
...@@ -36,6 +36,6 @@ int color_fprintf(FILE *fp, const char *color, const char *fmt, ...); ...@@ -36,6 +36,6 @@ int color_fprintf(FILE *fp, const char *color, const char *fmt, ...);
int color_fprintf_ln(FILE *fp, const char *color, const char *fmt, ...); int color_fprintf_ln(FILE *fp, const char *color, const char *fmt, ...);
int color_fwrite_lines(FILE *fp, const char *color, size_t count, const char *buf); int color_fwrite_lines(FILE *fp, const char *color, size_t count, const char *buf);
int percent_color_fprintf(FILE *fp, const char *fmt, double percent); int percent_color_fprintf(FILE *fp, const char *fmt, double percent);
char *get_percent_color(double percent); const char *get_percent_color(double percent);
#endif /* COLOR_H */ #endif /* COLOR_H */
...@@ -160,17 +160,18 @@ static int get_extended_base_var(char *name, int baselen, int c) ...@@ -160,17 +160,18 @@ static int get_extended_base_var(char *name, int baselen, int c)
name[baselen++] = '.'; name[baselen++] = '.';
for (;;) { for (;;) {
int c = get_next_char(); int ch = get_next_char();
if (c == '\n')
if (ch == '\n')
return -1; return -1;
if (c == '"') if (ch == '"')
break; break;
if (c == '\\') { if (ch == '\\') {
c = get_next_char(); ch = get_next_char();
if (c == '\n') if (ch == '\n')
return -1; return -1;
} }
name[baselen++] = c; name[baselen++] = ch;
if (baselen > MAXNAME / 2) if (baselen > MAXNAME / 2)
return -1; return -1;
} }
...@@ -530,6 +531,8 @@ static int store_aux(const char* key, const char* value, void *cb __used) ...@@ -530,6 +531,8 @@ static int store_aux(const char* key, const char* value, void *cb __used)
store.offset[store.seen] = ftell(config_file); store.offset[store.seen] = ftell(config_file);
} }
} }
default:
break;
} }
return 0; return 0;
} }
...@@ -619,6 +622,7 @@ static ssize_t find_beginning_of_line(const char* contents, size_t size, ...@@ -619,6 +622,7 @@ static ssize_t find_beginning_of_line(const char* contents, size_t size,
switch (contents[offset]) { switch (contents[offset]) {
case '=': equal_offset = offset; break; case '=': equal_offset = offset; break;
case ']': bracket_offset = offset; break; case ']': bracket_offset = offset; break;
default: break;
} }
if (offset > 0 && contents[offset-1] == '\\') { if (offset > 0 && contents[offset-1] == '\\') {
offset_ = offset; offset_ = offset;
...@@ -742,9 +746,9 @@ int perf_config_set_multivar(const char* key, const char* value, ...@@ -742,9 +746,9 @@ int perf_config_set_multivar(const char* key, const char* value,
goto write_err_out; goto write_err_out;
} else { } else {
struct stat st; struct stat st;
char* contents; char *contents;
ssize_t contents_sz, copy_begin, copy_end; ssize_t contents_sz, copy_begin, copy_end;
int i, new_line = 0; int new_line = 0;
if (value_regex == NULL) if (value_regex == NULL)
store.value_regex = NULL; store.value_regex = NULL;
......
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#define MAX_ARGS 32 #define MAX_ARGS 32
extern char **environ;
static const char *argv_exec_path; static const char *argv_exec_path;
static const char *argv0_path; static const char *argv0_path;
......
...@@ -436,9 +436,9 @@ static int mod_dso__load_module_paths(struct mod_dso *self) ...@@ -436,9 +436,9 @@ static int mod_dso__load_module_paths(struct mod_dso *self)
goto out_failure; goto out_failure;
while (!feof(file)) { while (!feof(file)) {
char *path, *name, *tmp; char *name, *tmp;
struct module *module; struct module *module;
int line_len, len; int line_len;
line_len = getline(&line, &n, file); line_len = getline(&line, &n, file);
if (line_len < 0) if (line_len < 0)
......
...@@ -16,8 +16,8 @@ struct perf_counter_attr attrs[MAX_COUNTERS]; ...@@ -16,8 +16,8 @@ struct perf_counter_attr attrs[MAX_COUNTERS];
struct event_symbol { struct event_symbol {
u8 type; u8 type;
u64 config; u64 config;
char *symbol; const char *symbol;
char *alias; const char *alias;
}; };
char debugfs_path[MAXPATHLEN]; char debugfs_path[MAXPATHLEN];
...@@ -51,7 +51,7 @@ static struct event_symbol event_symbols[] = { ...@@ -51,7 +51,7 @@ static struct event_symbol event_symbols[] = {
#define PERF_COUNTER_TYPE(config) __PERF_COUNTER_FIELD(config, TYPE) #define PERF_COUNTER_TYPE(config) __PERF_COUNTER_FIELD(config, TYPE)
#define PERF_COUNTER_ID(config) __PERF_COUNTER_FIELD(config, EVENT) #define PERF_COUNTER_ID(config) __PERF_COUNTER_FIELD(config, EVENT)
static char *hw_event_names[] = { static const char *hw_event_names[] = {
"cycles", "cycles",
"instructions", "instructions",
"cache-references", "cache-references",
...@@ -61,7 +61,7 @@ static char *hw_event_names[] = { ...@@ -61,7 +61,7 @@ static char *hw_event_names[] = {
"bus-cycles", "bus-cycles",
}; };
static char *sw_event_names[] = { static const char *sw_event_names[] = {
"cpu-clock-msecs", "cpu-clock-msecs",
"task-clock-msecs", "task-clock-msecs",
"page-faults", "page-faults",
...@@ -73,7 +73,7 @@ static char *sw_event_names[] = { ...@@ -73,7 +73,7 @@ static char *sw_event_names[] = {
#define MAX_ALIASES 8 #define MAX_ALIASES 8
static char *hw_cache[][MAX_ALIASES] = { static const char *hw_cache[][MAX_ALIASES] = {
{ "L1-dcache", "l1-d", "l1d", "L1-data", }, { "L1-dcache", "l1-d", "l1d", "L1-data", },
{ "L1-icache", "l1-i", "l1i", "L1-instruction", }, { "L1-icache", "l1-i", "l1i", "L1-instruction", },
{ "LLC", "L2" }, { "LLC", "L2" },
...@@ -82,13 +82,13 @@ static char *hw_cache[][MAX_ALIASES] = { ...@@ -82,13 +82,13 @@ static char *hw_cache[][MAX_ALIASES] = {
{ "branch", "branches", "bpu", "btb", "bpc", }, { "branch", "branches", "bpu", "btb", "bpc", },
}; };
static char *hw_cache_op[][MAX_ALIASES] = { static const char *hw_cache_op[][MAX_ALIASES] = {
{ "load", "loads", "read", }, { "load", "loads", "read", },
{ "store", "stores", "write", }, { "store", "stores", "write", },
{ "prefetch", "prefetches", "speculative-read", "speculative-load", }, { "prefetch", "prefetches", "speculative-read", "speculative-load", },
}; };
static char *hw_cache_result[][MAX_ALIASES] = { static const char *hw_cache_result[][MAX_ALIASES] = {
{ "refs", "Reference", "ops", "access", }, { "refs", "Reference", "ops", "access", },
{ "misses", "miss", }, { "misses", "miss", },
}; };
...@@ -158,7 +158,7 @@ int valid_debugfs_mount(const char *debugfs) ...@@ -158,7 +158,7 @@ int valid_debugfs_mount(const char *debugfs)
return 0; return 0;
} }
static char *tracepoint_id_to_name(u64 config) static const char *tracepoint_id_to_name(u64 config)
{ {
static char tracepoint_name[2 * MAX_EVENT_LENGTH]; static char tracepoint_name[2 * MAX_EVENT_LENGTH];
DIR *sys_dir, *evt_dir; DIR *sys_dir, *evt_dir;
...@@ -235,7 +235,7 @@ static char *event_cache_name(u8 cache_type, u8 cache_op, u8 cache_result) ...@@ -235,7 +235,7 @@ static char *event_cache_name(u8 cache_type, u8 cache_op, u8 cache_result)
return name; return name;
} }
char *event_name(int counter) const char *event_name(int counter)
{ {
u64 config = attrs[counter].config; u64 config = attrs[counter].config;
int type = attrs[counter].type; int type = attrs[counter].type;
...@@ -243,7 +243,7 @@ char *event_name(int counter) ...@@ -243,7 +243,7 @@ char *event_name(int counter)
return __event_name(type, config); return __event_name(type, config);
} }
char *__event_name(int type, u64 config) const char *__event_name(int type, u64 config)
{ {
static char buf[32]; static char buf[32];
...@@ -294,7 +294,7 @@ char *__event_name(int type, u64 config) ...@@ -294,7 +294,7 @@ char *__event_name(int type, u64 config)
return "unknown"; return "unknown";
} }
static int parse_aliases(const char **str, char *names[][MAX_ALIASES], int size) static int parse_aliases(const char **str, const char *names[][MAX_ALIASES], int size)
{ {
int i, j; int i, j;
int n, longest = -1; int n, longest = -1;
......
...@@ -9,8 +9,8 @@ extern int nr_counters; ...@@ -9,8 +9,8 @@ extern int nr_counters;
extern struct perf_counter_attr attrs[MAX_COUNTERS]; extern struct perf_counter_attr attrs[MAX_COUNTERS];
extern char *event_name(int ctr); extern const char *event_name(int ctr);
extern char *__event_name(int type, u64 config); extern const char *__event_name(int type, u64 config);
extern int parse_events(const struct option *opt, const char *str, int unset); extern int parse_events(const struct option *opt, const char *str, int unset);
......
...@@ -53,6 +53,12 @@ static int get_value(struct parse_opt_ctx_t *p, ...@@ -53,6 +53,12 @@ static int get_value(struct parse_opt_ctx_t *p,
case OPTION_SET_INT: case OPTION_SET_INT:
case OPTION_SET_PTR: case OPTION_SET_PTR:
return opterror(opt, "takes no value", flags); return opterror(opt, "takes no value", flags);
case OPTION_END:
case OPTION_ARGUMENT:
case OPTION_GROUP:
case OPTION_STRING:
case OPTION_INTEGER:
case OPTION_LONG:
default: default:
break; break;
} }
...@@ -130,6 +136,9 @@ static int get_value(struct parse_opt_ctx_t *p, ...@@ -130,6 +136,9 @@ static int get_value(struct parse_opt_ctx_t *p,
return opterror(opt, "expects a numerical value", flags); return opterror(opt, "expects a numerical value", flags);
return 0; return 0;
case OPTION_END:
case OPTION_ARGUMENT:
case OPTION_GROUP:
default: default:
die("should not happen, someone must be hit on the forehead"); die("should not happen, someone must be hit on the forehead");
} }
...@@ -296,6 +305,8 @@ int parse_options_step(struct parse_opt_ctx_t *ctx, ...@@ -296,6 +305,8 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
return parse_options_usage(usagestr, options); return parse_options_usage(usagestr, options);
case -2: case -2:
goto unknown; goto unknown;
default:
break;
} }
if (ctx->opt) if (ctx->opt)
check_typos(arg + 1, options); check_typos(arg + 1, options);
...@@ -314,6 +325,8 @@ int parse_options_step(struct parse_opt_ctx_t *ctx, ...@@ -314,6 +325,8 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
ctx->argv[0] = strdup(ctx->opt - 1); ctx->argv[0] = strdup(ctx->opt - 1);
*(char *)ctx->argv[0] = '-'; *(char *)ctx->argv[0] = '-';
goto unknown; goto unknown;
default:
break;
} }
} }
continue; continue;
...@@ -336,6 +349,8 @@ int parse_options_step(struct parse_opt_ctx_t *ctx, ...@@ -336,6 +349,8 @@ int parse_options_step(struct parse_opt_ctx_t *ctx,
return parse_options_usage(usagestr, options); return parse_options_usage(usagestr, options);
case -2: case -2:
goto unknown; goto unknown;
default:
break;
} }
continue; continue;
unknown: unknown:
...@@ -456,6 +471,13 @@ int usage_with_options_internal(const char * const *usagestr, ...@@ -456,6 +471,13 @@ int usage_with_options_internal(const char * const *usagestr,
} }
break; break;
default: /* OPTION_{BIT,BOOLEAN,SET_INT,SET_PTR} */ default: /* OPTION_{BIT,BOOLEAN,SET_INT,SET_PTR} */
case OPTION_END:
case OPTION_GROUP:
case OPTION_BIT:
case OPTION_BOOLEAN:
case OPTION_SET_INT:
case OPTION_SET_PTR:
case OPTION_LONG:
break; break;
} }
......
...@@ -17,7 +17,7 @@ static char bad_path[] = "/bad-path/"; ...@@ -17,7 +17,7 @@ static char bad_path[] = "/bad-path/";
* Two hacks: * Two hacks:
*/ */
static char *get_perf_dir(void) static const char *get_perf_dir(void)
{ {
return "."; return ".";
} }
...@@ -38,8 +38,9 @@ size_t strlcpy(char *dest, const char *src, size_t size) ...@@ -38,8 +38,9 @@ size_t strlcpy(char *dest, const char *src, size_t size)
static char *get_pathname(void) static char *get_pathname(void)
{ {
static char pathname_array[4][PATH_MAX]; static char pathname_array[4][PATH_MAX];
static int index; static int idx;
return pathname_array[3 & ++index];
return pathname_array[3 & ++idx];
} }
static char *cleanup_path(char *path) static char *cleanup_path(char *path)
...@@ -161,20 +162,24 @@ int perf_mkstemp(char *path, size_t len, const char *template) ...@@ -161,20 +162,24 @@ int perf_mkstemp(char *path, size_t len, const char *template)
} }
const char *make_relative_path(const char *abs, const char *base) const char *make_relative_path(const char *abs_path, const char *base)
{ {
static char buf[PATH_MAX + 1]; static char buf[PATH_MAX + 1];
int baselen; int baselen;
if (!base) if (!base)
return abs; return abs_path;
baselen = strlen(base); baselen = strlen(base);
if (prefixcmp(abs, base)) if (prefixcmp(abs_path, base))
return abs; return abs_path;
if (abs[baselen] == '/') if (abs_path[baselen] == '/')
baselen++; baselen++;
else if (base[baselen - 1] != '/') else if (base[baselen - 1] != '/')
return abs; return abs_path;
strcpy(buf, abs + baselen);
strcpy(buf, abs_path + baselen);
return buf; return buf;
} }
......
...@@ -262,7 +262,7 @@ int run_hook(const char *index_file, const char *name, ...) ...@@ -262,7 +262,7 @@ int run_hook(const char *index_file, const char *name, ...)
{ {
struct child_process hook; struct child_process hook;
const char **argv = NULL, *env[2]; const char **argv = NULL, *env[2];
char index[PATH_MAX]; char idx[PATH_MAX];
va_list args; va_list args;
int ret; int ret;
size_t i = 0, alloc = 0; size_t i = 0, alloc = 0;
...@@ -284,8 +284,8 @@ int run_hook(const char *index_file, const char *name, ...) ...@@ -284,8 +284,8 @@ int run_hook(const char *index_file, const char *name, ...)
hook.no_stdin = 1; hook.no_stdin = 1;
hook.stdout_to_stderr = 1; hook.stdout_to_stderr = 1;
if (index_file) { if (index_file) {
snprintf(index, sizeof(index), "PERF_INDEX_FILE=%s", index_file); snprintf(idx, sizeof(idx), "PERF_INDEX_FILE=%s", index_file);
env[0] = index; env[0] = idx;
env[1] = NULL; env[1] = NULL;
hook.env = env; hook.env = env;
} }
......
...@@ -21,7 +21,7 @@ enum dso_origin { ...@@ -21,7 +21,7 @@ enum dso_origin {
static struct symbol *symbol__new(u64 start, u64 len, static struct symbol *symbol__new(u64 start, u64 len,
const char *name, unsigned int priv_size, const char *name, unsigned int priv_size,
u64 obj_start, int verbose) u64 obj_start, int v)
{ {
size_t namelen = strlen(name) + 1; size_t namelen = strlen(name) + 1;
struct symbol *self = calloc(1, priv_size + sizeof(*self) + namelen); struct symbol *self = calloc(1, priv_size + sizeof(*self) + namelen);
...@@ -29,7 +29,7 @@ static struct symbol *symbol__new(u64 start, u64 len, ...@@ -29,7 +29,7 @@ static struct symbol *symbol__new(u64 start, u64 len,
if (!self) if (!self)
return NULL; return NULL;
if (verbose >= 2) if (v >= 2)
printf("new symbol: %016Lx [%08lx]: %s, hist: %p, obj_start: %p\n", printf("new symbol: %016Lx [%08lx]: %s, hist: %p, obj_start: %p\n",
(u64)start, (unsigned long)len, name, self->hist, (void *)(unsigned long)obj_start); (u64)start, (unsigned long)len, name, self->hist, (void *)(unsigned long)obj_start);
...@@ -156,7 +156,7 @@ size_t dso__fprintf(struct dso *self, FILE *fp) ...@@ -156,7 +156,7 @@ size_t dso__fprintf(struct dso *self, FILE *fp)
return ret; return ret;
} }
static int dso__load_kallsyms(struct dso *self, symbol_filter_t filter, int verbose) static int dso__load_kallsyms(struct dso *self, symbol_filter_t filter, int v)
{ {
struct rb_node *nd, *prevnd; struct rb_node *nd, *prevnd;
char *line = NULL; char *line = NULL;
...@@ -198,7 +198,7 @@ static int dso__load_kallsyms(struct dso *self, symbol_filter_t filter, int verb ...@@ -198,7 +198,7 @@ static int dso__load_kallsyms(struct dso *self, symbol_filter_t filter, int verb
* Well fix up the end later, when we have all sorted. * Well fix up the end later, when we have all sorted.
*/ */
sym = symbol__new(start, 0xdead, line + len + 2, sym = symbol__new(start, 0xdead, line + len + 2,
self->sym_priv_size, 0, verbose); self->sym_priv_size, 0, v);
if (sym == NULL) if (sym == NULL)
goto out_delete_line; goto out_delete_line;
...@@ -239,7 +239,7 @@ static int dso__load_kallsyms(struct dso *self, symbol_filter_t filter, int verb ...@@ -239,7 +239,7 @@ static int dso__load_kallsyms(struct dso *self, symbol_filter_t filter, int verb
return -1; return -1;
} }
static int dso__load_perf_map(struct dso *self, symbol_filter_t filter, int verbose) static int dso__load_perf_map(struct dso *self, symbol_filter_t filter, int v)
{ {
char *line = NULL; char *line = NULL;
size_t n; size_t n;
...@@ -277,7 +277,7 @@ static int dso__load_perf_map(struct dso *self, symbol_filter_t filter, int verb ...@@ -277,7 +277,7 @@ static int dso__load_perf_map(struct dso *self, symbol_filter_t filter, int verb
continue; continue;
sym = symbol__new(start, size, line + len, sym = symbol__new(start, size, line + len,
self->sym_priv_size, start, verbose); self->sym_priv_size, start, v);
if (sym == NULL) if (sym == NULL)
goto out_delete_line; goto out_delete_line;
...@@ -305,13 +305,13 @@ static int dso__load_perf_map(struct dso *self, symbol_filter_t filter, int verb ...@@ -305,13 +305,13 @@ static int dso__load_perf_map(struct dso *self, symbol_filter_t filter, int verb
* elf_symtab__for_each_symbol - iterate thru all the symbols * elf_symtab__for_each_symbol - iterate thru all the symbols
* *
* @self: struct elf_symtab instance to iterate * @self: struct elf_symtab instance to iterate
* @index: uint32_t index * @idx: uint32_t idx
* @sym: GElf_Sym iterator * @sym: GElf_Sym iterator
*/ */
#define elf_symtab__for_each_symbol(syms, nr_syms, index, sym) \ #define elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) \
for (index = 0, gelf_getsym(syms, index, &sym);\ for (idx = 0, gelf_getsym(syms, idx, &sym);\
index < nr_syms; \ idx < nr_syms; \
index++, gelf_getsym(syms, index, &sym)) idx++, gelf_getsym(syms, idx, &sym))
static inline uint8_t elf_sym__type(const GElf_Sym *sym) static inline uint8_t elf_sym__type(const GElf_Sym *sym)
{ {
...@@ -354,7 +354,7 @@ static inline const char *elf_sym__name(const GElf_Sym *sym, ...@@ -354,7 +354,7 @@ static inline const char *elf_sym__name(const GElf_Sym *sym,
static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep, static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep,
GElf_Shdr *shp, const char *name, GElf_Shdr *shp, const char *name,
size_t *index) size_t *idx)
{ {
Elf_Scn *sec = NULL; Elf_Scn *sec = NULL;
size_t cnt = 1; size_t cnt = 1;
...@@ -365,8 +365,8 @@ static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep, ...@@ -365,8 +365,8 @@ static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep,
gelf_getshdr(sec, shp); gelf_getshdr(sec, shp);
str = elf_strptr(elf, ep->e_shstrndx, shp->sh_name); str = elf_strptr(elf, ep->e_shstrndx, shp->sh_name);
if (!strcmp(name, str)) { if (!strcmp(name, str)) {
if (index) if (idx)
*index = cnt; *idx = cnt;
break; break;
} }
++cnt; ++cnt;
...@@ -392,7 +392,7 @@ static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep, ...@@ -392,7 +392,7 @@ static Elf_Scn *elf_section_by_name(Elf *elf, GElf_Ehdr *ep,
* And always look at the original dso, not at debuginfo packages, that * And always look at the original dso, not at debuginfo packages, that
* have the PLT data stripped out (shdr_rel_plt.sh_type == SHT_NOBITS). * have the PLT data stripped out (shdr_rel_plt.sh_type == SHT_NOBITS).
*/ */
static int dso__synthesize_plt_symbols(struct dso *self, int verbose) static int dso__synthesize_plt_symbols(struct dso *self, int v)
{ {
uint32_t nr_rel_entries, idx; uint32_t nr_rel_entries, idx;
GElf_Sym sym; GElf_Sym sym;
...@@ -442,7 +442,7 @@ static int dso__synthesize_plt_symbols(struct dso *self, int verbose) ...@@ -442,7 +442,7 @@ static int dso__synthesize_plt_symbols(struct dso *self, int verbose)
goto out_elf_end; goto out_elf_end;
/* /*
* Fetch the relocation section to find the indexes to the GOT * Fetch the relocation section to find the idxes to the GOT
* and the symbols in the .dynsym they refer to. * and the symbols in the .dynsym they refer to.
*/ */
reldata = elf_getdata(scn_plt_rel, NULL); reldata = elf_getdata(scn_plt_rel, NULL);
...@@ -476,7 +476,7 @@ static int dso__synthesize_plt_symbols(struct dso *self, int verbose) ...@@ -476,7 +476,7 @@ static int dso__synthesize_plt_symbols(struct dso *self, int verbose)
"%s@plt", elf_sym__name(&sym, symstrs)); "%s@plt", elf_sym__name(&sym, symstrs));
f = symbol__new(plt_offset, shdr_plt.sh_entsize, f = symbol__new(plt_offset, shdr_plt.sh_entsize,
sympltname, self->sym_priv_size, 0, verbose); sympltname, self->sym_priv_size, 0, v);
if (!f) if (!f)
goto out_elf_end; goto out_elf_end;
...@@ -494,7 +494,7 @@ static int dso__synthesize_plt_symbols(struct dso *self, int verbose) ...@@ -494,7 +494,7 @@ static int dso__synthesize_plt_symbols(struct dso *self, int verbose)
"%s@plt", elf_sym__name(&sym, symstrs)); "%s@plt", elf_sym__name(&sym, symstrs));
f = symbol__new(plt_offset, shdr_plt.sh_entsize, f = symbol__new(plt_offset, shdr_plt.sh_entsize,
sympltname, self->sym_priv_size, 0, verbose); sympltname, self->sym_priv_size, 0, v);
if (!f) if (!f)
goto out_elf_end; goto out_elf_end;
...@@ -518,12 +518,12 @@ static int dso__synthesize_plt_symbols(struct dso *self, int verbose) ...@@ -518,12 +518,12 @@ static int dso__synthesize_plt_symbols(struct dso *self, int verbose)
} }
static int dso__load_sym(struct dso *self, int fd, const char *name, static int dso__load_sym(struct dso *self, int fd, const char *name,
symbol_filter_t filter, int verbose, struct module *mod) symbol_filter_t filter, int v, struct module *mod)
{ {
Elf_Data *symstrs, *secstrs; Elf_Data *symstrs, *secstrs;
uint32_t nr_syms; uint32_t nr_syms;
int err = -1; int err = -1;
uint32_t index; uint32_t idx;
GElf_Ehdr ehdr; GElf_Ehdr ehdr;
GElf_Shdr shdr; GElf_Shdr shdr;
Elf_Data *syms; Elf_Data *syms;
...@@ -534,14 +534,14 @@ static int dso__load_sym(struct dso *self, int fd, const char *name, ...@@ -534,14 +534,14 @@ static int dso__load_sym(struct dso *self, int fd, const char *name,
elf = elf_begin(fd, ELF_C_READ_MMAP, NULL); elf = elf_begin(fd, ELF_C_READ_MMAP, NULL);
if (elf == NULL) { if (elf == NULL) {
if (verbose) if (v)
fprintf(stderr, "%s: cannot read %s ELF file.\n", fprintf(stderr, "%s: cannot read %s ELF file.\n",
__func__, name); __func__, name);
goto out_close; goto out_close;
} }
if (gelf_getehdr(elf, &ehdr) == NULL) { if (gelf_getehdr(elf, &ehdr) == NULL) {
if (verbose) if (v)
fprintf(stderr, "%s: cannot get elf header.\n", __func__); fprintf(stderr, "%s: cannot get elf header.\n", __func__);
goto out_elf_end; goto out_elf_end;
} }
...@@ -583,9 +583,9 @@ static int dso__load_sym(struct dso *self, int fd, const char *name, ...@@ -583,9 +583,9 @@ static int dso__load_sym(struct dso *self, int fd, const char *name,
NULL) != NULL); NULL) != NULL);
} else self->adjust_symbols = 0; } else self->adjust_symbols = 0;
elf_symtab__for_each_symbol(syms, nr_syms, index, sym) { elf_symtab__for_each_symbol(syms, nr_syms, idx, sym) {
struct symbol *f; struct symbol *f;
const char *name; const char *elf_name;
char *demangled; char *demangled;
u64 obj_start; u64 obj_start;
struct section *section = NULL; struct section *section = NULL;
...@@ -608,7 +608,7 @@ static int dso__load_sym(struct dso *self, int fd, const char *name, ...@@ -608,7 +608,7 @@ static int dso__load_sym(struct dso *self, int fd, const char *name,
obj_start = sym.st_value; obj_start = sym.st_value;
if (self->adjust_symbols) { if (self->adjust_symbols) {
if (verbose >= 2) if (v >= 2)
printf("adjusting symbol: st_value: %Lx sh_addr: %Lx sh_offset: %Lx\n", printf("adjusting symbol: st_value: %Lx sh_addr: %Lx sh_offset: %Lx\n",
(u64)sym.st_value, (u64)shdr.sh_addr, (u64)shdr.sh_offset); (u64)sym.st_value, (u64)shdr.sh_addr, (u64)shdr.sh_offset);
...@@ -630,13 +630,13 @@ static int dso__load_sym(struct dso *self, int fd, const char *name, ...@@ -630,13 +630,13 @@ static int dso__load_sym(struct dso *self, int fd, const char *name,
* DWARF DW_compile_unit has this, but we don't always have access * DWARF DW_compile_unit has this, but we don't always have access
* to it... * to it...
*/ */
name = elf_sym__name(&sym, symstrs); elf_name = elf_sym__name(&sym, symstrs);
demangled = bfd_demangle(NULL, name, DMGL_PARAMS | DMGL_ANSI); demangled = bfd_demangle(NULL, elf_name, DMGL_PARAMS | DMGL_ANSI);
if (demangled != NULL) if (demangled != NULL)
name = demangled; elf_name = demangled;
f = symbol__new(sym.st_value, sym.st_size, name, f = symbol__new(sym.st_value, sym.st_size, elf_name,
self->sym_priv_size, obj_start, verbose); self->sym_priv_size, obj_start, v);
free(demangled); free(demangled);
if (!f) if (!f)
goto out_elf_end; goto out_elf_end;
...@@ -659,7 +659,7 @@ static int dso__load_sym(struct dso *self, int fd, const char *name, ...@@ -659,7 +659,7 @@ static int dso__load_sym(struct dso *self, int fd, const char *name,
#define BUILD_ID_SIZE 128 #define BUILD_ID_SIZE 128
static char *dso__read_build_id(struct dso *self, int verbose) static char *dso__read_build_id(struct dso *self, int v)
{ {
int i; int i;
GElf_Ehdr ehdr; GElf_Ehdr ehdr;
...@@ -676,14 +676,14 @@ static char *dso__read_build_id(struct dso *self, int verbose) ...@@ -676,14 +676,14 @@ static char *dso__read_build_id(struct dso *self, int verbose)
elf = elf_begin(fd, ELF_C_READ_MMAP, NULL); elf = elf_begin(fd, ELF_C_READ_MMAP, NULL);
if (elf == NULL) { if (elf == NULL) {
if (verbose) if (v)
fprintf(stderr, "%s: cannot read %s ELF file.\n", fprintf(stderr, "%s: cannot read %s ELF file.\n",
__func__, self->name); __func__, self->name);
goto out_close; goto out_close;
} }
if (gelf_getehdr(elf, &ehdr) == NULL) { if (gelf_getehdr(elf, &ehdr) == NULL) {
if (verbose) if (v)
fprintf(stderr, "%s: cannot get elf header.\n", __func__); fprintf(stderr, "%s: cannot get elf header.\n", __func__);
goto out_elf_end; goto out_elf_end;
} }
...@@ -706,7 +706,7 @@ static char *dso__read_build_id(struct dso *self, int verbose) ...@@ -706,7 +706,7 @@ static char *dso__read_build_id(struct dso *self, int verbose)
++raw; ++raw;
bid += 2; bid += 2;
} }
if (verbose >= 2) if (v >= 2)
printf("%s(%s): %s\n", __func__, self->name, build_id); printf("%s(%s): %s\n", __func__, self->name, build_id);
out_elf_end: out_elf_end:
elf_end(elf); elf_end(elf);
...@@ -732,7 +732,7 @@ char dso__symtab_origin(const struct dso *self) ...@@ -732,7 +732,7 @@ char dso__symtab_origin(const struct dso *self)
return origin[self->origin]; return origin[self->origin];
} }
int dso__load(struct dso *self, symbol_filter_t filter, int verbose) int dso__load(struct dso *self, symbol_filter_t filter, int v)
{ {
int size = PATH_MAX; int size = PATH_MAX;
char *name = malloc(size), *build_id = NULL; char *name = malloc(size), *build_id = NULL;
...@@ -745,7 +745,7 @@ int dso__load(struct dso *self, symbol_filter_t filter, int verbose) ...@@ -745,7 +745,7 @@ int dso__load(struct dso *self, symbol_filter_t filter, int verbose)
self->adjust_symbols = 0; self->adjust_symbols = 0;
if (strncmp(self->name, "/tmp/perf-", 10) == 0) { if (strncmp(self->name, "/tmp/perf-", 10) == 0) {
ret = dso__load_perf_map(self, filter, verbose); ret = dso__load_perf_map(self, filter, v);
self->origin = ret > 0 ? DSO__ORIG_JAVA_JIT : self->origin = ret > 0 ? DSO__ORIG_JAVA_JIT :
DSO__ORIG_NOT_FOUND; DSO__ORIG_NOT_FOUND;
return ret; return ret;
...@@ -764,7 +764,7 @@ int dso__load(struct dso *self, symbol_filter_t filter, int verbose) ...@@ -764,7 +764,7 @@ int dso__load(struct dso *self, symbol_filter_t filter, int verbose)
snprintf(name, size, "/usr/lib/debug%s", self->name); snprintf(name, size, "/usr/lib/debug%s", self->name);
break; break;
case DSO__ORIG_BUILDID: case DSO__ORIG_BUILDID:
build_id = dso__read_build_id(self, verbose); build_id = dso__read_build_id(self, v);
if (build_id != NULL) { if (build_id != NULL) {
snprintf(name, size, snprintf(name, size,
"/usr/lib/debug/.build-id/%.2s/%s.debug", "/usr/lib/debug/.build-id/%.2s/%s.debug",
...@@ -785,7 +785,7 @@ int dso__load(struct dso *self, symbol_filter_t filter, int verbose) ...@@ -785,7 +785,7 @@ int dso__load(struct dso *self, symbol_filter_t filter, int verbose)
fd = open(name, O_RDONLY); fd = open(name, O_RDONLY);
} while (fd < 0); } while (fd < 0);
ret = dso__load_sym(self, fd, name, filter, verbose, NULL); ret = dso__load_sym(self, fd, name, filter, v, NULL);
close(fd); close(fd);
/* /*
...@@ -795,7 +795,7 @@ int dso__load(struct dso *self, symbol_filter_t filter, int verbose) ...@@ -795,7 +795,7 @@ int dso__load(struct dso *self, symbol_filter_t filter, int verbose)
goto more; goto more;
if (ret > 0) { if (ret > 0) {
int nr_plt = dso__synthesize_plt_symbols(self, verbose); int nr_plt = dso__synthesize_plt_symbols(self, v);
if (nr_plt > 0) if (nr_plt > 0)
ret += nr_plt; ret += nr_plt;
} }
...@@ -807,7 +807,7 @@ int dso__load(struct dso *self, symbol_filter_t filter, int verbose) ...@@ -807,7 +807,7 @@ int dso__load(struct dso *self, symbol_filter_t filter, int verbose)
} }
static int dso__load_module(struct dso *self, struct mod_dso *mods, const char *name, static int dso__load_module(struct dso *self, struct mod_dso *mods, const char *name,
symbol_filter_t filter, int verbose) symbol_filter_t filter, int v)
{ {
struct module *mod = mod_dso__find_module(mods, name); struct module *mod = mod_dso__find_module(mods, name);
int err = 0, fd; int err = 0, fd;
...@@ -820,13 +820,13 @@ static int dso__load_module(struct dso *self, struct mod_dso *mods, const char * ...@@ -820,13 +820,13 @@ static int dso__load_module(struct dso *self, struct mod_dso *mods, const char *
if (fd < 0) if (fd < 0)
return err; return err;
err = dso__load_sym(self, fd, name, filter, verbose, mod); err = dso__load_sym(self, fd, name, filter, v, mod);
close(fd); close(fd);
return err; return err;
} }
int dso__load_modules(struct dso *self, symbol_filter_t filter, int verbose) int dso__load_modules(struct dso *self, symbol_filter_t filter, int v)
{ {
struct mod_dso *mods = mod_dso__new_dso("modules"); struct mod_dso *mods = mod_dso__new_dso("modules");
struct module *pos; struct module *pos;
...@@ -844,7 +844,7 @@ int dso__load_modules(struct dso *self, symbol_filter_t filter, int verbose) ...@@ -844,7 +844,7 @@ int dso__load_modules(struct dso *self, symbol_filter_t filter, int verbose)
next = rb_first(&mods->mods); next = rb_first(&mods->mods);
while (next) { while (next) {
pos = rb_entry(next, struct module, rb_node); pos = rb_entry(next, struct module, rb_node);
err = dso__load_module(self, mods, pos->name, filter, verbose); err = dso__load_module(self, mods, pos->name, filter, v);
if (err < 0) if (err < 0)
break; break;
...@@ -887,14 +887,14 @@ static inline void dso__fill_symbol_holes(struct dso *self) ...@@ -887,14 +887,14 @@ static inline void dso__fill_symbol_holes(struct dso *self)
} }
static int dso__load_vmlinux(struct dso *self, const char *vmlinux, static int dso__load_vmlinux(struct dso *self, const char *vmlinux,
symbol_filter_t filter, int verbose) symbol_filter_t filter, int v)
{ {
int err, fd = open(vmlinux, O_RDONLY); int err, fd = open(vmlinux, O_RDONLY);
if (fd < 0) if (fd < 0)
return -1; return -1;
err = dso__load_sym(self, fd, vmlinux, filter, verbose, NULL); err = dso__load_sym(self, fd, vmlinux, filter, v, NULL);
if (err > 0) if (err > 0)
dso__fill_symbol_holes(self); dso__fill_symbol_holes(self);
...@@ -905,18 +905,18 @@ static int dso__load_vmlinux(struct dso *self, const char *vmlinux, ...@@ -905,18 +905,18 @@ static int dso__load_vmlinux(struct dso *self, const char *vmlinux,
} }
int dso__load_kernel(struct dso *self, const char *vmlinux, int dso__load_kernel(struct dso *self, const char *vmlinux,
symbol_filter_t filter, int verbose, int modules) symbol_filter_t filter, int v, int use_modules)
{ {
int err = -1; int err = -1;
if (vmlinux) { if (vmlinux) {
err = dso__load_vmlinux(self, vmlinux, filter, verbose); err = dso__load_vmlinux(self, vmlinux, filter, v);
if (err > 0 && modules) if (err > 0 && use_modules)
err = dso__load_modules(self, filter, verbose); err = dso__load_modules(self, filter, v);
} }
if (err <= 0) if (err <= 0)
err = dso__load_kallsyms(self, filter, verbose); err = dso__load_kallsyms(self, filter, v);
if (err > 0) if (err > 0)
self->origin = DSO__ORIG_KERNEL; self->origin = DSO__ORIG_KERNEL;
...@@ -929,7 +929,7 @@ struct dso *kernel_dso; ...@@ -929,7 +929,7 @@ struct dso *kernel_dso;
struct dso *vdso; struct dso *vdso;
struct dso *hypervisor_dso; struct dso *hypervisor_dso;
char *vmlinux = "vmlinux"; const char *vmlinux_name = "vmlinux";
int modules; int modules;
static void dsos__add(struct dso *dso) static void dsos__add(struct dso *dso)
...@@ -997,7 +997,7 @@ int load_kernel(void) ...@@ -997,7 +997,7 @@ int load_kernel(void)
if (!kernel_dso) if (!kernel_dso)
return -1; return -1;
err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, modules); err = dso__load_kernel(kernel_dso, vmlinux_name, NULL, verbose, modules);
if (err <= 0) { if (err <= 0) {
dso__delete(kernel_dso); dso__delete(kernel_dso);
kernel_dso = NULL; kernel_dso = NULL;
......
...@@ -55,7 +55,7 @@ struct dso { ...@@ -55,7 +55,7 @@ struct dso {
char name[0]; char name[0];
}; };
const char *sym_hist_filter; extern const char *sym_hist_filter;
typedef int (*symbol_filter_t)(struct dso *self, struct symbol *sym); typedef int (*symbol_filter_t)(struct dso *self, struct symbol *sym);
...@@ -87,6 +87,6 @@ extern struct list_head dsos; ...@@ -87,6 +87,6 @@ extern struct list_head dsos;
extern struct dso *kernel_dso; extern struct dso *kernel_dso;
extern struct dso *vdso; extern struct dso *vdso;
extern struct dso *hypervisor_dso; extern struct dso *hypervisor_dso;
extern char *vmlinux; extern const char *vmlinux_name;
extern int modules; extern int modules;
#endif /* _PERF_SYMBOL_ */ #endif /* _PERF_SYMBOL_ */
...@@ -96,7 +96,7 @@ static void perf_read_values__enlarge_counters(struct perf_read_values *values) ...@@ -96,7 +96,7 @@ static void perf_read_values__enlarge_counters(struct perf_read_values *values)
} }
static int perf_read_values__findnew_counter(struct perf_read_values *values, static int perf_read_values__findnew_counter(struct perf_read_values *values,
u64 rawid, char *name) u64 rawid, const char *name)
{ {
int i; int i;
...@@ -116,7 +116,7 @@ static int perf_read_values__findnew_counter(struct perf_read_values *values, ...@@ -116,7 +116,7 @@ static int perf_read_values__findnew_counter(struct perf_read_values *values,
void perf_read_values_add_value(struct perf_read_values *values, void perf_read_values_add_value(struct perf_read_values *values,
u32 pid, u32 tid, u32 pid, u32 tid,
u64 rawid, char *name, u64 value) u64 rawid, const char *name, u64 value)
{ {
int tindex, cindex; int tindex, cindex;
...@@ -221,8 +221,7 @@ static void perf_read_values__display_raw(FILE *fp, ...@@ -221,8 +221,7 @@ static void perf_read_values__display_raw(FILE *fp,
countwidth, values->value[i][j]); countwidth, values->value[i][j]);
} }
void perf_read_values_display(FILE *fp, struct perf_read_values *values, void perf_read_values_display(FILE *fp, struct perf_read_values *values, int raw)
int raw)
{ {
if (raw) if (raw)
perf_read_values__display_raw(fp, values); perf_read_values__display_raw(fp, values);
......
...@@ -19,7 +19,7 @@ void perf_read_values_destroy(struct perf_read_values *values); ...@@ -19,7 +19,7 @@ void perf_read_values_destroy(struct perf_read_values *values);
void perf_read_values_add_value(struct perf_read_values *values, void perf_read_values_add_value(struct perf_read_values *values,
u32 pid, u32 tid, u32 pid, u32 tid,
u64 rawid, char *name, u64 value); u64 rawid, const char *name, u64 value);
void perf_read_values_display(FILE *fp, struct perf_read_values *values, void perf_read_values_display(FILE *fp, struct perf_read_values *values,
int raw); int raw);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册