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