forked from Minki/linux
eeb118c5d7
For local libunwind, it uses the fixed methods to convert register id according to the host platform, but in remote libunwind, this convert function should be the one for remote architecture. This patch changes the fixed name to macro and code for each remote platform can be compiled indivadually. Signed-off-by: He Kuang <hekuang@huawei.com> Acked-by: Jiri Olsa <jolsa@kernel.org> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Ekaterina Tumanova <tumanova@linux.vnet.ibm.com> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Kan Liang <kan.liang@intel.com> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Pekka Enberg <penberg@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Stephane Eranian <eranian@google.com> Cc: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com> Cc: Wang Nan <wangnan0@huawei.com> Link: http://lkml.kernel.org/r/1464924803-22214-12-git-send-email-hekuang@huawei.com Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
70 lines
2.0 KiB
C
70 lines
2.0 KiB
C
#ifndef __UNWIND_H
|
|
#define __UNWIND_H
|
|
|
|
#include <linux/types.h>
|
|
#include "event.h"
|
|
#include "symbol.h"
|
|
#include "thread.h"
|
|
|
|
struct unwind_entry {
|
|
struct map *map;
|
|
struct symbol *sym;
|
|
u64 ip;
|
|
};
|
|
|
|
typedef int (*unwind_entry_cb_t)(struct unwind_entry *entry, void *arg);
|
|
|
|
struct unwind_libunwind_ops {
|
|
int (*prepare_access)(struct thread *thread);
|
|
void (*flush_access)(struct thread *thread);
|
|
void (*finish_access)(struct thread *thread);
|
|
int (*get_entries)(unwind_entry_cb_t cb, void *arg,
|
|
struct thread *thread,
|
|
struct perf_sample *data, int max_stack);
|
|
};
|
|
|
|
#ifdef HAVE_DWARF_UNWIND_SUPPORT
|
|
int unwind__get_entries(unwind_entry_cb_t cb, void *arg,
|
|
struct thread *thread,
|
|
struct perf_sample *data, int max_stack);
|
|
/* libunwind specific */
|
|
#ifdef HAVE_LIBUNWIND_SUPPORT
|
|
#ifndef LIBUNWIND__ARCH_REG_ID
|
|
#define LIBUNWIND__ARCH_REG_ID(regnum) libunwind__arch_reg_id(regnum)
|
|
#endif
|
|
int LIBUNWIND__ARCH_REG_ID(int regnum);
|
|
int unwind__prepare_access(struct thread *thread, struct map *map);
|
|
void unwind__flush_access(struct thread *thread);
|
|
void unwind__finish_access(struct thread *thread);
|
|
#else
|
|
static inline int unwind__prepare_access(struct thread *thread __maybe_unused,
|
|
struct map *map __maybe_unused)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void unwind__flush_access(struct thread *thread __maybe_unused) {}
|
|
static inline void unwind__finish_access(struct thread *thread __maybe_unused) {}
|
|
#endif
|
|
#else
|
|
static inline int
|
|
unwind__get_entries(unwind_entry_cb_t cb __maybe_unused,
|
|
void *arg __maybe_unused,
|
|
struct thread *thread __maybe_unused,
|
|
struct perf_sample *data __maybe_unused,
|
|
int max_stack __maybe_unused)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int unwind__prepare_access(struct thread *thread __maybe_unused,
|
|
struct map *map __maybe_unused)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void unwind__flush_access(struct thread *thread __maybe_unused) {}
|
|
static inline void unwind__finish_access(struct thread *thread __maybe_unused) {}
|
|
#endif /* HAVE_DWARF_UNWIND_SUPPORT */
|
|
#endif /* __UNWIND_H */
|