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