diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2020-08-04 17:30:57 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2020-08-04 17:30:57 -0700 |
| commit | 42da1d385de8559710e04b5a05234f2dd8bb347e (patch) | |
| tree | 8f354c4dd008700e8ebfd367b25842addb25ae1a /lib/libcxxabi/src/abort_message.cpp | |
| parent | 54b67c20259f697f1e0c4532a5ee7e5d3f01eb1e (diff) | |
| download | zig-42da1d385de8559710e04b5a05234f2dd8bb347e.tar.gz zig-42da1d385de8559710e04b5a05234f2dd8bb347e.zip | |
libcxxabi: upgrade from llvm 10 to 11rc1
Diffstat (limited to 'lib/libcxxabi/src/abort_message.cpp')
| -rw-r--r-- | lib/libcxxabi/src/abort_message.cpp | 66 |
1 files changed, 34 insertions, 32 deletions
diff --git a/lib/libcxxabi/src/abort_message.cpp b/lib/libcxxabi/src/abort_message.cpp index d556af1c90..ad44063fac 100644 --- a/lib/libcxxabi/src/abort_message.cpp +++ b/lib/libcxxabi/src/abort_message.cpp @@ -12,52 +12,54 @@ #include "abort_message.h" #ifdef __BIONIC__ -#include <android/api-level.h> -#if __ANDROID_API__ >= 21 -#include <syslog.h> -extern "C" void android_set_abort_message(const char* msg); -#else -#include <assert.h> -#endif // __ANDROID_API__ >= 21 +# include <android/api-level.h> +# if __ANDROID_API__ >= 21 +# include <syslog.h> + extern "C" void android_set_abort_message(const char* msg); +# else +# include <assert.h> +# endif // __ANDROID_API__ >= 21 #endif // __BIONIC__ -#ifdef __APPLE__ -# if defined(__has_include) && __has_include(<CrashReporterClient.h>) -# define HAVE_CRASHREPORTERCLIENT_H -# include <CrashReporterClient.h> -# endif +#if defined(__APPLE__) && __has_include(<CrashReporterClient.h>) +# include <CrashReporterClient.h> +# define _LIBCXXABI_USE_CRASHREPORTER_CLIENT #endif void abort_message(const char* format, ...) { - // write message to stderr + // Write message to stderr. We do this before formatting into a + // variable-size buffer so that we still get some information if + // formatting into the variable-sized buffer fails. #if !defined(NDEBUG) || !defined(LIBCXXABI_BAREMETAL) -#ifdef __APPLE__ - fprintf(stderr, "libc++abi.dylib: "); + { + fprintf(stderr, "libc++abi: "); + va_list list; + va_start(list, format); + vfprintf(stderr, format, list); + va_end(list); + fprintf(stderr, "\n"); + } #endif + + // Format the arguments into an allocated buffer. We leak the buffer on + // purpose, since we're about to abort() anyway. +#if defined(_LIBCXXABI_USE_CRASHREPORTER_CLIENT) + char* buffer; va_list list; va_start(list, format); - vfprintf(stderr, format, list); + vasprintf(&buffer, format, list); va_end(list); - fprintf(stderr, "\n"); -#endif -#if defined(__APPLE__) && defined(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); #elif defined(__BIONIC__) char* buffer; - va_list list2; - va_start(list2, format); - vasprintf(&buffer, format, list2); - va_end(list2); + va_list list; + va_start(list, format); + vasprintf(&buffer, format, list); + va_end(list); -#if __ANDROID_API__ >= 21 +# if __ANDROID_API__ >= 21 // Show error in tombstone. android_set_abort_message(buffer); @@ -65,12 +67,12 @@ void abort_message(const char* format, ...) openlog("libc++abi", 0, 0); syslog(LOG_CRIT, "%s", buffer); closelog(); -#else +# else // The good error reporting wasn't available in Android until L. Since we're // about to abort anyway, just call __assert2, which will log _somewhere_ // (tombstone and/or logcat) in older releases. __assert2(__FILE__, __LINE__, __func__, buffer); -#endif // __ANDROID_API__ >= 21 +# endif // __ANDROID_API__ >= 21 #endif // __BIONIC__ abort(); |
