config.h revision e085735cbedc82b1064f05ff796e32e906a95036
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
238cb8b2086426108c6ea737d83cfd739ae5e5d8d9Nick Kledzik#if !(__has_feature(cxx_static_assert)) && !defined(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")))
46e085735cbedc82b1064f05ff796e32e906a95036Dan Albert  #define _LIBUNWIND_LOG(msg, ...) fprintf(stderr, "libunwind: " 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
59e085735cbedc82b1064f05ff796e32e906a95036Dan Albert#elif defined(__BIONIC__)
60e085735cbedc82b1064f05ff796e32e906a95036Dan Albert  #define _LIBUNWIND_BUILD_ZERO_COST_APIS (__i386__ || __x86_64__ || __arm64__ || __arm__)
61e085735cbedc82b1064f05ff796e32e906a95036Dan Albert  #define _LIBUNWIND_BUILD_SJLJ_APIS      0
62e085735cbedc82b1064f05ff796e32e906a95036Dan Albert  #define _LIBUNWIND_SUPPORT_FRAME_APIS   (__i386__ || __x86_64__)
63e085735cbedc82b1064f05ff796e32e906a95036Dan Albert  #define _LIBUNWIND_EXPORT               __attribute__((visibility("default")))
64e085735cbedc82b1064f05ff796e32e906a95036Dan Albert  #define _LIBUNWIND_HIDDEN               __attribute__((visibility("hidden")))
65e085735cbedc82b1064f05ff796e32e906a95036Dan Albert  #define _LIBUNWIND_LOG(msg, ...)        fprintf(stderr, "libunwind: " msg, __VA_ARGS__)
66e085735cbedc82b1064f05ff796e32e906a95036Dan Albert  #define _LIBUNWIND_ABORT(msg)           __assert2(__FILE__, __LINE__, __func__, msg)
67e085735cbedc82b1064f05ff796e32e906a95036Dan Albert
68e085735cbedc82b1064f05ff796e32e906a95036Dan Albert  #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 1
69e085735cbedc82b1064f05ff796e32e906a95036Dan Albert  #define _LIBUNWIND_SUPPORT_DWARF_UNWIND   1
70e085735cbedc82b1064f05ff796e32e906a95036Dan Albert  #define _LIBUNWIND_SUPPORT_DWARF_INDEX    0
71b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#else
72b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  // #define _LIBUNWIND_BUILD_ZERO_COST_APIS
73b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  // #define _LIBUNWIND_BUILD_SJLJ_APIS
74b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  // #define _LIBUNWIND_SUPPORT_FRAME_APIS
75b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  // #define _LIBUNWIND_EXPORT
76b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  // #define _LIBUNWIND_HIDDEN
77b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  // #define _LIBUNWIND_LOG()
78b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  // #define _LIBUNWIND_ABORT()
79b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  // #define _LIBUNWIND_SUPPORT_COMPACT_UNWIND
80b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  // #define _LIBUNWIND_SUPPORT_DWARF_UNWIND
81b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  // #define _LIBUNWIND_SUPPORT_DWARF_INDEX
82b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#endif
83b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
84b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
85b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik// Macros that define away in non-Debug builds
86b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#ifdef NDEBUG
87b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  #define _LIBUNWIND_DEBUG_LOG(msg, ...)
88b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  #define _LIBUNWIND_TRACE_API(msg, ...)
89b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  #define _LIBUNWIND_TRACING_UNWINDING 0
90b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  #define _LIBUNWIND_TRACE_UNWINDING(msg, ...)
91b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  #define _LIBUNWIND_LOG_NON_ZERO(x) x
92b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#else
93b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  #ifdef __cplusplus
94b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik    extern "C" {
95b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  #endif
96b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik    extern  bool logAPIs();
97b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik    extern  bool logUnwinding();
98b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  #ifdef __cplusplus
99b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik    }
100b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  #endif
101b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  #define _LIBUNWIND_DEBUG_LOG(msg, ...)  _LIBUNWIND_LOG(msg, __VA_ARGS__)
102b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  #define _LIBUNWIND_LOG_NON_ZERO(x) \
103b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik            do { \
104b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik              int _err = x; \
105b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik              if ( _err != 0 ) \
106b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik                _LIBUNWIND_LOG("" #x "=%d in %s", _err, __FUNCTION__); \
107b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik             } while (0)
108b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  #define _LIBUNWIND_TRACE_API(msg, ...) \
109b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik            do { \
110b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik              if ( logAPIs() ) _LIBUNWIND_LOG(msg, __VA_ARGS__); \
111b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik            } while(0)
112b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  #define _LIBUNWIND_TRACE_UNWINDING(msg, ...) \
113b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik            do { \
114b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik              if ( logUnwinding() ) _LIBUNWIND_LOG(msg, __VA_ARGS__); \
115b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik            } while(0)
116b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik  #define _LIBUNWIND_TRACING_UNWINDING logUnwinding()
117b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#endif
118b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
119b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik
120b78da9875b6e35187b5d584746c78faaf3230a3dNick Kledzik#endif // LIBUNWIND_CONFIG_H
121