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