diff options
-rw-r--r-- | src/abort_message.c | 48 | ||||
-rw-r--r-- | src/abort_message.cpp | 33 | ||||
-rw-r--r-- | src/abort_message.h | 4 |
3 files changed, 32 insertions, 53 deletions
diff --git a/src/abort_message.c b/src/abort_message.c deleted file mode 100644 index 9522243..0000000 --- a/src/abort_message.c +++ /dev/null @@ -1,48 +0,0 @@ -//===-------------------------- abort_message.c ---------------------------===// -// -// 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. -// -//===----------------------------------------------------------------------===// - -#include <stdlib.h> -#include <stdio.h> -#include <stdarg.h> - -#if __APPLE__ - #include <Availability.h> - #if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1070 - #include <CrashReporterClient.h> - #endif -#endif - -#include "abort_message.h" - -__attribute__((visibility("hidden"))) -void abort_message(const char* format, ...) -{ - // write message to stderr -#if __APPLE__ - fprintf(stderr, "libc++abi.dylib: "); -#endif - va_list list; - va_start(list, format); - vfprintf(stderr, format, list); - va_end(list); - fprintf(stderr, "\n"); - -#if __APPLE__ && (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1070) - // record message in crash report - char* buffer; - va_list list2; - va_start(list2, format); - vasprintf(&buffer, format, list2); - va_end(list2); - CRSetCrashLogMessage(buffer); -#endif - - abort(); -} - diff --git a/src/abort_message.cpp b/src/abort_message.cpp index 5fa7d7f..6726498 100644 --- a/src/abort_message.cpp +++ b/src/abort_message.cpp @@ -1,4 +1,4 @@ -//===-------------------------- abort_message.c ---------------------------===// +//===------------------------- abort_message.cpp --------------------------===// // // The LLVM Compiler Infrastructure // @@ -12,7 +12,24 @@ #include <stdarg.h> #include "abort_message.h" -__attribute__((visibility("hidden"))) +#if __APPLE__ +# if defined(__has_include) && __has_include(<CrashReporterClient.h>) +# define HAVE_CRASHREPORTERCLIENT_H 1 +# include <CrashReporterClient.h> + + // If any clients of llvm try to link to libCrashReporterClient.a themselves, + // only one crash info struct will be used. + extern "C" { + CRASH_REPORTER_CLIENT_HIDDEN + struct crashreporter_annotations_t gCRAnnotations + __attribute__((section("__DATA," CRASHREPORTER_ANNOTATIONS_SECTION))) + = { CRASHREPORTER_ANNOTATIONS_VERSION, 0, 0, 0, 0, 0, 0 }; + } + +# endif +#endif + +__attribute__((visibility("hidden"), noreturn)) void abort_message(const char* format, ...) { // write message to stderr @@ -24,6 +41,16 @@ void abort_message(const char* format, ...) vfprintf(stderr, format, list); va_end(list); fprintf(stderr, "\n"); + +#if __APPLE__ && HAVE_CRASHREPORTERCLIENT_H + // record message in crash report + char* buffer; + va_list list2; + va_start(list2, format); + vasprintf(&buffer, format, list2); + va_end(list2); + CRSetCrashLogMessage(buffer); +#endif + abort(); } - diff --git a/src/abort_message.h b/src/abort_message.h index f2a91a2..ca681aa 100644 --- a/src/abort_message.h +++ b/src/abort_message.h @@ -12,11 +12,11 @@ #include "cxxabi.h" -#ifdef __cplusplus +#ifdef __cplusplus extern "C" { #endif -extern LIBCXXABI_NORETURN +__attribute__((visibility("hidden"), noreturn)) void abort_message(const char* format, ...) __attribute__((format(printf, 1, 2))); |