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> 18e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert#include <stdio.h> 19b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 20b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik// Define static_assert() unless already defined by compiler. 21b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#ifndef __has_feature 22b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define __has_feature(__x) 0 23b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#endif 248cb8b2086426108c6ea737d83cfd739ae5e5d8d9Nick Kledzik#if !(__has_feature(cxx_static_assert)) && !defined(static_assert) 25b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define static_assert(__b, __m) \ 26b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik extern int compile_time_assert_failed[ ( __b ) ? 1 : -1 ] \ 27b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik __attribute__( ( unused ) ); 28b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#endif 29b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 30b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik// Platform specific configuration defines. 310a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert#ifdef __APPLE__ 32b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #include <Availability.h> 33b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #ifdef __cplusplus 34b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik extern "C" { 35b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #endif 36b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik void __assert_rtn(const char *, const char *, int, const char *) 37b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik __attribute__((noreturn)); 38b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #ifdef __cplusplus 39b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik } 40b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #endif 41b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 420a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert #define _LIBUNWIND_BUILD_ZERO_COST_APIS (defined(__i386__) || \ 430a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert defined(__x86_64__) || \ 440a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert defined(__arm64__)) 450a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert #define _LIBUNWIND_BUILD_SJLJ_APIS defined(__arm__) 460a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert #define _LIBUNWIND_SUPPORT_FRAME_APIS (defined(__i386__) || \ 470a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert defined(__x86_64__)) 48b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_EXPORT __attribute__((visibility("default"))) 49b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_HIDDEN __attribute__((visibility("hidden"))) 50e085735cbedc82b1064f05ff796e32e906a95036Dan Albert #define _LIBUNWIND_LOG(msg, ...) fprintf(stderr, "libunwind: " msg, __VA_ARGS__) 51b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_ABORT(msg) __assert_rtn(__func__, __FILE__, __LINE__, msg) 52b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 530a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert #if defined(FOR_DYLD) 54b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 1 55b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 0 56b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_SUPPORT_DWARF_INDEX 0 57b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #else 58b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 1 59b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 1 60b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_SUPPORT_DWARF_INDEX 0 61b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #endif 62b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 63b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#else 64e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert #include <stdlib.h> 65e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert 66e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert static inline void assert_rtn(const char* func, const char* file, int line, const char* msg) __attribute__ ((noreturn)); 67e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert static inline void assert_rtn(const char* func, const char* file, int line, const char* msg) { 68e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert fprintf(stderr, "libunwind: %s %s:%d - %s\n", func, file, line, msg); 69e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert assert(false); 70e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert abort(); 71e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert } 72e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert 730a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert #define _LIBUNWIND_BUILD_ZERO_COST_APIS (defined(__i386__) || \ 740a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert defined(__x86_64__) || \ 750a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert defined(__arm64__) || \ 760a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert defined(__arm__)) 77e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert #define _LIBUNWIND_BUILD_SJLJ_APIS 0 780a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert #define _LIBUNWIND_SUPPORT_FRAME_APIS (defined(__i386__) || \ 790a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert defined(__x86_64__)) 80e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert #define _LIBUNWIND_EXPORT __attribute__((visibility("default"))) 81e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert #define _LIBUNWIND_HIDDEN __attribute__((visibility("hidden"))) 82e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert #define _LIBUNWIND_LOG(msg, ...) fprintf(stderr, "libuwind: " msg, __VA_ARGS__) 83e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert #define _LIBUNWIND_ABORT(msg) assert_rtn(__func__, __FILE__, __LINE__, msg) 84e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert 85e45805f0d3f8dafef1297cc7dc49e610713f023bDan Albert #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 0 860a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert #define _LIBUNWIND_SUPPORT_DWARF_UNWIND !defined(__arm__) || \ 870a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert defined(__ARM_DWARF_EH__) 880a1ce9cae10bf7e2e6640e2a8f1efe7062c47292Dan Albert #define _LIBUNWIND_SUPPORT_DWARF_INDEX _LIBUNWIND_SUPPORT_DWARF_UNWIND 89b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#endif 90b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 91b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 92b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik// Macros that define away in non-Debug builds 93b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#ifdef NDEBUG 94b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_DEBUG_LOG(msg, ...) 95b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_TRACE_API(msg, ...) 96b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_TRACING_UNWINDING 0 97b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_TRACE_UNWINDING(msg, ...) 98b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_LOG_NON_ZERO(x) x 99b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#else 100b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #ifdef __cplusplus 101b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik extern "C" { 102b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #endif 103b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik extern bool logAPIs(); 104b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik extern bool logUnwinding(); 105b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #ifdef __cplusplus 106b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik } 107b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #endif 108b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_DEBUG_LOG(msg, ...) _LIBUNWIND_LOG(msg, __VA_ARGS__) 109b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_LOG_NON_ZERO(x) \ 110b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik do { \ 111b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik int _err = x; \ 112b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik if ( _err != 0 ) \ 113b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik _LIBUNWIND_LOG("" #x "=%d in %s", _err, __FUNCTION__); \ 114b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik } while (0) 115b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_TRACE_API(msg, ...) \ 116b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik do { \ 117b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik if ( logAPIs() ) _LIBUNWIND_LOG(msg, __VA_ARGS__); \ 118b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik } while(0) 119b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_TRACE_UNWINDING(msg, ...) \ 120b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik do { \ 121b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik if ( logUnwinding() ) _LIBUNWIND_LOG(msg, __VA_ARGS__); \ 122b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik } while(0) 123b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik #define _LIBUNWIND_TRACING_UNWINDING logUnwinding() 124b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#endif 125b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 126b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik 127b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#endif // LIBUNWIND_CONFIG_H 128