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 libuwind 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 20// Define static_assert() unless already defined by compiler. 21#ifndef __has_feature 22 #define __has_feature(__x) 0 23#endif 24#if !(__has_feature(cxx_static_assert)) && !defined(static_assert) 25 #define static_assert(__b, __m) \ 26 extern int compile_time_assert_failed[ ( __b ) ? 1 : -1 ] \ 27 __attribute__( ( unused ) ); 28#endif 29 30// Platform specific configuration defines. 31#if __APPLE__ 32 #include <Availability.h> 33 #ifdef __cplusplus 34 extern "C" { 35 #endif 36 void __assert_rtn(const char *, const char *, int, const char *) 37 __attribute__((noreturn)); 38 #ifdef __cplusplus 39 } 40 #endif 41 42 #define _LIBUNWIND_BUILD_ZERO_COST_APIS (__i386__ || __x86_64__ || __arm64__) 43 #define _LIBUNWIND_BUILD_SJLJ_APIS (__arm__) 44 #define _LIBUNWIND_SUPPORT_FRAME_APIS (__i386__ || __x86_64__) 45 #define _LIBUNWIND_EXPORT __attribute__((visibility("default"))) 46 #define _LIBUNWIND_HIDDEN __attribute__((visibility("hidden"))) 47 #define _LIBUNWIND_LOG(msg, ...) fprintf(stderr, "libunwind: " msg, __VA_ARGS__) 48 #define _LIBUNWIND_ABORT(msg) __assert_rtn(__func__, __FILE__, __LINE__, msg) 49 50 #if FOR_DYLD 51 #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 1 52 #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 0 53 #define _LIBUNWIND_SUPPORT_DWARF_INDEX 0 54 #else 55 #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 1 56 #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 1 57 #define _LIBUNWIND_SUPPORT_DWARF_INDEX 0 58 #endif 59 60#else 61 #include <stdlib.h> 62 63 static inline void assert_rtn(const char* func, const char* file, int line, const char* msg) __attribute__ ((noreturn)); 64 static inline void assert_rtn(const char* func, const char* file, int line, const char* msg) { 65 fprintf(stderr, "libunwind: %s %s:%d - %s\n", func, file, line, msg); 66 assert(false); 67 abort(); 68 } 69 70 #define _LIBUNWIND_BUILD_ZERO_COST_APIS (__i386__ || __x86_64__ || __arm64__ || __arm__) 71 #define _LIBUNWIND_BUILD_SJLJ_APIS 0 72 #define _LIBUNWIND_SUPPORT_FRAME_APIS (__i386__ || __x86_64__) 73 #define _LIBUNWIND_EXPORT __attribute__((visibility("default"))) 74 #define _LIBUNWIND_HIDDEN __attribute__((visibility("hidden"))) 75 #define _LIBUNWIND_LOG(msg, ...) fprintf(stderr, "libuwind: " msg, __VA_ARGS__) 76 #define _LIBUNWIND_ABORT(msg) assert_rtn(__func__, __FILE__, __LINE__, msg) 77 78 #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 0 79 #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 0 80 #define _LIBUNWIND_SUPPORT_DWARF_INDEX 0 81#endif 82 83 84// Macros that define away in non-Debug builds 85#ifdef NDEBUG 86 #define _LIBUNWIND_DEBUG_LOG(msg, ...) 87 #define _LIBUNWIND_TRACE_API(msg, ...) 88 #define _LIBUNWIND_TRACING_UNWINDING 0 89 #define _LIBUNWIND_TRACE_UNWINDING(msg, ...) 90 #define _LIBUNWIND_LOG_NON_ZERO(x) x 91#else 92 #ifdef __cplusplus 93 extern "C" { 94 #endif 95 extern bool logAPIs(); 96 extern bool logUnwinding(); 97 #ifdef __cplusplus 98 } 99 #endif 100 #define _LIBUNWIND_DEBUG_LOG(msg, ...) _LIBUNWIND_LOG(msg, __VA_ARGS__) 101 #define _LIBUNWIND_LOG_NON_ZERO(x) \ 102 do { \ 103 int _err = x; \ 104 if ( _err != 0 ) \ 105 _LIBUNWIND_LOG("" #x "=%d in %s", _err, __FUNCTION__); \ 106 } while (0) 107 #define _LIBUNWIND_TRACE_API(msg, ...) \ 108 do { \ 109 if ( logAPIs() ) _LIBUNWIND_LOG(msg, __VA_ARGS__); \ 110 } while(0) 111 #define _LIBUNWIND_TRACE_UNWINDING(msg, ...) \ 112 do { \ 113 if ( logUnwinding() ) _LIBUNWIND_LOG(msg, __VA_ARGS__); \ 114 } while(0) 115 #define _LIBUNWIND_TRACING_UNWINDING logUnwinding() 116#endif 117 118 119#endif // LIBUNWIND_CONFIG_H 120