Summary: Currently, libunwind doesn't support MIPS. However, with this patch we do allow the library to build, and we warn the user about the lack of support for MIPS. Also, the dummy unw_getcontext() implementation for MIPS just traps on function entry in order to avoid any confusion with silent/weird failures at runtime. This allows us to test an LLVM-based toolchain without the dependency on a GCC toolchain. Of course, C++ exception handling and other things that depend on stack unwinding will not work until we add a proper implementation of the stub functions. Reviewers: compnerd, logan Subscribers: dsanders, llvm-commits Differential Revision: http://reviews.llvm.org/D13160 llvm-svn: 248673
129 lines
4.7 KiB
C
129 lines
4.7 KiB
C
//===----------------------------- config.h -------------------------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is dual licensed under the MIT and the University of Illinois Open
|
|
// Source Licenses. See LICENSE.TXT for details.
|
|
//
|
|
//
|
|
// Defines macros used within libuwind project.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
#ifndef LIBUNWIND_CONFIG_H
|
|
#define LIBUNWIND_CONFIG_H
|
|
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
|
|
// Define static_assert() unless already defined by compiler.
|
|
#ifndef __has_feature
|
|
#define __has_feature(__x) 0
|
|
#endif
|
|
#if !(__has_feature(cxx_static_assert)) && !defined(static_assert)
|
|
#define static_assert(__b, __m) \
|
|
extern int compile_time_assert_failed[ ( __b ) ? 1 : -1 ] \
|
|
__attribute__( ( unused ) );
|
|
#endif
|
|
|
|
// Platform specific configuration defines.
|
|
#ifdef __APPLE__
|
|
#include <Availability.h>
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
void __assert_rtn(const char *, const char *, int, const char *)
|
|
__attribute__((noreturn));
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#define _LIBUNWIND_BUILD_ZERO_COST_APIS (defined(__i386__) || \
|
|
defined(__x86_64__) || \
|
|
defined(__arm64__) || \
|
|
defined(__mips__))
|
|
#define _LIBUNWIND_BUILD_SJLJ_APIS defined(__arm__)
|
|
#define _LIBUNWIND_SUPPORT_FRAME_APIS (defined(__i386__) || \
|
|
defined(__x86_64__))
|
|
#define _LIBUNWIND_EXPORT __attribute__((visibility("default")))
|
|
#define _LIBUNWIND_HIDDEN __attribute__((visibility("hidden")))
|
|
#define _LIBUNWIND_LOG(msg, ...) fprintf(stderr, "libuwind: " msg, __VA_ARGS__)
|
|
#define _LIBUNWIND_ABORT(msg) __assert_rtn(__func__, __FILE__, __LINE__, msg)
|
|
|
|
#if defined(FOR_DYLD)
|
|
#define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 1
|
|
#define _LIBUNWIND_SUPPORT_DWARF_UNWIND 0
|
|
#define _LIBUNWIND_SUPPORT_DWARF_INDEX 0
|
|
#else
|
|
#define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 1
|
|
#define _LIBUNWIND_SUPPORT_DWARF_UNWIND 1
|
|
#define _LIBUNWIND_SUPPORT_DWARF_INDEX 0
|
|
#endif
|
|
|
|
#else
|
|
#include <stdlib.h>
|
|
|
|
static inline void assert_rtn(const char* func, const char* file, int line, const char* msg) __attribute__ ((noreturn));
|
|
static inline void assert_rtn(const char* func, const char* file, int line, const char* msg) {
|
|
fprintf(stderr, "libunwind: %s %s:%d - %s\n", func, file, line, msg);
|
|
assert(false);
|
|
abort();
|
|
}
|
|
|
|
#define _LIBUNWIND_BUILD_ZERO_COST_APIS (defined(__i386__) || \
|
|
defined(__x86_64__) || \
|
|
defined(__arm__) || \
|
|
defined(__aarch64__))
|
|
#define _LIBUNWIND_BUILD_SJLJ_APIS 0
|
|
#define _LIBUNWIND_SUPPORT_FRAME_APIS (defined(__i386__) || \
|
|
defined(__x86_64__))
|
|
#define _LIBUNWIND_EXPORT __attribute__((visibility("default")))
|
|
#define _LIBUNWIND_HIDDEN __attribute__((visibility("hidden")))
|
|
#define _LIBUNWIND_LOG(msg, ...) fprintf(stderr, "libuwind: " msg, __VA_ARGS__)
|
|
#define _LIBUNWIND_ABORT(msg) assert_rtn(__func__, __FILE__, __LINE__, msg)
|
|
|
|
#define _LIBUNWIND_SUPPORT_COMPACT_UNWIND 0
|
|
#define _LIBUNWIND_SUPPORT_DWARF_UNWIND !defined(__arm__) || \
|
|
defined(__ARM_DWARF_EH__)
|
|
#define _LIBUNWIND_SUPPORT_DWARF_INDEX _LIBUNWIND_SUPPORT_DWARF_UNWIND
|
|
#endif
|
|
|
|
|
|
// Macros that define away in non-Debug builds
|
|
#ifdef NDEBUG
|
|
#define _LIBUNWIND_DEBUG_LOG(msg, ...)
|
|
#define _LIBUNWIND_TRACE_API(msg, ...)
|
|
#define _LIBUNWIND_TRACING_UNWINDING 0
|
|
#define _LIBUNWIND_TRACE_UNWINDING(msg, ...)
|
|
#define _LIBUNWIND_LOG_NON_ZERO(x) x
|
|
#else
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
extern bool logAPIs();
|
|
extern bool logUnwinding();
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
#define _LIBUNWIND_DEBUG_LOG(msg, ...) _LIBUNWIND_LOG(msg, __VA_ARGS__)
|
|
#define _LIBUNWIND_LOG_NON_ZERO(x) \
|
|
do { \
|
|
int _err = x; \
|
|
if ( _err != 0 ) \
|
|
_LIBUNWIND_LOG("" #x "=%d in %s", _err, __FUNCTION__); \
|
|
} while (0)
|
|
#define _LIBUNWIND_TRACE_API(msg, ...) \
|
|
do { \
|
|
if ( logAPIs() ) _LIBUNWIND_LOG(msg, __VA_ARGS__); \
|
|
} while(0)
|
|
#define _LIBUNWIND_TRACE_UNWINDING(msg, ...) \
|
|
do { \
|
|
if ( logUnwinding() ) _LIBUNWIND_LOG(msg, __VA_ARGS__); \
|
|
} while(0)
|
|
#define _LIBUNWIND_TRACING_UNWINDING logUnwinding()
|
|
#endif
|
|
|
|
|
|
#endif // LIBUNWIND_CONFIG_H
|