linux/tools/perf/util/unwind.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef __UNWIND_H
   3#define __UNWIND_H
   4
   5#include <linux/compiler.h>
   6#include <linux/types.h>
   7#include "util/map_symbol.h"
   8
   9struct maps;
  10struct perf_sample;
  11struct thread;
  12
  13struct unwind_entry {
  14        struct map_symbol ms;
  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 maps *maps);
  22        void (*flush_access)(struct maps *maps);
  23        void (*finish_access)(struct maps *maps);
  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 maps *maps, struct map *map, bool *initialized);
  49void unwind__flush_access(struct maps *maps);
  50void unwind__finish_access(struct maps *maps);
  51#else
  52static inline int unwind__prepare_access(struct maps *maps __maybe_unused,
  53                                         struct map *map __maybe_unused,
  54                                         bool *initialized __maybe_unused)
  55{
  56        return 0;
  57}
  58
  59static inline void unwind__flush_access(struct maps *maps __maybe_unused) {}
  60static inline void unwind__finish_access(struct maps *maps __maybe_unused) {}
  61#endif
  62#else
  63static inline int
  64unwind__get_entries(unwind_entry_cb_t cb __maybe_unused,
  65                    void *arg __maybe_unused,
  66                    struct thread *thread __maybe_unused,
  67                    struct perf_sample *data __maybe_unused,
  68                    int max_stack __maybe_unused)
  69{
  70        return 0;
  71}
  72
  73static inline int unwind__prepare_access(struct maps *maps __maybe_unused,
  74                                         struct map *map __maybe_unused,
  75                                         bool *initialized __maybe_unused)
  76{
  77        return 0;
  78}
  79
  80static inline void unwind__flush_access(struct maps *maps __maybe_unused) {}
  81static inline void unwind__finish_access(struct maps *maps __maybe_unused) {}
  82#endif /* HAVE_DWARF_UNWIND_SUPPORT */
  83#endif /* __UNWIND_H */
  84