diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/perf/arch/sparc/Makefile | 4 | ||||
| -rw-r--r-- | tools/perf/arch/sparc/util/dwarf-regs.c | 43 | ||||
| -rw-r--r-- | tools/perf/builtin-report.c | 2 | ||||
| -rwxr-xr-x | tools/perf/util/PERF-VERSION-GEN | 17 | ||||
| -rw-r--r-- | tools/perf/util/callchain.c | 35 | ||||
| -rw-r--r-- | tools/perf/util/callchain.h | 5 | 
6 files changed, 79 insertions, 27 deletions
| diff --git a/tools/perf/arch/sparc/Makefile b/tools/perf/arch/sparc/Makefile new file mode 100644 index 000000000000..15130b50dfe3 --- /dev/null +++ b/tools/perf/arch/sparc/Makefile @@ -0,0 +1,4 @@ +ifndef NO_DWARF +PERF_HAVE_DWARF_REGS := 1 +LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o +endif diff --git a/tools/perf/arch/sparc/util/dwarf-regs.c b/tools/perf/arch/sparc/util/dwarf-regs.c new file mode 100644 index 000000000000..0ab88483720c --- /dev/null +++ b/tools/perf/arch/sparc/util/dwarf-regs.c @@ -0,0 +1,43 @@ +/* + * Mapping of DWARF debug register numbers into register names. + * + * Copyright (C) 2010 David S. Miller <[email protected]> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ + +#include <libio.h> +#include <dwarf-regs.h> + +#define SPARC_MAX_REGS	96 + +const char *sparc_regs_table[SPARC_MAX_REGS] = { +	"%g0", "%g1", "%g2", "%g3", "%g4", "%g5", "%g6", "%g7", +	"%o0", "%o1", "%o2", "%o3", "%o4", "%o5", "%sp", "%o7", +	"%l0", "%l1", "%l2", "%l3", "%l4", "%l5", "%l6", "%l7", +	"%i0", "%i1", "%i2", "%i3", "%i4", "%i5", "%fp", "%i7", +	"%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7", +	"%f8", "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15", +	"%f16", "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23", +	"%f24", "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31", +	"%f32", "%f33", "%f34", "%f35", "%f36", "%f37", "%f38", "%f39", +	"%f40", "%f41", "%f42", "%f43", "%f44", "%f45", "%f46", "%f47", +	"%f48", "%f49", "%f50", "%f51", "%f52", "%f53", "%f54", "%f55", +	"%f56", "%f57", "%f58", "%f59", "%f60", "%f61", "%f62", "%f63", +}; + +/** + * get_arch_regstr() - lookup register name from it's DWARF register number + * @n:	the DWARF register number + * + * get_arch_regstr() returns the name of the register in struct + * regdwarfnum_table from it's DWARF register number. If the register is not + * found in the table, this returns NULL; + */ +const char *get_arch_regstr(unsigned int n) +{ +	return (n <= SPARC_MAX_REGS) ? sparc_regs_table[n] : NULL; +} diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index 359205782964..fd7407c7205c 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -107,7 +107,7 @@ static int perf_session__add_hist_entry(struct perf_session *self,  		goto out_free_syms;  	err = 0;  	if (symbol_conf.use_callchain) { -		err = append_chain(he->callchain, data->callchain, syms); +		err = append_chain(he->callchain, data->callchain, syms, data->period);  		if (err)  			goto out_free_syms;  	} diff --git a/tools/perf/util/PERF-VERSION-GEN b/tools/perf/util/PERF-VERSION-GEN index 49ece7921914..97d76562a1a0 100755 --- a/tools/perf/util/PERF-VERSION-GEN +++ b/tools/perf/util/PERF-VERSION-GEN @@ -5,17 +5,13 @@ if [ $# -eq 1 ]  ; then  fi  GVF=${OUTPUT}PERF-VERSION-FILE -DEF_VER=v0.0.2.PERF  LF='  ' -# First see if there is a version file (included in release tarballs), -# then try git-describe, then default. -if test -f version -then -	VN=$(cat version) || VN="$DEF_VER" -elif test -d .git -o -f .git && +# First check if there is a .git to get the version from git describe +# otherwise try to get the version from the kernel makefile +if test -d ../../.git -o -f ../../.git &&  	VN=$(git describe --abbrev=4 HEAD 2>/dev/null) &&  	case "$VN" in  	*$LF*) (exit 1) ;; @@ -27,7 +23,12 @@ elif test -d .git -o -f .git &&  then  	VN=$(echo "$VN" | sed -e 's/-/./g');  else -	VN="$DEF_VER" +	eval `grep '^VERSION\s*=' ../../Makefile|tr -d ' '` +	eval `grep '^PATCHLEVEL\s*=' ../../Makefile|tr -d ' '` +	eval `grep '^SUBLEVEL\s*=' ../../Makefile|tr -d ' '` +	eval `grep '^EXTRAVERSION\s*=' ../../Makefile|tr -d ' '` + +	VN="${VERSION}.${PATCHLEVEL}.${SUBLEVEL}${EXTRAVERSION}"  fi  VN=$(expr "$VN" : v*'\(.*\)') diff --git a/tools/perf/util/callchain.c b/tools/perf/util/callchain.c index 62b69ad4aa73..52c777e451ed 100644 --- a/tools/perf/util/callchain.c +++ b/tools/perf/util/callchain.c @@ -230,7 +230,7 @@ fill_node(struct callchain_node *node, struct resolved_chain *chain, int start)  static void  add_child(struct callchain_node *parent, struct resolved_chain *chain, -	  int start) +	  int start, u64 period)  {  	struct callchain_node *new; @@ -238,7 +238,7 @@ add_child(struct callchain_node *parent, struct resolved_chain *chain,  	fill_node(new, chain, start);  	new->children_hit = 0; -	new->hit = 1; +	new->hit = period;  }  /* @@ -248,7 +248,8 @@ add_child(struct callchain_node *parent, struct resolved_chain *chain,   */  static void  split_add_child(struct callchain_node *parent, struct resolved_chain *chain, -		struct callchain_list *to_split, int idx_parents, int idx_local) +		struct callchain_list *to_split, int idx_parents, int idx_local, +		u64 period)  {  	struct callchain_node *new;  	struct list_head *old_tail; @@ -275,41 +276,41 @@ split_add_child(struct callchain_node *parent, struct resolved_chain *chain,  	/* create a new child for the new branch if any */  	if (idx_total < chain->nr) {  		parent->hit = 0; -		add_child(parent, chain, idx_total); -		parent->children_hit++; +		add_child(parent, chain, idx_total, period); +		parent->children_hit += period;  	} else { -		parent->hit = 1; +		parent->hit = period;  	}  }  static int  __append_chain(struct callchain_node *root, struct resolved_chain *chain, -	       unsigned int start); +	       unsigned int start, u64 period);  static void  __append_chain_children(struct callchain_node *root,  			struct resolved_chain *chain, -			unsigned int start) +			unsigned int start, u64 period)  {  	struct callchain_node *rnode;  	/* lookup in childrens */  	chain_for_each_child(rnode, root) { -		unsigned int ret = __append_chain(rnode, chain, start); +		unsigned int ret = __append_chain(rnode, chain, start, period);  		if (!ret)  			goto inc_children_hit;  	}  	/* nothing in children, add to the current node */ -	add_child(root, chain, start); +	add_child(root, chain, start, period);  inc_children_hit: -	root->children_hit++; +	root->children_hit += period;  }  static int  __append_chain(struct callchain_node *root, struct resolved_chain *chain, -	       unsigned int start) +	       unsigned int start, u64 period)  {  	struct callchain_list *cnode;  	unsigned int i = start; @@ -345,18 +346,18 @@ __append_chain(struct callchain_node *root, struct resolved_chain *chain,  	/* we match only a part of the node. Split it and add the new chain */  	if (i - start < root->val_nr) { -		split_add_child(root, chain, cnode, start, i - start); +		split_add_child(root, chain, cnode, start, i - start, period);  		return 0;  	}  	/* we match 100% of the path, increment the hit */  	if (i - start == root->val_nr && i == chain->nr) { -		root->hit++; +		root->hit += period;  		return 0;  	}  	/* We match the node and still have a part remaining */ -	__append_chain_children(root, chain, i); +	__append_chain_children(root, chain, i, period);  	return 0;  } @@ -380,7 +381,7 @@ static void filter_context(struct ip_callchain *old, struct resolved_chain *new,  int append_chain(struct callchain_node *root, struct ip_callchain *chain, -		 struct map_symbol *syms) +		 struct map_symbol *syms, u64 period)  {  	struct resolved_chain *filtered; @@ -397,7 +398,7 @@ int append_chain(struct callchain_node *root, struct ip_callchain *chain,  	if (!filtered->nr)  		goto end; -	__append_chain_children(root, filtered, 0); +	__append_chain_children(root, filtered, 0, period);  end:  	free(filtered); diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h index 1ca73e4a2723..f2e9ee164bd8 100644 --- a/tools/perf/util/callchain.h +++ b/tools/perf/util/callchain.h @@ -49,6 +49,9 @@ static inline void callchain_init(struct callchain_node *node)  	INIT_LIST_HEAD(&node->brothers);  	INIT_LIST_HEAD(&node->children);  	INIT_LIST_HEAD(&node->val); + +	node->parent = NULL; +	node->hit = 0;  }  static inline u64 cumul_hits(struct callchain_node *node) @@ -58,7 +61,7 @@ static inline u64 cumul_hits(struct callchain_node *node)  int register_callchain_param(struct callchain_param *param);  int append_chain(struct callchain_node *root, struct ip_callchain *chain, -		 struct map_symbol *syms); +		 struct map_symbol *syms, u64 period);  bool ip_callchain__valid(struct ip_callchain *chain, event_t *event);  #endif	/* __PERF_CALLCHAIN_H */ |