xref: /openbsd/gnu/llvm/libunwind/src/config.h (revision f6c50668)
1*f6c50668Spatrick //===----------------------------- config.h -------------------------------===//
2*f6c50668Spatrick //
3*f6c50668Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*f6c50668Spatrick // See https://llvm.org/LICENSE.txt for license information.
5*f6c50668Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*f6c50668Spatrick //
7*f6c50668Spatrick //
8*f6c50668Spatrick //  Defines macros used within libunwind project.
9*f6c50668Spatrick //
10*f6c50668Spatrick //===----------------------------------------------------------------------===//
11*f6c50668Spatrick 
12*f6c50668Spatrick 
13*f6c50668Spatrick #ifndef LIBUNWIND_CONFIG_H
14*f6c50668Spatrick #define LIBUNWIND_CONFIG_H
15*f6c50668Spatrick 
16*f6c50668Spatrick #include <assert.h>
17*f6c50668Spatrick #include <stdio.h>
18*f6c50668Spatrick #include <stdint.h>
19*f6c50668Spatrick #include <stdlib.h>
20*f6c50668Spatrick 
21*f6c50668Spatrick // Define static_assert() unless already defined by compiler.
22*f6c50668Spatrick #ifndef __has_feature
23*f6c50668Spatrick   #define __has_feature(__x) 0
24*f6c50668Spatrick #endif
25*f6c50668Spatrick #if !(__has_feature(cxx_static_assert)) && !defined(static_assert)
26*f6c50668Spatrick   #define static_assert(__b, __m) \
27*f6c50668Spatrick       extern int compile_time_assert_failed[ ( __b ) ? 1 : -1 ]  \
28*f6c50668Spatrick                                                   __attribute__( ( unused ) );
29*f6c50668Spatrick #endif
30*f6c50668Spatrick 
31*f6c50668Spatrick // Platform specific configuration defines.
32*f6c50668Spatrick #ifdef __APPLE__
33*f6c50668Spatrick   #if defined(FOR_DYLD)
34*f6c50668Spatrick     #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND
35*f6c50668Spatrick   #else
36*f6c50668Spatrick     #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND
37*f6c50668Spatrick     #define _LIBUNWIND_SUPPORT_DWARF_UNWIND   1
38*f6c50668Spatrick   #endif
39*f6c50668Spatrick #elif defined(_WIN32)
40*f6c50668Spatrick   #ifdef __SEH__
41*f6c50668Spatrick     #define _LIBUNWIND_SUPPORT_SEH_UNWIND 1
42*f6c50668Spatrick   #else
43*f6c50668Spatrick     #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 1
44*f6c50668Spatrick   #endif
45*f6c50668Spatrick #else
46*f6c50668Spatrick   #if defined(__ARM_DWARF_EH__) || !defined(__arm__)
47*f6c50668Spatrick     #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 1
48*f6c50668Spatrick     #define _LIBUNWIND_SUPPORT_DWARF_INDEX 1
49*f6c50668Spatrick   #endif
50*f6c50668Spatrick #endif
51*f6c50668Spatrick 
52*f6c50668Spatrick #if defined(_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS)
53*f6c50668Spatrick   #define _LIBUNWIND_EXPORT
54*f6c50668Spatrick   #define _LIBUNWIND_HIDDEN
55*f6c50668Spatrick #else
56*f6c50668Spatrick   #if !defined(__ELF__) && !defined(__MACH__)
57*f6c50668Spatrick     #define _LIBUNWIND_EXPORT __declspec(dllexport)
58*f6c50668Spatrick     #define _LIBUNWIND_HIDDEN
59*f6c50668Spatrick   #else
60*f6c50668Spatrick     #define _LIBUNWIND_EXPORT __attribute__((visibility("default")))
61*f6c50668Spatrick     #define _LIBUNWIND_HIDDEN __attribute__((visibility("hidden")))
62*f6c50668Spatrick   #endif
63*f6c50668Spatrick #endif
64*f6c50668Spatrick 
65*f6c50668Spatrick #define STR(a) #a
66*f6c50668Spatrick #define XSTR(a) STR(a)
67*f6c50668Spatrick #define SYMBOL_NAME(name) XSTR(__USER_LABEL_PREFIX__) #name
68*f6c50668Spatrick 
69*f6c50668Spatrick #if defined(__APPLE__)
70*f6c50668Spatrick #define _LIBUNWIND_WEAK_ALIAS(name, aliasname)                                 \
71*f6c50668Spatrick   __asm__(".globl " SYMBOL_NAME(aliasname));                                   \
72*f6c50668Spatrick   __asm__(SYMBOL_NAME(aliasname) " = " SYMBOL_NAME(name));                     \
73*f6c50668Spatrick   extern "C" _LIBUNWIND_EXPORT __typeof(name) aliasname                        \
74*f6c50668Spatrick       __attribute__((weak_import));
75*f6c50668Spatrick #elif defined(__ELF__)
76*f6c50668Spatrick #define _LIBUNWIND_WEAK_ALIAS(name, aliasname)                                 \
77*f6c50668Spatrick   extern "C" _LIBUNWIND_EXPORT __typeof(name) aliasname                        \
78*f6c50668Spatrick       __attribute__((weak, alias(#name)));
79*f6c50668Spatrick #elif defined(_WIN32)
80*f6c50668Spatrick #if defined(__MINGW32__)
81*f6c50668Spatrick #define _LIBUNWIND_WEAK_ALIAS(name, aliasname)                                 \
82*f6c50668Spatrick   extern "C" _LIBUNWIND_EXPORT __typeof(name) aliasname                        \
83*f6c50668Spatrick       __attribute__((alias(#name)));
84*f6c50668Spatrick #else
85*f6c50668Spatrick #define _LIBUNWIND_WEAK_ALIAS(name, aliasname)                                 \
86*f6c50668Spatrick   __pragma(comment(linker, "/alternatename:" SYMBOL_NAME(aliasname) "="        \
87*f6c50668Spatrick                                              SYMBOL_NAME(name)))               \
88*f6c50668Spatrick   extern "C" _LIBUNWIND_EXPORT __typeof(name) aliasname;
89*f6c50668Spatrick #endif
90*f6c50668Spatrick #else
91*f6c50668Spatrick #error Unsupported target
92*f6c50668Spatrick #endif
93*f6c50668Spatrick 
94*f6c50668Spatrick #if (defined(__APPLE__) && defined(__arm__)) || defined(__USING_SJLJ_EXCEPTIONS__)
95*f6c50668Spatrick #define _LIBUNWIND_BUILD_SJLJ_APIS
96*f6c50668Spatrick #endif
97*f6c50668Spatrick 
98*f6c50668Spatrick #if defined(__i386__) || defined(__x86_64__) || defined(__ppc__) || defined(__ppc64__) || defined(__powerpc64__)
99*f6c50668Spatrick #define _LIBUNWIND_SUPPORT_FRAME_APIS
100*f6c50668Spatrick #endif
101*f6c50668Spatrick 
102*f6c50668Spatrick #if defined(__i386__) || defined(__x86_64__) ||                                \
103*f6c50668Spatrick     defined(__ppc__) || defined(__ppc64__) || defined(__powerpc64__) ||        \
104*f6c50668Spatrick     (!defined(__APPLE__) && defined(__arm__)) ||                               \
105*f6c50668Spatrick     defined(__aarch64__) ||                                                    \
106*f6c50668Spatrick     defined(__mips__) ||                                                       \
107*f6c50668Spatrick     defined(__riscv) ||                                                        \
108*f6c50668Spatrick     defined(__hexagon__)
109*f6c50668Spatrick #if !defined(_LIBUNWIND_BUILD_SJLJ_APIS)
110*f6c50668Spatrick #define _LIBUNWIND_BUILD_ZERO_COST_APIS
111*f6c50668Spatrick #endif
112*f6c50668Spatrick #endif
113*f6c50668Spatrick 
114*f6c50668Spatrick #if defined(__powerpc64__) && defined(_ARCH_PWR8)
115*f6c50668Spatrick #define PPC64_HAS_VMX
116*f6c50668Spatrick #endif
117*f6c50668Spatrick 
118*f6c50668Spatrick #if defined(NDEBUG) && defined(_LIBUNWIND_IS_BAREMETAL)
119*f6c50668Spatrick #define _LIBUNWIND_ABORT(msg)                                                  \
120*f6c50668Spatrick   do {                                                                         \
121*f6c50668Spatrick     abort();                                                                   \
122*f6c50668Spatrick   } while (0)
123*f6c50668Spatrick #else
124*f6c50668Spatrick #define _LIBUNWIND_ABORT(msg)                                                  \
125*f6c50668Spatrick   do {                                                                         \
126*f6c50668Spatrick     fprintf(stderr, "libunwind: %s - %s\n", __func__, msg);                    \
127*f6c50668Spatrick     fflush(stderr);                                                            \
128*f6c50668Spatrick     abort();                                                                   \
129*f6c50668Spatrick   } while (0)
130*f6c50668Spatrick #endif
131*f6c50668Spatrick 
132*f6c50668Spatrick #if defined(NDEBUG) && defined(_LIBUNWIND_IS_BAREMETAL)
133*f6c50668Spatrick #define _LIBUNWIND_LOG0(msg)
134*f6c50668Spatrick #define _LIBUNWIND_LOG(msg, ...)
135*f6c50668Spatrick #else
136*f6c50668Spatrick #define _LIBUNWIND_LOG0(msg)                                               \
137*f6c50668Spatrick   fprintf(stderr, "libunwind: " msg "\n")
138*f6c50668Spatrick #define _LIBUNWIND_LOG(msg, ...)                                               \
139*f6c50668Spatrick   fprintf(stderr, "libunwind: " msg "\n", __VA_ARGS__)
140*f6c50668Spatrick #endif
141*f6c50668Spatrick 
142*f6c50668Spatrick #if defined(NDEBUG)
143*f6c50668Spatrick   #define _LIBUNWIND_LOG_IF_FALSE(x) x
144*f6c50668Spatrick #else
145*f6c50668Spatrick   #define _LIBUNWIND_LOG_IF_FALSE(x)                                           \
146*f6c50668Spatrick     do {                                                                       \
147*f6c50668Spatrick       bool _ret = x;                                                           \
148*f6c50668Spatrick       if (!_ret)                                                               \
149*f6c50668Spatrick         _LIBUNWIND_LOG("" #x " failed in %s", __FUNCTION__);                   \
150*f6c50668Spatrick     } while (0)
151*f6c50668Spatrick #endif
152*f6c50668Spatrick 
153*f6c50668Spatrick // Macros that define away in non-Debug builds
154*f6c50668Spatrick #ifdef NDEBUG
155*f6c50668Spatrick   #define _LIBUNWIND_DEBUG_LOG(msg, ...)
156*f6c50668Spatrick   #define _LIBUNWIND_TRACE_API(msg, ...)
157*f6c50668Spatrick   #define _LIBUNWIND_TRACING_UNWINDING (0)
158*f6c50668Spatrick   #define _LIBUNWIND_TRACING_DWARF (0)
159*f6c50668Spatrick   #define _LIBUNWIND_TRACE_UNWINDING(msg, ...)
160*f6c50668Spatrick   #define _LIBUNWIND_TRACE_DWARF(...)
161*f6c50668Spatrick #else
162*f6c50668Spatrick   #ifdef __cplusplus
163*f6c50668Spatrick     extern "C" {
164*f6c50668Spatrick   #endif
165*f6c50668Spatrick     extern  bool logAPIs();
166*f6c50668Spatrick     extern  bool logUnwinding();
167*f6c50668Spatrick     extern  bool logDWARF();
168*f6c50668Spatrick   #ifdef __cplusplus
169*f6c50668Spatrick     }
170*f6c50668Spatrick   #endif
171*f6c50668Spatrick   #define _LIBUNWIND_DEBUG_LOG(msg, ...)  _LIBUNWIND_LOG(msg, __VA_ARGS__)
172*f6c50668Spatrick   #define _LIBUNWIND_TRACE_API(msg, ...)                                       \
173*f6c50668Spatrick     do {                                                                       \
174*f6c50668Spatrick       if (logAPIs())                                                           \
175*f6c50668Spatrick         _LIBUNWIND_LOG(msg, __VA_ARGS__);                                      \
176*f6c50668Spatrick     } while (0)
177*f6c50668Spatrick   #define _LIBUNWIND_TRACING_UNWINDING logUnwinding()
178*f6c50668Spatrick   #define _LIBUNWIND_TRACING_DWARF logDWARF()
179*f6c50668Spatrick   #define _LIBUNWIND_TRACE_UNWINDING(msg, ...)                                 \
180*f6c50668Spatrick     do {                                                                       \
181*f6c50668Spatrick       if (logUnwinding())                                                      \
182*f6c50668Spatrick         _LIBUNWIND_LOG(msg, __VA_ARGS__);                                      \
183*f6c50668Spatrick     } while (0)
184*f6c50668Spatrick   #define _LIBUNWIND_TRACE_DWARF(...)                                          \
185*f6c50668Spatrick     do {                                                                       \
186*f6c50668Spatrick       if (logDWARF())                                                          \
187*f6c50668Spatrick         fprintf(stderr, __VA_ARGS__);                                          \
188*f6c50668Spatrick     } while (0)
189*f6c50668Spatrick #endif
190*f6c50668Spatrick 
191*f6c50668Spatrick #ifdef __cplusplus
192*f6c50668Spatrick // Used to fit UnwindCursor and Registers_xxx types against unw_context_t /
193*f6c50668Spatrick // unw_cursor_t sized memory blocks.
194*f6c50668Spatrick #if defined(_LIBUNWIND_IS_NATIVE_ONLY)
195*f6c50668Spatrick # define COMP_OP ==
196*f6c50668Spatrick #else
197*f6c50668Spatrick # define COMP_OP <=
198*f6c50668Spatrick #endif
199*f6c50668Spatrick template <typename _Type, typename _Mem>
200*f6c50668Spatrick struct check_fit {
201*f6c50668Spatrick   template <typename T>
202*f6c50668Spatrick   struct blk_count {
203*f6c50668Spatrick     static const size_t count =
204*f6c50668Spatrick       (sizeof(T) + sizeof(uint64_t) - 1) / sizeof(uint64_t);
205*f6c50668Spatrick   };
206*f6c50668Spatrick   static const bool does_fit =
207*f6c50668Spatrick     (blk_count<_Type>::count COMP_OP blk_count<_Mem>::count);
208*f6c50668Spatrick };
209*f6c50668Spatrick #undef COMP_OP
210*f6c50668Spatrick #endif // __cplusplus
211*f6c50668Spatrick 
212*f6c50668Spatrick #endif // LIBUNWIND_CONFIG_H
213