config.h revision 345068
1//===----------------------------- config.h -------------------------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//
9//  Defines macros used within libunwind project.
10//
11//===----------------------------------------------------------------------===//
12
13
14#ifndef LIBUNWIND_CONFIG_H
15#define LIBUNWIND_CONFIG_H
16
17#include <assert.h>
18#include <stdio.h>
19#include <stdint.h>
20#include <stdlib.h>
21
22// Define static_assert() unless already defined by compiler.
23#ifndef __has_feature
24  #define __has_feature(__x) 0
25#endif
26#if !(__has_feature(cxx_static_assert)) && !defined(static_assert)
27  #define static_assert(__b, __m) \
28      extern int compile_time_assert_failed[ ( __b ) ? 1 : -1 ]  \
29                                                  __attribute__( ( unused ) );
30#endif
31
32// Platform specific configuration defines.
33#ifdef __APPLE__
34  #if defined(FOR_DYLD)
35    #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND
36  #else
37    #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND
38    #define _LIBUNWIND_SUPPORT_DWARF_UNWIND   1
39  #endif
40#elif defined(_WIN32)
41  #ifdef __SEH__
42    #define _LIBUNWIND_SUPPORT_SEH_UNWIND 1
43  #else
44    #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 1
45  #endif
46#else
47  #if defined(__ARM_DWARF_EH__) || !defined(__arm__)
48    #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 1
49    #define _LIBUNWIND_SUPPORT_DWARF_INDEX 1
50  #endif
51#endif
52
53#if defined(_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS)
54  #define _LIBUNWIND_EXPORT
55  #define _LIBUNWIND_HIDDEN
56#else
57  #if !defined(__ELF__) && !defined(__MACH__)
58    #define _LIBUNWIND_EXPORT __declspec(dllexport)
59    #define _LIBUNWIND_HIDDEN
60  #else
61    #define _LIBUNWIND_EXPORT __attribute__((visibility("default")))
62    #define _LIBUNWIND_HIDDEN __attribute__((visibility("hidden")))
63  #endif
64#endif
65
66#if (defined(__APPLE__) && defined(__arm__)) || defined(__USING_SJLJ_EXCEPTIONS__)
67#define _LIBUNWIND_BUILD_SJLJ_APIS
68#endif
69
70#if defined(__i386__) || defined(__x86_64__) || defined(__ppc__) || defined(__ppc64__) || defined(__powerpc64__)
71#define _LIBUNWIND_SUPPORT_FRAME_APIS
72#endif
73
74#if defined(__i386__) || defined(__x86_64__) ||                                \
75    defined(__ppc__) || defined(__ppc64__) || defined(__powerpc64__) ||        \
76    (!defined(__APPLE__) && defined(__arm__)) ||                               \
77    (defined(__arm64__) || defined(__aarch64__)) ||                            \
78    defined(__mips__) ||                                                       \
79    defined(__riscv)
80#if !defined(_LIBUNWIND_BUILD_SJLJ_APIS)
81#define _LIBUNWIND_BUILD_ZERO_COST_APIS
82#endif
83#endif
84
85#if defined(__powerpc64__) && defined(_ARCH_PWR8)
86#define PPC64_HAS_VMX
87#endif
88
89#if defined(NDEBUG) && defined(_LIBUNWIND_IS_BAREMETAL)
90#define _LIBUNWIND_ABORT(msg)                                                  \
91  do {                                                                         \
92    abort();                                                                   \
93  } while (0)
94#else
95#define _LIBUNWIND_ABORT(msg)                                                  \
96  do {                                                                         \
97    fprintf(stderr, "libunwind: %s %s:%d - %s\n", __func__, __FILE__,          \
98            __LINE__, msg);                                                    \
99    fflush(stderr);                                                            \
100    abort();                                                                   \
101  } while (0)
102#endif
103
104#if defined(NDEBUG) && defined(_LIBUNWIND_IS_BAREMETAL)
105#define _LIBUNWIND_LOG0(msg)
106#define _LIBUNWIND_LOG(msg, ...)
107#else
108#define _LIBUNWIND_LOG0(msg)                                               \
109  fprintf(stderr, "libunwind: " msg "\n")
110#define _LIBUNWIND_LOG(msg, ...)                                               \
111  fprintf(stderr, "libunwind: " msg "\n", __VA_ARGS__)
112#endif
113
114#if defined(NDEBUG)
115  #define _LIBUNWIND_LOG_IF_FALSE(x) x
116#else
117  #define _LIBUNWIND_LOG_IF_FALSE(x)                                           \
118    do {                                                                       \
119      bool _ret = x;                                                           \
120      if (!_ret)                                                               \
121        _LIBUNWIND_LOG("" #x " failed in %s", __FUNCTION__);                   \
122    } while (0)
123#endif
124
125// Macros that define away in non-Debug builds
126#ifdef NDEBUG
127  #define _LIBUNWIND_DEBUG_LOG(msg, ...)
128  #define _LIBUNWIND_TRACE_API(msg, ...)
129  #define _LIBUNWIND_TRACING_UNWINDING (0)
130  #define _LIBUNWIND_TRACING_DWARF (0)
131  #define _LIBUNWIND_TRACE_UNWINDING(msg, ...)
132  #define _LIBUNWIND_TRACE_DWARF(...)
133#else
134  #ifdef __cplusplus
135    extern "C" {
136  #endif
137    extern  bool logAPIs();
138    extern  bool logUnwinding();
139    extern  bool logDWARF();
140  #ifdef __cplusplus
141    }
142  #endif
143  #define _LIBUNWIND_DEBUG_LOG(msg, ...)  _LIBUNWIND_LOG(msg, __VA_ARGS__)
144  #define _LIBUNWIND_TRACE_API(msg, ...)                                       \
145    do {                                                                       \
146      if (logAPIs())                                                           \
147        _LIBUNWIND_LOG(msg, __VA_ARGS__);                                      \
148    } while (0)
149  #define _LIBUNWIND_TRACING_UNWINDING logUnwinding()
150  #define _LIBUNWIND_TRACING_DWARF logDWARF()
151  #define _LIBUNWIND_TRACE_UNWINDING(msg, ...)                                 \
152    do {                                                                       \
153      if (logUnwinding())                                                      \
154        _LIBUNWIND_LOG(msg, __VA_ARGS__);                                      \
155    } while (0)
156  #define _LIBUNWIND_TRACE_DWARF(...)                                          \
157    do {                                                                       \
158      if (logDWARF())                                                          \
159        fprintf(stderr, __VA_ARGS__);                                          \
160    } while (0)
161#endif
162
163#ifdef __cplusplus
164// Used to fit UnwindCursor and Registers_xxx types against unw_context_t /
165// unw_cursor_t sized memory blocks.
166#if defined(_LIBUNWIND_IS_NATIVE_ONLY)
167# define COMP_OP ==
168#else
169# define COMP_OP <=
170#endif
171template <typename _Type, typename _Mem>
172struct check_fit {
173  template <typename T>
174  struct blk_count {
175    static const size_t count =
176      (sizeof(T) + sizeof(uint64_t) - 1) / sizeof(uint64_t);
177  };
178  static const bool does_fit =
179    (blk_count<_Type>::count COMP_OP blk_count<_Mem>::count);
180};
181#undef COMP_OP
182#endif // __cplusplus
183
184#endif // LIBUNWIND_CONFIG_H
185