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