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