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