linux/tools/perf/util/unwind.h
<<
>>
Prefs
   1#ifndef __UNWIND_H
   2#define __UNWIND_H
   3
   4#include <linux/compiler.h>
   5#include <linux/types.h>
   6
   7struct map;
   8struct perf_sample;
   9struct symbol;
  10struct thread;
  11
  12struct unwind_entry {
  13        struct map      *map;
  14        struct symbol   *sym;
  15        u64             ip;
  16};
  17
  18typedef int (*unwind_entry_cb_t)(struct unwind_entry *entry, void *arg);
  19
  20struct unwind_libunwind_ops {
  21        int (*prepare_access)(struct thread *thread);
  22        void (*flush_access)(struct thread *thread);
  23        void (*finish_access)(struct thread *thread);
  24        int (*get_entries)(unwind_entry_cb_t cb, void *arg,
  25                           struct thread *thread,
  26                           struct perf_sample *data, int max_stack);
  27};
  28
  29#ifdef HAVE_DWARF_UNWIND_SUPPORT
  30int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
  31                        struct thread *thread,
  32                        struct perf_sample *data, int max_stack);
  33/* libunwind specific */
  34#ifdef HAVE_LIBUNWIND_SUPPORT
  35#ifndef LIBUNWIND__ARCH_REG_ID
  36#define LIBUNWIND__ARCH_REG_ID(regnum) libunwind__arch_reg_id(regnum)
  37#endif
  38
  39#ifndef LIBUNWIND__ARCH_REG_SP
  40#define LIBUNWIND__ARCH_REG_SP PERF_REG_SP
  41#endif
  42
  43#ifndef LIBUNWIND__ARCH_REG_IP
  44#define LIBUNWIND__ARCH_REG_IP PERF_REG_IP
  45#endif
  46
  47int LIBUNWIND__ARCH_REG_ID(int regnum);
  48int unwind__prepare_access(struct thread *thread, struct map *map,
  49                           bool *initialized);
  50void unwind__flush_access(struct thread *thread);
  51void unwind__finish_access(struct thread *thread);
  52#else
  53static inline int unwind__prepare_access(struct thread *thread __maybe_unused,
  54                                         struct map *map __maybe_unused,
  55                                         bool *initialized __maybe_unused)
  56{
  57        return 0;
  58}
  59
  60static inline void unwind__flush_access(struct thread *thread __maybe_unused) {}
  61static inline void unwind__finish_access(struct thread *thread __maybe_unused) {}
  62#endif
  63#else
  64static inline int
  65unwind__get_entries(unwind_entry_cb_t cb __maybe_unused,
  66                    void *arg __maybe_unused,
  67                    struct thread *thread __maybe_unused,
  68                    struct perf_sample *data __maybe_unused,
  69                    int max_stack __maybe_unused)
  70{
  71        return 0;
  72}
  73
  74static inline int unwind__prepare_access(struct thread *thread __maybe_unused,
  75                                         struct map *map __maybe_unused,
  76                                         bool *initialized __maybe_unused)
  77{
  78        return 0;
  79}
  80
  81static inline void unwind__flush_access(struct thread *thread __maybe_unused) {}
  82static inline void unwind__finish_access(struct thread *thread __maybe_unused) {}
  83#endif /* HAVE_DWARF_UNWIND_SUPPORT */
  84#endif /* __UNWIND_H */
  85