xref: /openbmc/linux/tools/perf/util/hist.h (revision 34d6f206a88c2651d216bd3487ac956a40b2ba8e)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
23d1d07ecSJohn Kacur #ifndef __PERF_HIST_H
33d1d07ecSJohn Kacur #define __PERF_HIST_H
43d1d07ecSJohn Kacur 
571551288SArnaldo Carvalho de Melo #include <linux/rbtree.h>
64e4f06e4SArnaldo Carvalho de Melo #include <linux/types.h>
7a635fc51SArnaldo Carvalho de Melo #include "evsel.h"
89754c4f9SJiri Olsa #include "color.h"
947729258SArnaldo Carvalho de Melo #include "events_stats.h"
108e03bb88SIan Rogers #include "mutex.h"
113d1d07ecSJohn Kacur 
124e4f06e4SArnaldo Carvalho de Melo struct hist_entry;
13a5051979SJiri Olsa struct hist_entry_ops;
144e4f06e4SArnaldo Carvalho de Melo struct addr_location;
1571551288SArnaldo Carvalho de Melo struct map_symbol;
167cadca8eSArnaldo Carvalho de Melo struct mem_info;
17ebf39d29SLeo Yan struct kvm_info;
187cadca8eSArnaldo Carvalho de Melo struct branch_info;
193793d4deSArnaldo Carvalho de Melo struct branch_stack;
20fe96245cSJin Yao struct block_info;
214e4f06e4SArnaldo Carvalho de Melo struct symbol;
22171f7474SArnaldo Carvalho de Melo struct ui_progress;
23ef7b93a1SArnaldo Carvalho de Melo 
24b3cef7f6SNamhyung Kim enum hist_filter {
25b3cef7f6SNamhyung Kim 	HIST_FILTER__DSO,
26b3cef7f6SNamhyung Kim 	HIST_FILTER__THREAD,
27b3cef7f6SNamhyung Kim 	HIST_FILTER__PARENT,
28b3cef7f6SNamhyung Kim 	HIST_FILTER__SYMBOL,
29b3cef7f6SNamhyung Kim 	HIST_FILTER__GUEST,
30b3cef7f6SNamhyung Kim 	HIST_FILTER__HOST,
3121394d94SKan Liang 	HIST_FILTER__SOCKET,
329857b717SJiri Olsa 	HIST_FILTER__C2C,
33b3cef7f6SNamhyung Kim };
34b3cef7f6SNamhyung Kim 
358a6c5b26SArnaldo Carvalho de Melo enum hist_column {
368a6c5b26SArnaldo Carvalho de Melo 	HISTC_SYMBOL,
373723908dSAndi Kleen 	HISTC_TIME,
388a6c5b26SArnaldo Carvalho de Melo 	HISTC_DSO,
398a6c5b26SArnaldo Carvalho de Melo 	HISTC_THREAD,
408a6c5b26SArnaldo Carvalho de Melo 	HISTC_COMM,
41d890a98cSHari Bathini 	HISTC_CGROUP_ID,
42b629f3e9SNamhyung Kim 	HISTC_CGROUP,
438a6c5b26SArnaldo Carvalho de Melo 	HISTC_PARENT,
448a6c5b26SArnaldo Carvalho de Melo 	HISTC_CPU,
452e7ea3abSKan Liang 	HISTC_SOCKET,
46dfd3b2fdSNamhyung Kim 	HISTC_SRCLINE,
4731191a85SAndi Kleen 	HISTC_SRCFILE,
48b5387528SRoberto Agostino Vitillo 	HISTC_MISPREDICT,
49f5d05bceSAndi Kleen 	HISTC_IN_TX,
50f5d05bceSAndi Kleen 	HISTC_ABORT,
51b5387528SRoberto Agostino Vitillo 	HISTC_SYMBOL_FROM,
52b5387528SRoberto Agostino Vitillo 	HISTC_SYMBOL_TO,
53b5387528SRoberto Agostino Vitillo 	HISTC_DSO_FROM,
54b5387528SRoberto Agostino Vitillo 	HISTC_DSO_TO,
5505484298SAndi Kleen 	HISTC_LOCAL_WEIGHT,
5605484298SAndi Kleen 	HISTC_GLOBAL_WEIGHT,
579fd74f20SStephane Eranian 	HISTC_CODE_PAGE_SIZE,
5898a3b32cSStephane Eranian 	HISTC_MEM_DADDR_SYMBOL,
5998a3b32cSStephane Eranian 	HISTC_MEM_DADDR_DSO,
608780fb25SKan Liang 	HISTC_MEM_PHYS_DADDR,
61a50d03e3SKan Liang 	HISTC_MEM_DATA_PAGE_SIZE,
6298a3b32cSStephane Eranian 	HISTC_MEM_LOCKED,
6398a3b32cSStephane Eranian 	HISTC_MEM_TLB,
6498a3b32cSStephane Eranian 	HISTC_MEM_LVL,
6598a3b32cSStephane Eranian 	HISTC_MEM_SNOOP,
669b32ba71SDon Zickus 	HISTC_MEM_DCACHELINE,
6728e6db20SDon Zickus 	HISTC_MEM_IADDR_SYMBOL,
68475eeab9SAndi Kleen 	HISTC_TRANSACTION,
690e332f03SAndi Kleen 	HISTC_CYCLES,
70508be0dfSAndi Kleen 	HISTC_SRCLINE_FROM,
71508be0dfSAndi Kleen 	HISTC_SRCLINE_TO,
72a34bb6a0SNamhyung Kim 	HISTC_TRACE,
737768f8daSCharles Baylis 	HISTC_SYM_SIZE,
74b74d12d5SKim Phillips 	HISTC_DSO_SIZE,
75ec6ae74fSJin Yao 	HISTC_SYMBOL_IPC,
76a054c298SKan Liang 	HISTC_MEM_BLOCKED,
77590db42dSKan Liang 	HISTC_LOCAL_INS_LAT,
78590db42dSKan Liang 	HISTC_GLOBAL_INS_LAT,
79e3304c21SAthira Rajeev 	HISTC_LOCAL_P_STAGE_CYC,
80e3304c21SAthira Rajeev 	HISTC_GLOBAL_P_STAGE_CYC,
8105274770SStephane Eranian 	HISTC_ADDR_FROM,
8205274770SStephane Eranian 	HISTC_ADDR_TO,
83762461f1SNamhyung Kim 	HISTC_ADDR,
84ea15483eSGerman Gomez 	HISTC_SIMD,
858a6c5b26SArnaldo Carvalho de Melo 	HISTC_NR_COLS, /* Last entry */
868a6c5b26SArnaldo Carvalho de Melo };
878a6c5b26SArnaldo Carvalho de Melo 
88d7b76f09SArnaldo Carvalho de Melo struct thread;
89d7b76f09SArnaldo Carvalho de Melo struct dso;
90d7b76f09SArnaldo Carvalho de Melo 
911c02c4d2SArnaldo Carvalho de Melo struct hists {
922eb3d689SDavidlohr Bueso 	struct rb_root_cached	entries_in_array[2];
932eb3d689SDavidlohr Bueso 	struct rb_root_cached	*entries_in;
942eb3d689SDavidlohr Bueso 	struct rb_root_cached	entries;
952eb3d689SDavidlohr Bueso 	struct rb_root_cached	entries_collapsed;
96fefb0b94SArnaldo Carvalho de Melo 	u64			nr_entries;
971ab1fa5dSNamhyung Kim 	u64			nr_non_filtered_entries;
98467ef10cSNamhyung Kim 	u64			callchain_period;
99467ef10cSNamhyung Kim 	u64			callchain_non_filtered_period;
100f3b623b8SArnaldo Carvalho de Melo 	struct thread		*thread_filter;
101d7b76f09SArnaldo Carvalho de Melo 	const struct dso	*dso_filter;
1020d37aa34SArnaldo Carvalho de Melo 	const char		*uid_filter_str;
103e94d53ebSNamhyung Kim 	const char		*symbol_filter_str;
1048e03bb88SIan Rogers 	struct mutex		lock;
1050f0abbacSNamhyung Kim 	struct hists_stats	stats;
1061c02c4d2SArnaldo Carvalho de Melo 	u64			event_stream;
1078a6c5b26SArnaldo Carvalho de Melo 	u16			col_len[HISTC_NR_COLS];
108c9d36628SArnaldo Carvalho de Melo 	bool			has_callchains;
10921394d94SKan Liang 	int			socket_filter;
1105b65855eSJiri Olsa 	struct perf_hpp_list	*hpp_list;
111c3bc0c43SNamhyung Kim 	struct list_head	hpp_formats;
1122dbbe9f2SNamhyung Kim 	int			nr_hpp_node;
1131c02c4d2SArnaldo Carvalho de Melo };
1141c02c4d2SArnaldo Carvalho de Melo 
11552225036SJiri Olsa #define hists__has(__h, __f) (__h)->hpp_list->__f
11652225036SJiri Olsa 
11769bcb019SNamhyung Kim struct hist_entry_iter;
11869bcb019SNamhyung Kim 
11969bcb019SNamhyung Kim struct hist_iter_ops {
12069bcb019SNamhyung Kim 	int (*prepare_entry)(struct hist_entry_iter *, struct addr_location *);
12169bcb019SNamhyung Kim 	int (*add_single_entry)(struct hist_entry_iter *, struct addr_location *);
12269bcb019SNamhyung Kim 	int (*next_entry)(struct hist_entry_iter *, struct addr_location *);
12369bcb019SNamhyung Kim 	int (*add_next_entry)(struct hist_entry_iter *, struct addr_location *);
12469bcb019SNamhyung Kim 	int (*finish_entry)(struct hist_entry_iter *, struct addr_location *);
12569bcb019SNamhyung Kim };
12669bcb019SNamhyung Kim 
12769bcb019SNamhyung Kim struct hist_entry_iter {
12869bcb019SNamhyung Kim 	int total;
12969bcb019SNamhyung Kim 	int curr;
13069bcb019SNamhyung Kim 
13169bcb019SNamhyung Kim 	bool hide_unresolved;
13269bcb019SNamhyung Kim 
13332dcd021SJiri Olsa 	struct evsel *evsel;
13469bcb019SNamhyung Kim 	struct perf_sample *sample;
13569bcb019SNamhyung Kim 	struct hist_entry *he;
13669bcb019SNamhyung Kim 	struct symbol *parent;
13769bcb019SNamhyung Kim 	void *priv;
13869bcb019SNamhyung Kim 
13969bcb019SNamhyung Kim 	const struct hist_iter_ops *ops;
1409d3c02d7SNamhyung Kim 	/* user-defined callback function (optional) */
1419d3c02d7SNamhyung Kim 	int (*add_entry_cb)(struct hist_entry_iter *iter,
1429d3c02d7SNamhyung Kim 			    struct addr_location *al, bool single, void *arg);
14369bcb019SNamhyung Kim };
14469bcb019SNamhyung Kim 
14569bcb019SNamhyung Kim extern const struct hist_iter_ops hist_iter_normal;
14669bcb019SNamhyung Kim extern const struct hist_iter_ops hist_iter_branch;
14769bcb019SNamhyung Kim extern const struct hist_iter_ops hist_iter_mem;
1487a13aa28SNamhyung Kim extern const struct hist_iter_ops hist_iter_cumulative;
14969bcb019SNamhyung Kim 
1500102ef3eSJiri Olsa struct hist_entry *hists__add_entry(struct hists *hists,
1514e4f06e4SArnaldo Carvalho de Melo 				    struct addr_location *al,
15241a4e6e2SNamhyung Kim 				    struct symbol *parent,
15341a4e6e2SNamhyung Kim 				    struct branch_info *bi,
154fd36f3ddSNamhyung Kim 				    struct mem_info *mi,
155ebf39d29SLeo Yan 				    struct kvm_info *ki,
156fd36f3ddSNamhyung Kim 				    struct perf_sample *sample,
157a0b51af3SNamhyung Kim 				    bool sample_self);
158a5051979SJiri Olsa 
159a5051979SJiri Olsa struct hist_entry *hists__add_entry_ops(struct hists *hists,
160a5051979SJiri Olsa 					struct hist_entry_ops *ops,
161a5051979SJiri Olsa 					struct addr_location *al,
162a5051979SJiri Olsa 					struct symbol *sym_parent,
163a5051979SJiri Olsa 					struct branch_info *bi,
164a5051979SJiri Olsa 					struct mem_info *mi,
165ebf39d29SLeo Yan 					struct kvm_info *ki,
166a5051979SJiri Olsa 					struct perf_sample *sample,
167a5051979SJiri Olsa 					bool sample_self);
168a5051979SJiri Olsa 
169fe96245cSJin Yao struct hist_entry *hists__add_entry_block(struct hists *hists,
170fe96245cSJin Yao 					  struct addr_location *al,
171fe96245cSJin Yao 					  struct block_info *bi);
172fe96245cSJin Yao 
17369bcb019SNamhyung Kim int hist_entry_iter__add(struct hist_entry_iter *iter, struct addr_location *al,
1749d3c02d7SNamhyung Kim 			 int max_stack_depth, void *arg);
17569bcb019SNamhyung Kim 
17689fee709SArnaldo Carvalho de Melo struct perf_hpp;
17789fee709SArnaldo Carvalho de Melo struct perf_hpp_fmt;
17889fee709SArnaldo Carvalho de Melo 
17912c14278SArnaldo Carvalho de Melo int64_t hist_entry__cmp(struct hist_entry *left, struct hist_entry *right);
18012c14278SArnaldo Carvalho de Melo int64_t hist_entry__collapse(struct hist_entry *left, struct hist_entry *right);
181475eeab9SAndi Kleen int hist_entry__transaction_len(void);
182316c7136SArnaldo Carvalho de Melo int hist_entry__sort_snprintf(struct hist_entry *he, char *bf, size_t size,
183f1cf602cSArnaldo Carvalho de Melo 			      struct hists *hists);
18489fee709SArnaldo Carvalho de Melo int hist_entry__snprintf_alignment(struct hist_entry *he, struct perf_hpp *hpp,
18589fee709SArnaldo Carvalho de Melo 				   struct perf_hpp_fmt *fmt, int printed);
1866733d1bfSArnaldo Carvalho de Melo void hist_entry__delete(struct hist_entry *he);
1874e4f06e4SArnaldo Carvalho de Melo 
188e4c38fd4SJiri Olsa typedef int (*hists__resort_cb_t)(struct hist_entry *he, void *arg);
18952c5cc36SJiri Olsa 
19010c513f7SArnaldo Carvalho de Melo void evsel__output_resort_cb(struct evsel *evsel, struct ui_progress *prog,
19157496187SJiri Olsa 			     hists__resort_cb_t cb, void *cb_arg);
19210c513f7SArnaldo Carvalho de Melo void evsel__output_resort(struct evsel *evsel, struct ui_progress *prog);
193740b97f9SNamhyung Kim void hists__output_resort(struct hists *hists, struct ui_progress *prog);
19452c5cc36SJiri Olsa void hists__output_resort_cb(struct hists *hists, struct ui_progress *prog,
19552c5cc36SJiri Olsa 			     hists__resort_cb_t cb);
196bba58cdfSNamhyung Kim int hists__collapse_resort(struct hists *hists, struct ui_progress *prog);
197c8446b9bSArnaldo Carvalho de Melo 
198b079d4e9SArnaldo Carvalho de Melo void hists__decay_entries(struct hists *hists, bool zap_user, bool zap_kernel);
199701937bdSNamhyung Kim void hists__delete_entries(struct hists *hists);
200ab81f3fdSArnaldo Carvalho de Melo void hists__output_recalc_col_len(struct hists *hists, int max_rows);
201ab81f3fdSArnaldo Carvalho de Melo 
202b10c78c5SJin Yao struct hist_entry *hists__get_entry(struct hists *hists, int idx);
203b10c78c5SJin Yao 
204f2148330SNamhyung Kim u64 hists__total_period(struct hists *hists);
2059283ba9bSNamhyung Kim void hists__reset_stats(struct hists *hists);
2066263835aSNamhyung Kim void hists__inc_stats(struct hists *hists, struct hist_entry *h);
2070f0abbacSNamhyung Kim void hists__inc_nr_events(struct hists *hists);
2081844dbcbSNamhyung Kim void hists__inc_nr_samples(struct hists *hists, bool filtered);
20975b37db0SNamhyung Kim void hists__inc_nr_lost_samples(struct hists *hists, u32 lost);
210c8446b9bSArnaldo Carvalho de Melo 
211316c7136SArnaldo Carvalho de Melo size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows,
212d05e3aaeSJiri Olsa 		      int max_cols, float min_pcnt, FILE *fp,
213e9de7e2fSArnaldo Carvalho de Melo 		      bool ignore_callchains);
2142775de0bSNamhyung Kim size_t evlist__fprintf_nr_events(struct evlist *evlist, FILE *fp,
2152775de0bSNamhyung Kim 				 bool skip_empty);
216b09e0190SArnaldo Carvalho de Melo 
217d7b76f09SArnaldo Carvalho de Melo void hists__filter_by_dso(struct hists *hists);
218d7b76f09SArnaldo Carvalho de Melo void hists__filter_by_thread(struct hists *hists);
219e94d53ebSNamhyung Kim void hists__filter_by_symbol(struct hists *hists);
22084734b06SKan Liang void hists__filter_by_socket(struct hists *hists);
221b09e0190SArnaldo Carvalho de Melo 
hists__has_filter(struct hists * hists)222268397cbSNamhyung Kim static inline bool hists__has_filter(struct hists *hists)
223268397cbSNamhyung Kim {
224268397cbSNamhyung Kim 	return hists->thread_filter || hists->dso_filter ||
22521394d94SKan Liang 		hists->symbol_filter_str || (hists->socket_filter > -1);
226268397cbSNamhyung Kim }
227268397cbSNamhyung Kim 
228316c7136SArnaldo Carvalho de Melo u16 hists__col_len(struct hists *hists, enum hist_column col);
229316c7136SArnaldo Carvalho de Melo void hists__set_col_len(struct hists *hists, enum hist_column col, u16 len);
230316c7136SArnaldo Carvalho de Melo bool hists__new_col_len(struct hists *hists, enum hist_column col, u16 len);
2317ccf4f90SNamhyung Kim void hists__reset_col_len(struct hists *hists);
2327ccf4f90SNamhyung Kim void hists__calc_col_len(struct hists *hists, struct hist_entry *he);
2338a6c5b26SArnaldo Carvalho de Melo 
23495529be4SArnaldo Carvalho de Melo void hists__match(struct hists *leader, struct hists *other);
235494d70a1SArnaldo Carvalho de Melo int hists__link(struct hists *leader, struct hists *other);
236be5863b7SNamhyung Kim int hists__unlink(struct hists *hists);
23795529be4SArnaldo Carvalho de Melo 
238a635fc51SArnaldo Carvalho de Melo struct hists_evsel {
23932dcd021SJiri Olsa 	struct evsel evsel;
240a635fc51SArnaldo Carvalho de Melo 	struct hists	  hists;
241a635fc51SArnaldo Carvalho de Melo };
242a635fc51SArnaldo Carvalho de Melo 
hists_to_evsel(struct hists * hists)24332dcd021SJiri Olsa static inline struct evsel *hists_to_evsel(struct hists *hists)
244a635fc51SArnaldo Carvalho de Melo {
245a635fc51SArnaldo Carvalho de Melo 	struct hists_evsel *hevsel = container_of(hists, struct hists_evsel, hists);
246a635fc51SArnaldo Carvalho de Melo 	return &hevsel->evsel;
247a635fc51SArnaldo Carvalho de Melo }
248a635fc51SArnaldo Carvalho de Melo 
evsel__hists(struct evsel * evsel)24932dcd021SJiri Olsa static inline struct hists *evsel__hists(struct evsel *evsel)
250a635fc51SArnaldo Carvalho de Melo {
251a635fc51SArnaldo Carvalho de Melo 	struct hists_evsel *hevsel = (struct hists_evsel *)evsel;
252a635fc51SArnaldo Carvalho de Melo 	return &hevsel->hists;
253a635fc51SArnaldo Carvalho de Melo }
254a635fc51SArnaldo Carvalho de Melo 
hists__has_callchains(struct hists * hists)255fabd37b8SArnaldo Carvalho de Melo static __pure inline bool hists__has_callchains(struct hists *hists)
256fabd37b8SArnaldo Carvalho de Melo {
257c9d36628SArnaldo Carvalho de Melo 	return hists->has_callchains;
258fabd37b8SArnaldo Carvalho de Melo }
259fabd37b8SArnaldo Carvalho de Melo 
260a635fc51SArnaldo Carvalho de Melo int hists__init(void);
2615b65855eSJiri Olsa int __hists__init(struct hists *hists, struct perf_hpp_list *hpp_list);
262fc284be9SNamhyung Kim 
2632eb3d689SDavidlohr Bueso struct rb_root_cached *hists__get_rotate_entries_in(struct hists *hists);
264a635fc51SArnaldo Carvalho de Melo 
265ea251d51SNamhyung Kim struct perf_hpp {
266ea251d51SNamhyung Kim 	char *buf;
267ea251d51SNamhyung Kim 	size_t size;
268ea251d51SNamhyung Kim 	const char *sep;
269ea251d51SNamhyung Kim 	void *ptr;
270b10c78c5SJin Yao 	bool skip;
271ea251d51SNamhyung Kim };
272ea251d51SNamhyung Kim 
273ea251d51SNamhyung Kim struct perf_hpp_fmt {
2741ecd4453SNamhyung Kim 	const char *name;
27594a0793dSNamhyung Kim 	int (*header)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
27629659ab4SJiri Olsa 		      struct hists *hists, int line, int *span);
27794a0793dSNamhyung Kim 	int (*width)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
278da1b0407SJiri Olsa 		     struct hists *hists);
279cb6e92c7SNamhyung Kim 	void (*init)(struct perf_hpp_fmt *fmt, struct hist_entry *he);
2802c5d4b4aSJiri Olsa 	int (*color)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
2812c5d4b4aSJiri Olsa 		     struct hist_entry *he);
2822c5d4b4aSJiri Olsa 	int (*entry)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
2832c5d4b4aSJiri Olsa 		     struct hist_entry *he);
28487bbdf76SNamhyung Kim 	int64_t (*cmp)(struct perf_hpp_fmt *fmt,
28587bbdf76SNamhyung Kim 		       struct hist_entry *a, struct hist_entry *b);
28687bbdf76SNamhyung Kim 	int64_t (*collapse)(struct perf_hpp_fmt *fmt,
28787bbdf76SNamhyung Kim 			    struct hist_entry *a, struct hist_entry *b);
28887bbdf76SNamhyung Kim 	int64_t (*sort)(struct perf_hpp_fmt *fmt,
28987bbdf76SNamhyung Kim 			struct hist_entry *a, struct hist_entry *b);
29097358084SJiri Olsa 	bool (*equal)(struct perf_hpp_fmt *a, struct perf_hpp_fmt *b);
291564132f3SJiri Olsa 	void (*free)(struct perf_hpp_fmt *fmt);
2921240005eSJiri Olsa 
2931240005eSJiri Olsa 	struct list_head list;
2948b536999SNamhyung Kim 	struct list_head sort_list;
295f2998422SJiri Olsa 	bool elide;
296e0d66c74SNamhyung Kim 	int len;
2975b591669SNamhyung Kim 	int user_len;
298b21a763eSJiri Olsa 	int idx;
2994b633ebaSNamhyung Kim 	int level;
300ea251d51SNamhyung Kim };
301ea251d51SNamhyung Kim 
3027c31e102SJiri Olsa struct perf_hpp_list {
3037c31e102SJiri Olsa 	struct list_head fields;
3047c31e102SJiri Olsa 	struct list_head sorts;
30552225036SJiri Olsa 
306f8e6710dSJiri Olsa 	int nr_header_lines;
30752225036SJiri Olsa 	int need_collapse;
308de7e6a7cSJiri Olsa 	int parent;
3092e0453afSJiri Olsa 	int sym;
31069849fc5SJiri Olsa 	int dso;
31135a634f7SJiri Olsa 	int socket;
312fa82911aSJiri Olsa 	int thread;
3137cecb7feSJiri Olsa 	int comm;
3147c31e102SJiri Olsa };
3157c31e102SJiri Olsa 
3167c31e102SJiri Olsa extern struct perf_hpp_list perf_hpp_list;
3171240005eSJiri Olsa 
318c3bc0c43SNamhyung Kim struct perf_hpp_list_node {
319c3bc0c43SNamhyung Kim 	struct list_head	list;
320c3bc0c43SNamhyung Kim 	struct perf_hpp_list	hpp;
321c3bc0c43SNamhyung Kim 	int			level;
3221b2dbbf4SNamhyung Kim 	bool			skip;
323c3bc0c43SNamhyung Kim };
324c3bc0c43SNamhyung Kim 
325ebdd98e0SJiri Olsa void perf_hpp_list__column_register(struct perf_hpp_list *list,
326ebdd98e0SJiri Olsa 				    struct perf_hpp_fmt *format);
327ebdd98e0SJiri Olsa void perf_hpp_list__register_sort_field(struct perf_hpp_list *list,
328ebdd98e0SJiri Olsa 					struct perf_hpp_fmt *format);
329a1c9f97fSNamhyung Kim void perf_hpp_list__prepend_sort_field(struct perf_hpp_list *list,
330a1c9f97fSNamhyung Kim 				       struct perf_hpp_fmt *format);
331ebdd98e0SJiri Olsa 
perf_hpp__column_register(struct perf_hpp_fmt * format)332ebdd98e0SJiri Olsa static inline void perf_hpp__column_register(struct perf_hpp_fmt *format)
333ebdd98e0SJiri Olsa {
334ebdd98e0SJiri Olsa 	perf_hpp_list__column_register(&perf_hpp_list, format);
335ebdd98e0SJiri Olsa }
336ebdd98e0SJiri Olsa 
perf_hpp__register_sort_field(struct perf_hpp_fmt * format)337ebdd98e0SJiri Olsa static inline void perf_hpp__register_sort_field(struct perf_hpp_fmt *format)
338ebdd98e0SJiri Olsa {
339ebdd98e0SJiri Olsa 	perf_hpp_list__register_sort_field(&perf_hpp_list, format);
340ebdd98e0SJiri Olsa }
341ebdd98e0SJiri Olsa 
perf_hpp__prepend_sort_field(struct perf_hpp_fmt * format)342a1c9f97fSNamhyung Kim static inline void perf_hpp__prepend_sort_field(struct perf_hpp_fmt *format)
343a1c9f97fSNamhyung Kim {
344a1c9f97fSNamhyung Kim 	perf_hpp_list__prepend_sort_field(&perf_hpp_list, format);
345a1c9f97fSNamhyung Kim }
346a1c9f97fSNamhyung Kim 
347cf094045SJiri Olsa #define perf_hpp_list__for_each_format(_list, format) \
348cf094045SJiri Olsa 	list_for_each_entry(format, &(_list)->fields, list)
3491240005eSJiri Olsa 
3507a1799e0SJiri Olsa #define perf_hpp_list__for_each_format_safe(_list, format, tmp)	\
3517a1799e0SJiri Olsa 	list_for_each_entry_safe(format, tmp, &(_list)->fields, list)
3521c89fe9bSNamhyung Kim 
353d29a4970SJiri Olsa #define perf_hpp_list__for_each_sort_list(_list, format) \
354d29a4970SJiri Olsa 	list_for_each_entry(format, &(_list)->sorts, sort_list)
3558b536999SNamhyung Kim 
3561a8ebd24SJiri Olsa #define perf_hpp_list__for_each_sort_list_safe(_list, format, tmp)	\
3571a8ebd24SJiri Olsa 	list_for_each_entry_safe(format, tmp, &(_list)->sorts, sort_list)
3581c89fe9bSNamhyung Kim 
359f0786af5SJiri Olsa #define hists__for_each_format(hists, format) \
36055347ec3SYuya Fujita 	perf_hpp_list__for_each_format((hists)->hpp_list, format)
361f0786af5SJiri Olsa 
362aa6f50afSJiri Olsa #define hists__for_each_sort_list(hists, format) \
36355347ec3SYuya Fujita 	perf_hpp_list__for_each_sort_list((hists)->hpp_list, format)
364aa6f50afSJiri Olsa 
365ea251d51SNamhyung Kim extern struct perf_hpp_fmt perf_hpp__format[];
366ea251d51SNamhyung Kim 
367ea251d51SNamhyung Kim enum {
368345dc0b4SJiri Olsa 	/* Matches perf_hpp__format array. */
369ea251d51SNamhyung Kim 	PERF_HPP__OVERHEAD,
370ea251d51SNamhyung Kim 	PERF_HPP__OVERHEAD_SYS,
371ea251d51SNamhyung Kim 	PERF_HPP__OVERHEAD_US,
372ea251d51SNamhyung Kim 	PERF_HPP__OVERHEAD_GUEST_SYS,
373ea251d51SNamhyung Kim 	PERF_HPP__OVERHEAD_GUEST_US,
374594dcbf3SNamhyung Kim 	PERF_HPP__OVERHEAD_ACC,
375ea251d51SNamhyung Kim 	PERF_HPP__SAMPLES,
376ea251d51SNamhyung Kim 	PERF_HPP__PERIOD,
377ea251d51SNamhyung Kim 
378ea251d51SNamhyung Kim 	PERF_HPP__MAX_INDEX
379ea251d51SNamhyung Kim };
380ea251d51SNamhyung Kim 
3811d77822eSJiri Olsa void perf_hpp__init(void);
38277284de3SNamhyung Kim void perf_hpp__cancel_cumulate(void);
38343e0a68fSJiri Olsa void perf_hpp__setup_output_field(struct perf_hpp_list *list);
38443e0a68fSJiri Olsa void perf_hpp__reset_output_field(struct perf_hpp_list *list);
38543e0a68fSJiri Olsa void perf_hpp__append_sort_keys(struct perf_hpp_list *list);
386c3bc0c43SNamhyung Kim int perf_hpp__setup_hists_formats(struct perf_hpp_list *list,
38763503dbaSJiri Olsa 				  struct evlist *evlist);
38843e0a68fSJiri Olsa 
389a7d945bcSNamhyung Kim 
390a7d945bcSNamhyung Kim bool perf_hpp__is_sort_entry(struct perf_hpp_fmt *format);
391361459f1SNamhyung Kim bool perf_hpp__is_dynamic_entry(struct perf_hpp_fmt *format);
392361459f1SNamhyung Kim bool perf_hpp__defined_dynamic_entry(struct perf_hpp_fmt *fmt, struct hists *hists);
393a9c6e46cSNamhyung Kim bool perf_hpp__is_trace_entry(struct perf_hpp_fmt *fmt);
394a9c6e46cSNamhyung Kim bool perf_hpp__is_srcline_entry(struct perf_hpp_fmt *fmt);
395a9c6e46cSNamhyung Kim bool perf_hpp__is_srcfile_entry(struct perf_hpp_fmt *fmt);
3964945cf2aSNamhyung Kim bool perf_hpp__is_thread_entry(struct perf_hpp_fmt *fmt);
3974945cf2aSNamhyung Kim bool perf_hpp__is_comm_entry(struct perf_hpp_fmt *fmt);
3984945cf2aSNamhyung Kim bool perf_hpp__is_dso_entry(struct perf_hpp_fmt *fmt);
3994945cf2aSNamhyung Kim bool perf_hpp__is_sym_entry(struct perf_hpp_fmt *fmt);
400f2998422SJiri Olsa 
401c3bc0c43SNamhyung Kim struct perf_hpp_fmt *perf_hpp_fmt__dup(struct perf_hpp_fmt *fmt);
402c3bc0c43SNamhyung Kim 
40354430101SNamhyung Kim int hist_entry__filter(struct hist_entry *he, int type, const void *arg);
40454430101SNamhyung Kim 
perf_hpp__should_skip(struct perf_hpp_fmt * format,struct hists * hists)405361459f1SNamhyung Kim static inline bool perf_hpp__should_skip(struct perf_hpp_fmt *format,
406361459f1SNamhyung Kim 					 struct hists *hists)
407f2998422SJiri Olsa {
408361459f1SNamhyung Kim 	if (format->elide)
409361459f1SNamhyung Kim 		return true;
410361459f1SNamhyung Kim 
411361459f1SNamhyung Kim 	if (perf_hpp__is_dynamic_entry(format) &&
412361459f1SNamhyung Kim 	    !perf_hpp__defined_dynamic_entry(format, hists))
413361459f1SNamhyung Kim 		return true;
414361459f1SNamhyung Kim 
415361459f1SNamhyung Kim 	return false;
416f2998422SJiri Olsa }
417f2998422SJiri Olsa 
418678a500dSNamhyung Kim void perf_hpp__reset_width(struct perf_hpp_fmt *fmt, struct hists *hists);
419e0d66c74SNamhyung Kim void perf_hpp__reset_sort_width(struct perf_hpp_fmt *fmt, struct hists *hists);
4205b591669SNamhyung Kim void perf_hpp__set_user_width(const char *width_list_str);
421e3b60bc9SNamhyung Kim void hists__reset_column_width(struct hists *hists);
422ea251d51SNamhyung Kim 
4232f6d9009SNamhyung Kim typedef u64 (*hpp_field_fn)(struct hist_entry *he);
4242f6d9009SNamhyung Kim typedef int (*hpp_callback_fn)(struct perf_hpp *hpp, bool front);
425a0088adcSNamhyung Kim typedef int (*hpp_snprint_fn)(struct perf_hpp *hpp, const char *fmt, ...);
4264a62109fSNamhyung Kim 
4275b591669SNamhyung Kim int hpp__fmt(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
4285b591669SNamhyung Kim 	     struct hist_entry *he, hpp_field_fn get_field,
4295b591669SNamhyung Kim 	     const char *fmtstr, hpp_snprint_fn print_fn, bool fmt_percent);
4305b591669SNamhyung Kim int hpp__fmt_acc(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp,
4315b591669SNamhyung Kim 		 struct hist_entry *he, hpp_field_fn get_field,
4325b591669SNamhyung Kim 		 const char *fmtstr, hpp_snprint_fn print_fn, bool fmt_percent);
4334a62109fSNamhyung Kim 
advance_hpp(struct perf_hpp * hpp,int inc)434a0088adcSNamhyung Kim static inline void advance_hpp(struct perf_hpp *hpp, int inc)
435a0088adcSNamhyung Kim {
436a0088adcSNamhyung Kim 	hpp->buf  += inc;
437a0088adcSNamhyung Kim 	hpp->size -= inc;
438a0088adcSNamhyung Kim }
439a0088adcSNamhyung Kim 
perf_hpp__use_color(void)4409754c4f9SJiri Olsa static inline size_t perf_hpp__use_color(void)
4419754c4f9SJiri Olsa {
4429754c4f9SJiri Olsa 	return !symbol_conf.field_sep;
4439754c4f9SJiri Olsa }
4449754c4f9SJiri Olsa 
perf_hpp__color_overhead(void)4459754c4f9SJiri Olsa static inline size_t perf_hpp__color_overhead(void)
4469754c4f9SJiri Olsa {
4479754c4f9SJiri Olsa 	return perf_hpp__use_color() ?
4489754c4f9SJiri Olsa 	       (COLOR_MAXLEN + sizeof(PERF_COLOR_RESET)) * PERF_HPP__MAX_INDEX
4499754c4f9SJiri Olsa 	       : 0;
4509754c4f9SJiri Olsa }
4519754c4f9SJiri Olsa 
45263503dbaSJiri Olsa struct evlist;
453e248de33SArnaldo Carvalho de Melo 
4549783adf7SNamhyung Kim struct hist_browser_timer {
4559783adf7SNamhyung Kim 	void (*timer)(void *arg);
4569783adf7SNamhyung Kim 	void *arg;
4579783adf7SNamhyung Kim 	int refresh;
4589783adf7SNamhyung Kim };
4599783adf7SNamhyung Kim 
4604968ac8fSAndi Kleen struct res_sample;
4614968ac8fSAndi Kleen 
4624968ac8fSAndi Kleen enum rstype {
4634968ac8fSAndi Kleen 	A_NORMAL,
4644968ac8fSAndi Kleen 	A_ASM,
4654968ac8fSAndi Kleen 	A_SOURCE
4664968ac8fSAndi Kleen };
467cd0cccbaSArnaldo Carvalho de Melo 
4685cb456afSJin Yao struct block_hist;
4695cb456afSJin Yao 
47089fe808aSIngo Molnar #ifdef HAVE_SLANG_SUPPORT
4711254b51eSNamhyung Kim #include "../ui/keysyms.h"
4726f3da20eSAndi Kleen void attr_to_script(char *buf, struct perf_event_attr *attr);
4736f3da20eSAndi Kleen 
47432dcd021SJiri Olsa int map_symbol__tui_annotate(struct map_symbol *ms, struct evsel *evsel,
475*297871cbSNamhyung Kim 			     struct hist_browser_timer *hbt);
476d5dbc518SArnaldo Carvalho de Melo 
47732dcd021SJiri Olsa int hist_entry__tui_annotate(struct hist_entry *he, struct evsel *evsel,
478*297871cbSNamhyung Kim 			     struct hist_browser_timer *hbt);
4791254b51eSNamhyung Kim 
480f4bd0b4aSArnaldo Carvalho de Melo int evlist__tui_browse_hists(struct evlist *evlist, const char *help, struct hist_browser_timer *hbt,
481*297871cbSNamhyung Kim 			     float min_pcnt, struct perf_env *env, bool warn_lost_event);
4826f3da20eSAndi Kleen 
48332dcd021SJiri Olsa int script_browse(const char *script_opt, struct evsel *evsel);
4844968ac8fSAndi Kleen 
4854968ac8fSAndi Kleen void run_script(char *cmd);
4864968ac8fSAndi Kleen int res_sample_browse(struct res_sample *res_samples, int num_res,
48732dcd021SJiri Olsa 		      struct evsel *evsel, enum rstype rstype);
4884968ac8fSAndi Kleen void res_sample_init(void);
4895cb456afSJin Yao 
4905cb456afSJin Yao int block_hists_tui_browse(struct block_hist *bh, struct evsel *evsel,
491*297871cbSNamhyung Kim 			   float min_percent, struct perf_env *env);
4921254b51eSNamhyung Kim #else
4937f0030b2SArnaldo Carvalho de Melo static inline
evlist__tui_browse_hists(struct evlist * evlist __maybe_unused,const char * help __maybe_unused,struct hist_browser_timer * hbt __maybe_unused,float min_pcnt __maybe_unused,struct perf_env * env __maybe_unused,bool warn_lost_event __maybe_unused)494f4bd0b4aSArnaldo Carvalho de Melo int evlist__tui_browse_hists(struct evlist *evlist __maybe_unused,
4951d037ca1SIrina Tirdea 			     const char *help __maybe_unused,
49668d80758SNamhyung Kim 			     struct hist_browser_timer *hbt __maybe_unused,
497064f1981SNamhyung Kim 			     float min_pcnt __maybe_unused,
49806cc1a47SKan Liang 			     struct perf_env *env __maybe_unused,
499*297871cbSNamhyung Kim 			     bool warn_lost_event __maybe_unused)
500d67f088eSArnaldo Carvalho de Melo {
501d67f088eSArnaldo Carvalho de Melo 	return 0;
502d67f088eSArnaldo Carvalho de Melo }
map_symbol__tui_annotate(struct map_symbol * ms __maybe_unused,struct evsel * evsel __maybe_unused,struct hist_browser_timer * hbt __maybe_unused)503d5dbc518SArnaldo Carvalho de Melo static inline int map_symbol__tui_annotate(struct map_symbol *ms __maybe_unused,
50432dcd021SJiri Olsa 					   struct evsel *evsel __maybe_unused,
505*297871cbSNamhyung Kim 					   struct hist_browser_timer *hbt __maybe_unused)
506d5dbc518SArnaldo Carvalho de Melo {
507d5dbc518SArnaldo Carvalho de Melo 	return 0;
508d5dbc518SArnaldo Carvalho de Melo }
509d67f088eSArnaldo Carvalho de Melo 
hist_entry__tui_annotate(struct hist_entry * he __maybe_unused,struct evsel * evsel __maybe_unused,struct hist_browser_timer * hbt __maybe_unused)510316c7136SArnaldo Carvalho de Melo static inline int hist_entry__tui_annotate(struct hist_entry *he __maybe_unused,
51132dcd021SJiri Olsa 					   struct evsel *evsel __maybe_unused,
512*297871cbSNamhyung Kim 					   struct hist_browser_timer *hbt __maybe_unused)
51346e3e055SArnaldo Carvalho de Melo {
51446e3e055SArnaldo Carvalho de Melo 	return 0;
51546e3e055SArnaldo Carvalho de Melo }
51666517826SFeng Tang 
script_browse(const char * script_opt __maybe_unused,struct evsel * evsel __maybe_unused)5176f3da20eSAndi Kleen static inline int script_browse(const char *script_opt __maybe_unused,
51832dcd021SJiri Olsa 				struct evsel *evsel __maybe_unused)
51966517826SFeng Tang {
52066517826SFeng Tang 	return 0;
52166517826SFeng Tang }
52266517826SFeng Tang 
res_sample_browse(struct res_sample * res_samples __maybe_unused,int num_res __maybe_unused,struct evsel * evsel __maybe_unused,enum rstype rstype __maybe_unused)5234968ac8fSAndi Kleen static inline int res_sample_browse(struct res_sample *res_samples __maybe_unused,
5244968ac8fSAndi Kleen 				    int num_res __maybe_unused,
52532dcd021SJiri Olsa 				    struct evsel *evsel __maybe_unused,
5264968ac8fSAndi Kleen 				    enum rstype rstype __maybe_unused)
5274968ac8fSAndi Kleen {
5284968ac8fSAndi Kleen 	return 0;
5294968ac8fSAndi Kleen }
5304968ac8fSAndi Kleen 
res_sample_init(void)5314968ac8fSAndi Kleen static inline void res_sample_init(void) {}
5324968ac8fSAndi Kleen 
block_hists_tui_browse(struct block_hist * bh __maybe_unused,struct evsel * evsel __maybe_unused,float min_percent __maybe_unused,struct perf_env * env __maybe_unused)5335cb456afSJin Yao static inline int block_hists_tui_browse(struct block_hist *bh __maybe_unused,
5345cb456afSJin Yao 					 struct evsel *evsel __maybe_unused,
535848a5e50SJin Yao 					 float min_percent __maybe_unused,
536*297871cbSNamhyung Kim 					 struct perf_env *env __maybe_unused)
5375cb456afSJin Yao {
5385cb456afSJin Yao 	return 0;
5395cb456afSJin Yao }
5405cb456afSJin Yao 
5411e825efbSMichael Ellerman #define K_LEFT  -1000
5421e825efbSMichael Ellerman #define K_RIGHT -2000
5435f7439e0SMichael Ellerman #define K_SWITCH_INPUT_DATA -3000
5445e3b810aSJin Yao #define K_RELOAD -4000
545b09e0190SArnaldo Carvalho de Melo #endif
54606daaabaSArnaldo Carvalho de Melo 
547316c7136SArnaldo Carvalho de Melo unsigned int hists__sort_list_width(struct hists *hists);
548a7b5895bSNamhyung Kim unsigned int hists__overhead_width(struct hists *hists);
54933db4568SNamhyung Kim 
55057849998SAndi Kleen void hist__account_cycles(struct branch_stack *bs, struct addr_location *al,
5517841f40aSJin Yao 			  struct perf_sample *sample, bool nonany_branch_mode,
5527841f40aSJin Yao 			  u64 *total_cycles);
55357849998SAndi Kleen 
55433db4568SNamhyung Kim struct option;
555b8f8eb84SArnaldo Carvalho de Melo int parse_filter_percentage(const struct option *opt, const char *arg, int unset);
5560b93da17SNamhyung Kim int perf_hist_config(const char *var, const char *value);
55733db4568SNamhyung Kim 
55894b3dc38SJiri Olsa void perf_hpp_list__init(struct perf_hpp_list *list);
55994b3dc38SJiri Olsa 
5608c01872fSNamhyung Kim enum hierarchy_move_dir {
5618c01872fSNamhyung Kim 	HMD_NORMAL,
5628c01872fSNamhyung Kim 	HMD_FORCE_SIBLING,
5638c01872fSNamhyung Kim 	HMD_FORCE_CHILD,
5648c01872fSNamhyung Kim };
5658c01872fSNamhyung Kim 
5668c01872fSNamhyung Kim struct rb_node *rb_hierarchy_last(struct rb_node *node);
5678c01872fSNamhyung Kim struct rb_node *__rb_hierarchy_next(struct rb_node *node,
5688c01872fSNamhyung Kim 				    enum hierarchy_move_dir hmd);
5698c01872fSNamhyung Kim struct rb_node *rb_hierarchy_prev(struct rb_node *node);
5708c01872fSNamhyung Kim 
rb_hierarchy_next(struct rb_node * node)5718c01872fSNamhyung Kim static inline struct rb_node *rb_hierarchy_next(struct rb_node *node)
5728c01872fSNamhyung Kim {
5738c01872fSNamhyung Kim 	return __rb_hierarchy_next(node, HMD_NORMAL);
5748c01872fSNamhyung Kim }
5758c01872fSNamhyung Kim 
576ef86d68aSNamhyung Kim #define HIERARCHY_INDENT  3
577ef86d68aSNamhyung Kim 
578a7b5895bSNamhyung Kim bool hist_entry__has_hierarchy_children(struct hist_entry *he, float limit);
57998ba1609SJiri Olsa int hpp_color_scnprintf(struct perf_hpp *hpp, const char *fmt, ...);
58098ba1609SJiri Olsa int __hpp__slsmg_color_printf(struct perf_hpp *hpp, const char *fmt, ...);
581bd28d0c5SJiri Olsa int __hist_entry__snprintf(struct hist_entry *he, struct perf_hpp *hpp,
582bd28d0c5SJiri Olsa 			   struct perf_hpp_list *hpp_list);
5832d831454SJiri Olsa int hists__fprintf_headers(struct hists *hists, FILE *fp);
584967a464aSArnaldo Carvalho de Melo int __hists__scnprintf_title(struct hists *hists, char *bf, size_t size, bool show_freq);
585967a464aSArnaldo Carvalho de Melo 
hists__scnprintf_title(struct hists * hists,char * bf,size_t size)586967a464aSArnaldo Carvalho de Melo static inline int hists__scnprintf_title(struct hists *hists, char *bf, size_t size)
587967a464aSArnaldo Carvalho de Melo {
588967a464aSArnaldo Carvalho de Melo 	return __hists__scnprintf_title(hists, bf, size, true);
589967a464aSArnaldo Carvalho de Melo }
590a7b5895bSNamhyung Kim 
5913d1d07ecSJohn Kacur #endif	/* __PERF_HIST_H */
592