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