at v6.10-rc2 209 lines 5.5 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2#ifndef _PERF_ANNOTATE_DATA_H 3#define _PERF_ANNOTATE_DATA_H 4 5#include <errno.h> 6#include <linux/compiler.h> 7#include <linux/rbtree.h> 8#include <linux/types.h> 9 10struct annotated_op_loc; 11struct debuginfo; 12struct evsel; 13struct hist_browser_timer; 14struct hist_entry; 15struct map_symbol; 16struct thread; 17 18/** 19 * struct annotated_member - Type of member field 20 * @node: List entry in the parent list 21 * @children: List head for child nodes 22 * @type_name: Name of the member type 23 * @var_name: Name of the member variable 24 * @offset: Offset from the outer data type 25 * @size: Size of the member field 26 * 27 * This represents a member type in a data type. 28 */ 29struct annotated_member { 30 struct list_head node; 31 struct list_head children; 32 char *type_name; 33 char *var_name; 34 int offset; 35 int size; 36}; 37 38/** 39 * struct type_hist_entry - Histogram entry per offset 40 * @nr_samples: Number of samples 41 * @period: Count of event 42 */ 43struct type_hist_entry { 44 int nr_samples; 45 u64 period; 46}; 47 48/** 49 * struct type_hist - Type histogram for each event 50 * @nr_samples: Total number of samples in this data type 51 * @period: Total count of the event in this data type 52 * @offset: Array of histogram entry 53 */ 54struct type_hist { 55 u64 nr_samples; 56 u64 period; 57 struct type_hist_entry addr[]; 58}; 59 60/** 61 * struct annotated_data_type - Data type to profile 62 * @node: RB-tree node for dso->type_tree 63 * @self: Actual type information 64 * @nr_histogram: Number of histogram entries 65 * @histograms: An array of pointers to histograms 66 * 67 * This represents a data type accessed by samples in the profile data. 68 */ 69struct annotated_data_type { 70 struct rb_node node; 71 struct annotated_member self; 72 int nr_histograms; 73 struct type_hist **histograms; 74}; 75 76extern struct annotated_data_type unknown_type; 77extern struct annotated_data_type stackop_type; 78extern struct annotated_data_type canary_type; 79 80/** 81 * struct data_loc_info - Data location information 82 * @arch: CPU architecture info 83 * @thread: Thread info 84 * @ms: Map and Symbol info 85 * @ip: Instruction address 86 * @var_addr: Data address (for global variables) 87 * @cpumode: CPU execution mode 88 * @op: Instruction operand location (regs and offset) 89 * @di: Debug info 90 * @fbreg: Frame base register 91 * @fb_cfa: Whether the frame needs to check CFA 92 * @type_offset: Final offset in the type 93 */ 94struct data_loc_info { 95 /* These are input field, should be filled by caller */ 96 struct arch *arch; 97 struct thread *thread; 98 struct map_symbol *ms; 99 u64 ip; 100 u64 var_addr; 101 u8 cpumode; 102 struct annotated_op_loc *op; 103 104 /* These are used internally */ 105 struct debuginfo *di; 106 int fbreg; 107 bool fb_cfa; 108 109 /* This is for the result */ 110 int type_offset; 111}; 112 113/** 114 * struct annotated_data_stat - Debug statistics 115 * @total: Total number of entry 116 * @no_sym: No symbol or map found 117 * @no_insn: Failed to get disasm line 118 * @no_insn_ops: The instruction has no operands 119 * @no_mem_ops: The instruction has no memory operands 120 * @no_reg: Failed to extract a register from the operand 121 * @no_dbginfo: The binary has no debug information 122 * @no_cuinfo: Failed to find a compile_unit 123 * @no_var: Failed to find a matching variable 124 * @no_typeinfo: Failed to get a type info for the variable 125 * @invalid_size: Failed to get a size info of the type 126 * @bad_offset: The access offset is out of the type 127 */ 128struct annotated_data_stat { 129 int total; 130 int no_sym; 131 int no_insn; 132 int no_insn_ops; 133 int no_mem_ops; 134 int no_reg; 135 int no_dbginfo; 136 int no_cuinfo; 137 int no_var; 138 int no_typeinfo; 139 int invalid_size; 140 int bad_offset; 141 int insn_track; 142}; 143extern struct annotated_data_stat ann_data_stat; 144 145#ifdef HAVE_DWARF_SUPPORT 146 147/* Returns data type at the location (ip, reg, offset) */ 148struct annotated_data_type *find_data_type(struct data_loc_info *dloc); 149 150/* Update type access histogram at the given offset */ 151int annotated_data_type__update_samples(struct annotated_data_type *adt, 152 struct evsel *evsel, int offset, 153 int nr_samples, u64 period); 154 155/* Release all data type information in the tree */ 156void annotated_data_type__tree_delete(struct rb_root *root); 157 158/* Release all global variable information in the tree */ 159void global_var_type__tree_delete(struct rb_root *root); 160 161int hist_entry__annotate_data_tty(struct hist_entry *he, struct evsel *evsel); 162 163#else /* HAVE_DWARF_SUPPORT */ 164 165static inline struct annotated_data_type * 166find_data_type(struct data_loc_info *dloc __maybe_unused) 167{ 168 return NULL; 169} 170 171static inline int 172annotated_data_type__update_samples(struct annotated_data_type *adt __maybe_unused, 173 struct evsel *evsel __maybe_unused, 174 int offset __maybe_unused, 175 int nr_samples __maybe_unused, 176 u64 period __maybe_unused) 177{ 178 return -1; 179} 180 181static inline void annotated_data_type__tree_delete(struct rb_root *root __maybe_unused) 182{ 183} 184 185static inline void global_var_type__tree_delete(struct rb_root *root __maybe_unused) 186{ 187} 188 189static inline int hist_entry__annotate_data_tty(struct hist_entry *he __maybe_unused, 190 struct evsel *evsel __maybe_unused) 191{ 192 return -1; 193} 194 195#endif /* HAVE_DWARF_SUPPORT */ 196 197#ifdef HAVE_SLANG_SUPPORT 198int hist_entry__annotate_data_tui(struct hist_entry *he, struct evsel *evsel, 199 struct hist_browser_timer *hbt); 200#else 201static inline int hist_entry__annotate_data_tui(struct hist_entry *he __maybe_unused, 202 struct evsel *evsel __maybe_unused, 203 struct hist_browser_timer *hbt __maybe_unused) 204{ 205 return -1; 206} 207#endif /* HAVE_SLANG_SUPPORT */ 208 209#endif /* _PERF_ANNOTATE_DATA_H */