33#ifndef BACKTRACE_INTERNAL_H
34#define BACKTRACE_INTERNAL_H
40# define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
43#if (GCC_VERSION < 2007)
44# define __attribute__(x)
47#ifndef ATTRIBUTE_UNUSED
48# define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
51#ifndef ATTRIBUTE_MALLOC
52# if (GCC_VERSION >= 2096)
53# define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
55# define ATTRIBUTE_MALLOC
60# if __has_attribute(fallthrough)
61# define ATTRIBUTE_FALLTHROUGH __attribute__ ((fallthrough))
64#ifndef ATTRIBUTE_FALLTHROUGH
65# if (GCC_VERSION >= 7000)
66# define ATTRIBUTE_FALLTHROUGH __attribute__ ((__fallthrough__))
68# define ATTRIBUTE_FALLTHROUGH
72#ifndef HAVE_SYNC_FUNCTIONS
77#define __sync_bool_compare_and_swap(A, B, C) (abort(), 1)
78#define __sync_lock_test_and_set(A, B) (abort(), 0)
79#define __sync_lock_release(A) abort()
83#ifdef HAVE_ATOMIC_FUNCTIONS
87#define backtrace_atomic_load_pointer(p) \
88 __atomic_load_n ((p), __ATOMIC_ACQUIRE)
89#define backtrace_atomic_load_int(p) \
90 __atomic_load_n ((p), __ATOMIC_ACQUIRE)
91#define backtrace_atomic_store_pointer(p, v) \
92 __atomic_store_n ((p), (v), __ATOMIC_RELEASE)
93#define backtrace_atomic_store_size_t(p, v) \
94 __atomic_store_n ((p), (v), __ATOMIC_RELEASE)
95#define backtrace_atomic_store_int(p, v) \
96 __atomic_store_n ((p), (v), __ATOMIC_RELEASE)
99#ifdef HAVE_SYNC_FUNCTIONS
115#define backtrace_atomic_load_pointer(p) (abort(), (void *) NULL)
116#define backtrace_atomic_load_int(p) (abort(), 0)
117#define backtrace_atomic_store_pointer(p, v) abort()
118#define backtrace_atomic_store_size_t(p, v) abort()
119#define backtrace_atomic_store_int(p, v) abort()
175 int *does_not_exist);
195 off_t offset, uint64_t size,
215 int (*compar) (
const void *,
const void *));
296 const char *filename,
333#if defined(__FDPIC__) && defined(HAVE_DL_ITERATE_PHDR) && (defined(HAVE_LINK_H) || defined(HAVE_SYS_LINK_H))
338#ifdef HAVE_SYS_LINK_H
339 #include <sys/link.h>
342#define libbacktrace_using_fdpic() (1)
346 struct elf32_fdpic_loadaddr
m;
349#define libbacktrace_add_base(pc, base) \
350 ((uintptr_t) (__RELOC_POINTER ((pc), (base).m)))
354#define libbacktrace_using_fdpic() (0)
361#define libbacktrace_add_base(pc, base) ((pc) + (base).m)
404 const unsigned char *compressed,
405 size_t compressed_size,
407 unsigned char **uncompressed,
408 size_t *uncompressed_size);
413 const unsigned char *compressed,
414 size_t compressed_size,
416 unsigned char *uncompressed,
417 size_t uncompressed_size);
422 const unsigned char *compressed,
423 size_t compressed_size,
425 unsigned char **uncompressed,
426 size_t *uncompressed_size);
void(* backtrace_syminfo_callback)(void *data, uintptr_t pc, const char *symname, uintptr_t symval, uintptr_t symsize)
void(* backtrace_error_callback)(void *data, const char *msg, int errnum)
int(* backtrace_full_callback)(void *data, uintptr_t pc, const char *filename, int lineno, const char *function)
static void error_callback(void *data, const char *msg, int errnum)
void backtrace_qsort(void *base, size_t count, size_t size, int(*compar)(const void *, const void *))
int backtrace_uncompress_lzma(struct backtrace_state *, const unsigned char *compressed, size_t compressed_size, backtrace_error_callback, void *data, unsigned char **uncompressed, size_t *uncompressed_size)
void backtrace_release_view(struct backtrace_state *state, struct backtrace_view *view, backtrace_error_callback error_callback, void *data)
backtrace_error_callback full_error_callback
#define backtrace_atomic_store_size_t(p, v)
int backtrace_dwarf_add(struct backtrace_state *state, struct libbacktrace_base_address base_address, const struct dwarf_sections *dwarf_sections, int is_bigendian, struct dwarf_data *fileline_altlink, backtrace_error_callback error_callback, void *data, fileline *fileline_fn, struct dwarf_data **fileline_entry)
void * backtrace_vector_grow(struct backtrace_state *state, size_t size, backtrace_error_callback error_callback, void *data, struct backtrace_vector *vec)
int backtrace_vector_release(struct backtrace_state *state, struct backtrace_vector *vec, backtrace_error_callback error_callback, void *data)
#define backtrace_atomic_load_pointer(p)
int(* fileline)(struct backtrace_state *state, uintptr_t pc, backtrace_full_callback callback, backtrace_error_callback error_callback, void *data)
void * backtrace_alloc(struct backtrace_state *state, size_t size, backtrace_error_callback error_callback, void *data) ATTRIBUTE_MALLOC
void(* syminfo)(struct backtrace_state *state, uintptr_t pc, backtrace_syminfo_callback callback, backtrace_error_callback error_callback, void *data)
int backtrace_uncompress_zstd(struct backtrace_state *, const unsigned char *compressed, size_t compressed_size, backtrace_error_callback, void *data, unsigned char *uncompressed, size_t uncompressed_size)
struct backtrace_freelist_struct * freelist
#define backtrace_atomic_load_int(p)
const unsigned char * data[DEBUG_MAX]
int fileline_initialization_failed
int backtrace_uncompress_zdebug(struct backtrace_state *, const unsigned char *compressed, size_t compressed_size, backtrace_error_callback, void *data, unsigned char **uncompressed, size_t *uncompressed_size)
int backtrace_close(int descriptor, backtrace_error_callback error_callback, void *data)
static void backtrace_vector_free(struct backtrace_state *state, struct backtrace_vector *vec, backtrace_error_callback error_callback, void *data)
void backtrace_free(struct backtrace_state *state, void *mem, size_t size, backtrace_error_callback error_callback, void *data)
#define backtrace_atomic_store_pointer(p, v)
backtrace_full_callback full_callback
int backtrace_get_view(struct backtrace_state *state, int descriptor, off_t offset, uint64_t size, backtrace_error_callback error_callback, void *data, struct backtrace_view *view)
void * backtrace_vector_finish(struct backtrace_state *state, struct backtrace_vector *vec, backtrace_error_callback error_callback, void *data)
#define backtrace_atomic_store_int(p, v)
int backtrace_open(const char *filename, backtrace_error_callback error_callback, void *data, int *does_not_exist)
void backtrace_syminfo_to_full_callback(void *data, uintptr_t pc, const char *symname, uintptr_t symval, uintptr_t symsize)
void backtrace_syminfo_to_full_error_callback(void *, const char *, int)
int backtrace_initialize(struct backtrace_state *state, const char *filename, int descriptor, backtrace_error_callback error_callback, void *data, fileline *fileline_fn)
const char * base(const char *p)