123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428 |
- #ifndef BACKTRACE_INTERNAL_H
- #define BACKTRACE_INTERNAL_H
- #ifndef GCC_VERSION
- # define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
- #endif
- #if (GCC_VERSION < 2007)
- # define __attribute__(x)
- #endif
- #ifndef ATTRIBUTE_UNUSED
- # define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
- #endif
- #ifndef ATTRIBUTE_MALLOC
- # if (GCC_VERSION >= 2096)
- # define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
- # else
- # define ATTRIBUTE_MALLOC
- # endif
- #endif
- #ifdef __has_attribute
- # if __has_attribute(fallthrough)
- # define ATTRIBUTE_FALLTHROUGH __attribute__ ((fallthrough))
- # endif
- #endif
- #ifndef ATTRIBUTE_FALLTHROUGH
- # if (GCC_VERSION >= 7000)
- # define ATTRIBUTE_FALLTHROUGH __attribute__ ((__fallthrough__))
- # else
- # define ATTRIBUTE_FALLTHROUGH
- # endif
- #endif
- #ifndef HAVE_SYNC_FUNCTIONS
- #define __sync_bool_compare_and_swap(A, B, C) (abort(), 1)
- #define __sync_lock_test_and_set(A, B) (abort(), 0)
- #define __sync_lock_release(A) abort()
- #endif
- #ifdef HAVE_ATOMIC_FUNCTIONS
- #define backtrace_atomic_load_pointer(p) \
- __atomic_load_n ((p), __ATOMIC_ACQUIRE)
- #define backtrace_atomic_load_int(p) \
- __atomic_load_n ((p), __ATOMIC_ACQUIRE)
- #define backtrace_atomic_store_pointer(p, v) \
- __atomic_store_n ((p), (v), __ATOMIC_RELEASE)
- #define backtrace_atomic_store_size_t(p, v) \
- __atomic_store_n ((p), (v), __ATOMIC_RELEASE)
- #define backtrace_atomic_store_int(p, v) \
- __atomic_store_n ((p), (v), __ATOMIC_RELEASE)
- #else
- #ifdef HAVE_SYNC_FUNCTIONS
- extern void *backtrace_atomic_load_pointer (void *);
- extern int backtrace_atomic_load_int (int *);
- extern void backtrace_atomic_store_pointer (void *, void *);
- extern void backtrace_atomic_store_size_t (size_t *, size_t);
- extern void backtrace_atomic_store_int (int *, int);
- #else
- #define backtrace_atomic_load_pointer(p) (abort(), (void *) NULL)
- #define backtrace_atomic_load_int(p) (abort(), 0)
- #define backtrace_atomic_store_pointer(p, v) abort()
- #define backtrace_atomic_store_size_t(p, v) abort()
- #define backtrace_atomic_store_int(p, v) abort()
- #endif
- #endif
- typedef int (*fileline) (struct backtrace_state *state, uintptr_t pc,
- backtrace_full_callback callback,
- backtrace_error_callback error_callback, void *data);
- typedef void (*syminfo) (struct backtrace_state *state, uintptr_t pc,
- backtrace_syminfo_callback callback,
- backtrace_error_callback error_callback, void *data);
- struct backtrace_state
- {
-
- const char *filename;
-
- int threaded;
-
- void *lock;
-
- fileline fileline_fn;
-
- void *fileline_data;
-
- syminfo syminfo_fn;
-
- void *syminfo_data;
-
- int fileline_initialization_failed;
-
- int lock_alloc;
-
- struct backtrace_freelist_struct *freelist;
- };
- extern int backtrace_open (const char *filename,
- backtrace_error_callback error_callback,
- void *data,
- int *does_not_exist);
- struct backtrace_view
- {
-
- const void *data;
-
- void *base;
-
- size_t len;
- };
- extern 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);
- extern void backtrace_release_view (struct backtrace_state *state,
- struct backtrace_view *view,
- backtrace_error_callback error_callback,
- void *data);
- extern int backtrace_close (int descriptor,
- backtrace_error_callback error_callback,
- void *data);
- extern void backtrace_qsort (void *base, size_t count, size_t size,
- int (*compar) (const void *, const void *));
- extern void *backtrace_alloc (struct backtrace_state *state, size_t size,
- backtrace_error_callback error_callback,
- void *data) ATTRIBUTE_MALLOC;
- extern void backtrace_free (struct backtrace_state *state, void *mem,
- size_t size,
- backtrace_error_callback error_callback,
- void *data);
- struct backtrace_vector
- {
-
- void *base;
-
- size_t size;
-
- size_t alc;
- };
- extern void *backtrace_vector_grow (struct backtrace_state *state, size_t size,
- backtrace_error_callback error_callback,
- void *data,
- struct backtrace_vector *vec);
- extern void* backtrace_vector_finish (struct backtrace_state *state,
- struct backtrace_vector *vec,
- backtrace_error_callback error_callback,
- void *data);
- extern int backtrace_vector_release (struct backtrace_state *state,
- struct backtrace_vector *vec,
- backtrace_error_callback error_callback,
- void *data);
- static inline void
- backtrace_vector_free (struct backtrace_state *state,
- struct backtrace_vector *vec,
- backtrace_error_callback error_callback, void *data)
- {
- vec->alc += vec->size;
- vec->size = 0;
- backtrace_vector_release (state, vec, error_callback, data);
- }
- extern int backtrace_initialize (struct backtrace_state *state,
- const char *filename,
- int descriptor,
- backtrace_error_callback error_callback,
- void *data,
- fileline *fileline_fn);
- enum dwarf_section
- {
- DEBUG_INFO,
- DEBUG_LINE,
- DEBUG_ABBREV,
- DEBUG_RANGES,
- DEBUG_STR,
- DEBUG_ADDR,
- DEBUG_STR_OFFSETS,
- DEBUG_LINE_STR,
- DEBUG_RNGLISTS,
- DEBUG_MAX
- };
- struct dwarf_sections
- {
- const unsigned char *data[DEBUG_MAX];
- size_t size[DEBUG_MAX];
- };
- struct dwarf_data;
- #if defined(__FDPIC__) && defined(HAVE_DL_ITERATE_PHDR) && (defined(HAVE_LINK_H) || defined(HAVE_SYS_LINK_H))
- #ifdef HAVE_LINK_H
- #include <link.h>
- #endif
- #ifdef HAVE_SYS_LINK_H
- #error #include <sys/link.h>
- #endif
- #define libbacktrace_using_fdpic() (1)
- struct libbacktrace_base_address
- {
- struct elf32_fdpic_loadaddr m;
- };
- #define libbacktrace_add_base(pc, base) \
- ((uintptr_t) (__RELOC_POINTER ((pc), (base).m)))
- #else
- #define libbacktrace_using_fdpic() (0)
- struct libbacktrace_base_address
- {
- uintptr_t m;
- };
- #define libbacktrace_add_base(pc, base) ((pc) + (base).m)
- #endif
- extern 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);
- struct backtrace_call_full
- {
- backtrace_full_callback full_callback;
- backtrace_error_callback full_error_callback;
- void *full_data;
- int ret;
- };
- extern void backtrace_syminfo_to_full_callback (void *data, uintptr_t pc,
- const char *symname,
- uintptr_t symval,
- uintptr_t symsize);
- extern void backtrace_syminfo_to_full_error_callback (void *, const char *,
- int);
- extern 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);
- extern 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);
- extern 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);
- #endif
|