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