Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 339a2afc authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'perf-fixes-for-linus' of...

Merge branch 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  perf tools: Fix fallback to cplus_demangle() when bfd_demangle() is not available
  perf annotate: Fix handling of goto labels that are valid hex numbers
  tracing: Properly align linker defined symbols
  perf symbols: Fix directory descriptor leaking
  perf: Fix various display bugs with parent filtering
parents b37fa16e 8a4fd31e
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -63,6 +63,12 @@
/* Align . to a 8 byte boundary equals to maximum function alignment. */
#define ALIGN_FUNCTION()  . = ALIGN(8)

/*
 * Align to a 32 byte boundary equal to the
 * alignment gcc 4.5 uses for a struct
 */
#define STRUCT_ALIGN() . = ALIGN(32)

/* The actual configuration determine if the init/exit sections
 * are handled as text/data or they can be discarded (which
 * often happens at runtime)
@@ -166,7 +172,11 @@
	LIKELY_PROFILE()		       				\
	BRANCH_PROFILE()						\
	TRACE_PRINTKS()							\
									\
	STRUCT_ALIGN();							\
	FTRACE_EVENTS()							\
									\
	STRUCT_ALIGN();							\
	TRACE_SYSCALLS()

/*
+21 −19
Original line number Diff line number Diff line
@@ -600,7 +600,8 @@ endif

ifdef NO_DEMANGLE
	BASIC_CFLAGS += -DNO_DEMANGLE
else ifdef HAVE_CPLUS_DEMANGLE
else
	ifdef HAVE_CPLUS_DEMANGLE
		EXTLIBS += -liberty
		BASIC_CFLAGS += -DHAVE_CPLUS_DEMANGLE
	else
@@ -629,6 +630,7 @@ else
			endif
		endif
	endif
endif

ifndef CC_LD_DYNPATH
	ifdef NO_R_TO_GCC_LINKER
+22 −7
Original line number Diff line number Diff line
@@ -631,9 +631,14 @@ int hist_entry__fprintf(struct hist_entry *self, struct hists *pair_hists,
			u64 session_total)
{
	char bf[512];
	hist_entry__snprintf(self, bf, sizeof(bf), pair_hists,
	int ret;

	ret = hist_entry__snprintf(self, bf, sizeof(bf), pair_hists,
				   show_displacement, displacement,
				   true, session_total);
	if (!ret)
		return 0;

	return fprintf(fp, "%s\n", bf);
}

@@ -762,6 +767,7 @@ size_t hists__fprintf(struct hists *self, struct hists *pair,
print_entries:
	for (nd = rb_first(&self->entries); nd; nd = rb_next(nd)) {
		struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node);
		int cnt;

		if (show_displacement) {
			if (h->pair != NULL)
@@ -771,8 +777,13 @@ size_t hists__fprintf(struct hists *self, struct hists *pair,
				displacement = 0;
			++position;
		}
		ret += hist_entry__fprintf(h, pair, show_displacement,
		cnt = hist_entry__fprintf(h, pair, show_displacement,
					  displacement, fp, self->stats.total_period);
		/* Ignore those that didn't match the parent filter */
		if (!cnt)
			continue;

		ret += cnt;

		if (symbol_conf.use_callchain)
			ret += hist_entry__fprintf_callchain(h, fp, self->stats.total_period);
@@ -965,13 +976,17 @@ static int hist_entry__parse_objdump_line(struct hist_entry *self, FILE *file,
		 * Parse hexa addresses followed by ':'
		 */
		line_ip = strtoull(tmp, &tmp2, 16);
		if (*tmp2 != ':' || tmp == tmp2)
		if (*tmp2 != ':' || tmp == tmp2 || tmp2[1] == '\0')
			line_ip = -1;
	}

	if (line_ip != -1) {
		u64 start = map__rip_2objdump(self->ms.map, sym->start);
		u64 start = map__rip_2objdump(self->ms.map, sym->start),
		    end = map__rip_2objdump(self->ms.map, sym->end);

		offset = line_ip - start;
		if (offset < 0 || (u64)line_ip > end)
			offset = -1;
	}

	objdump_line = objdump_line__new(offset, line);
+10 −7
Original line number Diff line number Diff line
@@ -1443,6 +1443,7 @@ static int map_groups__set_modules_path_dir(struct map_groups *self,
{
	struct dirent *dent;
	DIR *dir = opendir(dir_name);
	int ret = 0;

	if (!dir) {
		pr_debug("%s: cannot open %s dir\n", __func__, dir_name);
@@ -1465,8 +1466,9 @@ static int map_groups__set_modules_path_dir(struct map_groups *self,

			snprintf(path, sizeof(path), "%s/%s",
				 dir_name, dent->d_name);
			if (map_groups__set_modules_path_dir(self, path) < 0)
				goto failure;
			ret = map_groups__set_modules_path_dir(self, path);
			if (ret < 0)
				goto out;
		} else {
			char *dot = strrchr(dent->d_name, '.'),
			     dso_name[PATH_MAX];
@@ -1487,17 +1489,18 @@ static int map_groups__set_modules_path_dir(struct map_groups *self,
				 dir_name, dent->d_name);

			long_name = strdup(path);
			if (long_name == NULL)
				goto failure;
			if (long_name == NULL) {
				ret = -1;
				goto out;
			}
			dso__set_long_name(map->dso, long_name);
			dso__kernel_module_get_build_id(map->dso, "");
		}
	}

	return 0;
failure:
out:
	closedir(dir);
	return -1;
	return ret;
}

static char *get_kernel_version(const char *root_dir)