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