config.h revision e45805f0d3f8dafef1297cc7dc49e610713f023b
1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------- config.h -------------------------------===// 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 5bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Defines macros used within libuwind project. 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#ifndef LIBUNWIND_CONFIG_H 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#define LIBUNWIND_CONFIG_H 16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <assert.h> 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <stdio.h> 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Define static_assert() unless already defined by compiler. 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#ifndef __has_feature 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define __has_feature(__x) 0 23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#endif 24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#if !(__has_feature(cxx_static_assert)) && !defined(static_assert) 25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define static_assert(__b, __m) \ 26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant extern int compile_time_assert_failed[ ( __b ) ? 1 : -1 ] \ 27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __attribute__( ( unused ) ); 28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#endif 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Platform specific configuration defines. 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#if __APPLE__ 32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #include <Availability.h> 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #ifdef __cplusplus 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant extern "C" { 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #endif 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant void __assert_rtn(const char *, const char *, int, const char *) 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant __attribute__((noreturn)); 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #ifdef __cplusplus 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #endif 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_BUILD_ZERO_COST_APIS (__i386__ || __x86_64__ || __arm64__) 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_BUILD_SJLJ_APIS (__arm__) 44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_FRAME_APIS (__i386__ || __x86_64__) 45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_EXPORT __attribute__((visibility("default"))) 46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_HIDDEN __attribute__((visibility("hidden"))) 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_LOG(msg, ...) fprintf(stderr, "libunwind: " msg, __VA_ARGS__) 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_ABORT(msg) __assert_rtn(__func__, __FILE__, __LINE__, msg) 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #if FOR_DYLD 51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 1 52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 0 53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_DWARF_INDEX 0 54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #else 55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 1 56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 1 57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_DWARF_INDEX 0 58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #endif 59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#elif defined(__BIONIC__) 61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_BUILD_ZERO_COST_APIS (__i386__ || __x86_64__ || __arm64__ || __arm__) 62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_BUILD_SJLJ_APIS 0 63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_FRAME_APIS (__i386__ || __x86_64__) 64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_EXPORT __attribute__((visibility("default"))) 65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_HIDDEN __attribute__((visibility("hidden"))) 66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_LOG(msg, ...) fprintf(stderr, "libunwind: " msg, __VA_ARGS__) 67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_ABORT(msg) __assert2(__FILE__, __LINE__, __func__, msg) 68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 1 70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 1 71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_DWARF_INDEX 0 72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#elif defined(__GLIBC__) 73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_BUILD_ZERO_COST_APIS (__i386__ || __x86_64__ || __arm64__ || __arm__) 74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_BUILD_SJLJ_APIS 0 75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_FRAME_APIS (__i386__ || __x86_64__) 76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_EXPORT __attribute__((visibility("default"))) 77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_HIDDEN __attribute__((visibility("hidden"))) 78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_LOG(msg, ...) fprintf(stderr, "libunwind: " msg, __VA_ARGS__) 79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#ifndef NDEBUG 80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_ABORT(msg) __assert_fail(msg, __FILE__, __LINE__, __func__) 81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#else 82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_ABORT(msg) abort() 83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#endif 84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 1 86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 1 87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_DWARF_INDEX 0 88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#else 89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #include <stdlib.h> 90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static inline void assert_rtn(const char* func, const char* file, int line, const char* msg) __attribute__ ((noreturn)); 92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant static inline void assert_rtn(const char* func, const char* file, int line, const char* msg) { 93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant fprintf(stderr, "libunwind: %s %s:%d - %s\n", func, file, line, msg); 94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(false); 95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant abort(); 96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_BUILD_ZERO_COST_APIS (__i386__ || __x86_64__ || __arm64__ || __arm__) 99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_BUILD_SJLJ_APIS 0 100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_FRAME_APIS (__i386__ || __x86_64__) 101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_EXPORT __attribute__((visibility("default"))) 102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_HIDDEN __attribute__((visibility("hidden"))) 103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_LOG(msg, ...) fprintf(stderr, "libuwind: " msg, __VA_ARGS__) 104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_ABORT(msg) assert_rtn(__func__, __FILE__, __LINE__, msg) 105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 0 107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 0 108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_SUPPORT_DWARF_INDEX 0 109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#endif 110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// Macros that define away in non-Debug builds 113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#ifdef NDEBUG 114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_DEBUG_LOG(msg, ...) 115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_TRACE_API(msg, ...) 116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_TRACING_UNWINDING 0 117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_TRACE_UNWINDING(msg, ...) 118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_LOG_NON_ZERO(x) x 119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#else 120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #ifdef __cplusplus 121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant extern "C" { 122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #endif 123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant extern bool logAPIs(); 124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant extern bool logUnwinding(); 125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #ifdef __cplusplus 126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #endif 128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_DEBUG_LOG(msg, ...) _LIBUNWIND_LOG(msg, __VA_ARGS__) 129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_LOG_NON_ZERO(x) \ 130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant do { \ 131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant int _err = x; \ 132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if ( _err != 0 ) \ 133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant _LIBUNWIND_LOG("" #x "=%d in %s", _err, __FUNCTION__); \ 134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } while (0) 135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_TRACE_API(msg, ...) \ 136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant do { \ 137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if ( logAPIs() ) _LIBUNWIND_LOG(msg, __VA_ARGS__); \ 138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } while(0) 139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_TRACE_UNWINDING(msg, ...) \ 140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant do { \ 141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant if ( logUnwinding() ) _LIBUNWIND_LOG(msg, __VA_ARGS__); \ 142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } while(0) 143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant #define _LIBUNWIND_TRACING_UNWINDING logUnwinding() 144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#endif 145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#endif // LIBUNWIND_CONFIG_H 148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant