branch.h (2056B)
1#ifndef _PERF_BRANCH_H 2#define _PERF_BRANCH_H 1 3/* 4 * The linux/stddef.h isn't need here, but is needed for __always_inline used 5 * in files included from uapi/linux/perf_event.h such as 6 * /usr/include/linux/swab.h and /usr/include/linux/byteorder/little_endian.h, 7 * detected in at least musl libc, used in Alpine Linux. -acme 8 */ 9#include <stdio.h> 10#include <stdint.h> 11#include <linux/compiler.h> 12#include <linux/stddef.h> 13#include <linux/perf_event.h> 14#include <linux/types.h> 15#include "event.h" 16 17struct branch_flags { 18 union { 19 u64 value; 20 struct { 21 u64 mispred:1; 22 u64 predicted:1; 23 u64 in_tx:1; 24 u64 abort:1; 25 u64 cycles:16; 26 u64 type:4; 27 u64 reserved:40; 28 }; 29 }; 30}; 31 32struct branch_info { 33 struct addr_map_symbol from; 34 struct addr_map_symbol to; 35 struct branch_flags flags; 36 char *srcline_from; 37 char *srcline_to; 38}; 39 40struct branch_entry { 41 u64 from; 42 u64 to; 43 struct branch_flags flags; 44}; 45 46struct branch_stack { 47 u64 nr; 48 u64 hw_idx; 49 struct branch_entry entries[]; 50}; 51 52/* 53 * The hw_idx is only available when PERF_SAMPLE_BRANCH_HW_INDEX is applied. 54 * Otherwise, the output format of a sample with branch stack is 55 * struct branch_stack { 56 * u64 nr; 57 * struct branch_entry entries[0]; 58 * } 59 * Check whether the hw_idx is available, 60 * and return the corresponding pointer of entries[0]. 61 */ 62static inline struct branch_entry *perf_sample__branch_entries(struct perf_sample *sample) 63{ 64 u64 *entry = (u64 *)sample->branch_stack; 65 66 entry++; 67 if (sample->no_hw_idx) 68 return (struct branch_entry *)entry; 69 return (struct branch_entry *)(++entry); 70} 71 72struct branch_type_stat { 73 bool branch_to; 74 u64 counts[PERF_BR_MAX]; 75 u64 cond_fwd; 76 u64 cond_bwd; 77 u64 cross_4k; 78 u64 cross_2m; 79}; 80 81void branch_type_count(struct branch_type_stat *st, struct branch_flags *flags, 82 u64 from, u64 to); 83 84const char *branch_type_name(int type); 85void branch_type_stat_display(FILE *fp, struct branch_type_stat *st); 86int branch_type_str(struct branch_type_stat *st, char *bf, int bfsize); 87 88#endif /* _PERF_BRANCH_H */