linux/tools/perf/util/branch.h
<<
>>
Prefs
   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 */
  89