1 //===----------------------------- config.h -------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 // Defines macros used within libunwind project.
10 //===----------------------------------------------------------------------===//
13 #ifndef LIBUNWIND_CONFIG_H
14 #define LIBUNWIND_CONFIG_H
21 // Define static_assert() unless already defined by compiler.
23 #define __has_feature(__x) 0
25 #if !(__has_feature(cxx_static_assert)) && !defined(static_assert)
26 #define static_assert(__b, __m) \
27 extern int compile_time_assert_failed[ ( __b ) ? 1 : -1 ] \
28 __attribute__( ( unused ) );
31 // Platform specific configuration defines.
34 #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND
36 #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND
37 #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 1
41 #define _LIBUNWIND_SUPPORT_SEH_UNWIND 1
43 #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 1
46 #if defined(__ARM_DWARF_EH__) || !defined(__arm__)
47 #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 1
48 #define _LIBUNWIND_SUPPORT_DWARF_INDEX 1
52 #if defined(_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS)
53 #define _LIBUNWIND_EXPORT
54 #define _LIBUNWIND_HIDDEN
56 #if !defined(__ELF__) && !defined(__MACH__)
57 #define _LIBUNWIND_EXPORT __declspec(dllexport)
58 #define _LIBUNWIND_HIDDEN
60 #define _LIBUNWIND_EXPORT __attribute__((visibility("default")))
61 #define _LIBUNWIND_HIDDEN __attribute__((visibility("hidden")))
66 #define XSTR(a) STR(a)
67 #define SYMBOL_NAME(name) XSTR(__USER_LABEL_PREFIX__) #name
69 #if defined(__APPLE__)
70 #define _LIBUNWIND_WEAK_ALIAS(name, aliasname) \
71 __asm__(".globl " SYMBOL_NAME(aliasname)); \
72 __asm__(SYMBOL_NAME(aliasname) " = " SYMBOL_NAME(name)); \
73 extern "C" _LIBUNWIND_EXPORT __typeof(name) aliasname \
74 __attribute__((weak_import));
75 #elif defined(__ELF__)
76 #define _LIBUNWIND_WEAK_ALIAS(name, aliasname) \
77 extern "C" _LIBUNWIND_EXPORT __typeof(name) aliasname \
78 __attribute__((weak, alias(#name)));
80 #if defined(__MINGW32__)
81 #define _LIBUNWIND_WEAK_ALIAS(name, aliasname) \
82 extern "C" _LIBUNWIND_EXPORT __typeof(name) aliasname \
83 __attribute__((alias(#name)));
85 #define _LIBUNWIND_WEAK_ALIAS(name, aliasname) \
86 __pragma(comment(linker, "/alternatename:" SYMBOL_NAME(aliasname) "=" \
88 extern "C" _LIBUNWIND_EXPORT __typeof(name) aliasname;
91 #error Unsupported target
94 #if (defined(__APPLE__) && defined(__arm__)) || defined(__USING_SJLJ_EXCEPTIONS__)
95 #define _LIBUNWIND_BUILD_SJLJ_APIS
98 #if defined(__i386__) || defined(__x86_64__) || defined(__ppc__) || defined(__ppc64__) || defined(__powerpc64__)
99 #define _LIBUNWIND_SUPPORT_FRAME_APIS
102 #if defined(__i386__) || defined(__x86_64__) || \
103 defined(__ppc__) || defined(__ppc64__) || defined(__powerpc64__) || \
104 (!defined(__APPLE__) && defined(__arm__)) || \
105 (defined(__arm64__) || defined(__aarch64__)) || \
107 #if !defined(_LIBUNWIND_BUILD_SJLJ_APIS)
108 #define _LIBUNWIND_BUILD_ZERO_COST_APIS
112 #if defined(__powerpc64__) && defined(_ARCH_PWR8)
113 #define PPC64_HAS_VMX
116 #if defined(NDEBUG) && defined(_LIBUNWIND_IS_BAREMETAL)
117 #define _LIBUNWIND_ABORT(msg) \
122 #define _LIBUNWIND_ABORT(msg) \
124 fprintf(stderr, "libunwind: %s %s:%d - %s\n", __func__, __FILE__, \
131 #if defined(NDEBUG) && defined(_LIBUNWIND_IS_BAREMETAL)
132 #define _LIBUNWIND_LOG0(msg)
133 #define _LIBUNWIND_LOG(msg, ...)
135 #define _LIBUNWIND_LOG0(msg) \
136 fprintf(stderr, "libunwind: " msg "\n")
137 #define _LIBUNWIND_LOG(msg, ...) \
138 fprintf(stderr, "libunwind: " msg "\n", __VA_ARGS__)
142 #define _LIBUNWIND_LOG_IF_FALSE(x) x
144 #define _LIBUNWIND_LOG_IF_FALSE(x) \
148 _LIBUNWIND_LOG("" #x " failed in %s", __FUNCTION__); \
152 // Macros that define away in non-Debug builds
154 #define _LIBUNWIND_DEBUG_LOG(msg, ...)
155 #define _LIBUNWIND_TRACE_API(msg, ...)
156 #define _LIBUNWIND_TRACING_UNWINDING (0)
157 #define _LIBUNWIND_TRACING_DWARF (0)
158 #define _LIBUNWIND_TRACE_UNWINDING(msg, ...)
159 #define _LIBUNWIND_TRACE_DWARF(...)
164 extern bool logAPIs();
165 extern bool logUnwinding();
166 extern bool logDWARF();
170 #define _LIBUNWIND_DEBUG_LOG(msg, ...) _LIBUNWIND_LOG(msg, __VA_ARGS__)
171 #define _LIBUNWIND_TRACE_API(msg, ...) \
174 _LIBUNWIND_LOG(msg, __VA_ARGS__); \
176 #define _LIBUNWIND_TRACING_UNWINDING logUnwinding()
177 #define _LIBUNWIND_TRACING_DWARF logDWARF()
178 #define _LIBUNWIND_TRACE_UNWINDING(msg, ...) \
180 if (logUnwinding()) \
181 _LIBUNWIND_LOG(msg, __VA_ARGS__); \
183 #define _LIBUNWIND_TRACE_DWARF(...) \
186 fprintf(stderr, __VA_ARGS__); \
191 // Used to fit UnwindCursor and Registers_xxx types against unw_context_t /
192 // unw_cursor_t sized memory blocks.
193 #if defined(_LIBUNWIND_IS_NATIVE_ONLY)
198 template <typename _Type
, typename _Mem
>
200 template <typename T
>
202 static const size_t count
=
203 (sizeof(T
) + sizeof(uint64_t) - 1) / sizeof(uint64_t);
205 static const bool does_fit
=
206 (blk_count
<_Type
>::count COMP_OP blk_count
<_Mem
>::count
);
209 #endif // __cplusplus
211 #endif // LIBUNWIND_CONFIG_H