1675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool//===----------------------------- config.h -------------------------------===// 2675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool// 3675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool// The LLVM Compiler Infrastructure 4675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool// 5675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool// This file is dual licensed under the MIT and the University of Illinois Open 6675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool// Source Licenses. See LICENSE.TXT for details. 7675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool// 8675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool// 9675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool// Defines macros used within libuwind project. 10675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool// 11675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool//===----------------------------------------------------------------------===// 12675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool 13675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool 14675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool#ifndef LIBUNWIND_CONFIG_H 15675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool#define LIBUNWIND_CONFIG_H 16675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool 17675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool#include <assert.h> 18675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool#include <stdio.h> 19675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool 20675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool// Define static_assert() unless already defined by compiler. 21675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool#ifndef __has_feature 22675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define __has_feature(__x) 0 23675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool#endif 24675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool#if !(__has_feature(cxx_static_assert)) && !defined(static_assert) 25675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define static_assert(__b, __m) \ 26675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool extern int compile_time_assert_failed[ ( __b ) ? 1 : -1 ] \ 27675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool __attribute__( ( unused ) ); 28675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool#endif 29675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool 30675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool// Platform specific configuration defines. 31675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool#ifdef __APPLE__ 32675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #include <Availability.h> 33675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #ifdef __cplusplus 34675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool extern "C" { 35675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #endif 36675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool void __assert_rtn(const char *, const char *, int, const char *) 37675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool __attribute__((noreturn)); 38675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #ifdef __cplusplus 39675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool } 40675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #endif 41675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool 42675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_BUILD_ZERO_COST_APIS (defined(__i386__) || \ 43675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool defined(__x86_64__) || \ 44675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool defined(__arm64__)) 45675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_BUILD_SJLJ_APIS defined(__arm__) 46675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_SUPPORT_FRAME_APIS (defined(__i386__) || \ 47675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool defined(__x86_64__)) 48675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_EXPORT __attribute__((visibility("default"))) 49675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_HIDDEN __attribute__((visibility("hidden"))) 50675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_LOG(msg, ...) fprintf(stderr, "libuwind: " msg, __VA_ARGS__) 51675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_ABORT(msg) __assert_rtn(__func__, __FILE__, __LINE__, msg) 52675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool 53675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #if defined(FOR_DYLD) 54675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 1 55675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 0 56675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_SUPPORT_DWARF_INDEX 0 57675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #else 58675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 1 59675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_SUPPORT_DWARF_UNWIND 1 60675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_SUPPORT_DWARF_INDEX 0 61675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #endif 62675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool 63675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool#else 64675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #include <stdlib.h> 65675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool 66675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool static inline void assert_rtn(const char* func, const char* file, int line, const char* msg) __attribute__ ((noreturn)); 67675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool static inline void assert_rtn(const char* func, const char* file, int line, const char* msg) { 68675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool fprintf(stderr, "libunwind: %s %s:%d - %s\n", func, file, line, msg); 69675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool assert(false); 70675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool abort(); 71675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool } 72675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool 73675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_BUILD_ZERO_COST_APIS (defined(__i386__) || \ 74675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool defined(__x86_64__) || \ 7540377de0186cf63e7024b535d56d6f740cb8fc83Ed Maste defined(__arm__) || \ 7640377de0186cf63e7024b535d56d6f740cb8fc83Ed Maste defined(__aarch64__)) 77675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_BUILD_SJLJ_APIS 0 78675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_SUPPORT_FRAME_APIS (defined(__i386__) || \ 79675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool defined(__x86_64__)) 80675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_EXPORT __attribute__((visibility("default"))) 81675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_HIDDEN __attribute__((visibility("hidden"))) 82675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_LOG(msg, ...) fprintf(stderr, "libuwind: " msg, __VA_ARGS__) 83675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_ABORT(msg) assert_rtn(__func__, __FILE__, __LINE__, msg) 84675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool 85675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 0 86675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_SUPPORT_DWARF_UNWIND !defined(__arm__) || \ 87675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool defined(__ARM_DWARF_EH__) 88675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_SUPPORT_DWARF_INDEX _LIBUNWIND_SUPPORT_DWARF_UNWIND 89675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool#endif 90675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool 91675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool 92675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool// Macros that define away in non-Debug builds 93675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool#ifdef NDEBUG 94675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_DEBUG_LOG(msg, ...) 95675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_TRACE_API(msg, ...) 96675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_TRACING_UNWINDING 0 97675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_TRACE_UNWINDING(msg, ...) 98675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_LOG_NON_ZERO(x) x 99675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool#else 100675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #ifdef __cplusplus 101675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool extern "C" { 102675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #endif 103675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool extern bool logAPIs(); 104675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool extern bool logUnwinding(); 105675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #ifdef __cplusplus 106675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool } 107675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #endif 108675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_DEBUG_LOG(msg, ...) _LIBUNWIND_LOG(msg, __VA_ARGS__) 109675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_LOG_NON_ZERO(x) \ 110675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool do { \ 111675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool int _err = x; \ 112675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool if ( _err != 0 ) \ 113675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool _LIBUNWIND_LOG("" #x "=%d in %s", _err, __FUNCTION__); \ 114675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool } while (0) 115675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_TRACE_API(msg, ...) \ 116675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool do { \ 117675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool if ( logAPIs() ) _LIBUNWIND_LOG(msg, __VA_ARGS__); \ 118675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool } while(0) 119675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_TRACE_UNWINDING(msg, ...) \ 120675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool do { \ 121675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool if ( logUnwinding() ) _LIBUNWIND_LOG(msg, __VA_ARGS__); \ 122675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool } while(0) 123675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool #define _LIBUNWIND_TRACING_UNWINDING logUnwinding() 124675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool#endif 125675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool 126675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool 127675df58e9b2f6c4218ef7d19bfe405772ada5444Saleem Abdulrasool#endif // LIBUNWIND_CONFIG_H 128