1*c05d8e5dSAndroid Build Coastguard Worker //===------------------------- abort_message.cpp --------------------------===//
2*c05d8e5dSAndroid Build Coastguard Worker //
3*c05d8e5dSAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*c05d8e5dSAndroid Build Coastguard Worker //
5*c05d8e5dSAndroid Build Coastguard Worker // This file is dual licensed under the MIT and the University of Illinois Open
6*c05d8e5dSAndroid Build Coastguard Worker // Source Licenses. See LICENSE.TXT for details.
7*c05d8e5dSAndroid Build Coastguard Worker //
8*c05d8e5dSAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*c05d8e5dSAndroid Build Coastguard Worker
10*c05d8e5dSAndroid Build Coastguard Worker #include <stdlib.h>
11*c05d8e5dSAndroid Build Coastguard Worker #include <stdio.h>
12*c05d8e5dSAndroid Build Coastguard Worker #include <stdarg.h>
13*c05d8e5dSAndroid Build Coastguard Worker #include "abort_message.h"
14*c05d8e5dSAndroid Build Coastguard Worker
15*c05d8e5dSAndroid Build Coastguard Worker #ifdef __BIONIC__
16*c05d8e5dSAndroid Build Coastguard Worker #include <android/api-level.h>
17*c05d8e5dSAndroid Build Coastguard Worker #if __ANDROID_API__ >= 21
18*c05d8e5dSAndroid Build Coastguard Worker #include <syslog.h>
19*c05d8e5dSAndroid Build Coastguard Worker extern "C" void android_set_abort_message(const char* msg);
20*c05d8e5dSAndroid Build Coastguard Worker #else
21*c05d8e5dSAndroid Build Coastguard Worker #include <assert.h>
22*c05d8e5dSAndroid Build Coastguard Worker #endif // __ANDROID_API__ >= 21
23*c05d8e5dSAndroid Build Coastguard Worker #endif // __BIONIC__
24*c05d8e5dSAndroid Build Coastguard Worker
25*c05d8e5dSAndroid Build Coastguard Worker #ifdef __APPLE__
26*c05d8e5dSAndroid Build Coastguard Worker # if defined(__has_include) && __has_include(<CrashReporterClient.h>)
27*c05d8e5dSAndroid Build Coastguard Worker # define HAVE_CRASHREPORTERCLIENT_H
28*c05d8e5dSAndroid Build Coastguard Worker # include <CrashReporterClient.h>
29*c05d8e5dSAndroid Build Coastguard Worker # endif
30*c05d8e5dSAndroid Build Coastguard Worker #endif
31*c05d8e5dSAndroid Build Coastguard Worker
abort_message(const char * format,...)32*c05d8e5dSAndroid Build Coastguard Worker void abort_message(const char* format, ...)
33*c05d8e5dSAndroid Build Coastguard Worker {
34*c05d8e5dSAndroid Build Coastguard Worker // write message to stderr
35*c05d8e5dSAndroid Build Coastguard Worker #if !defined(NDEBUG) || !defined(LIBCXXABI_BAREMETAL)
36*c05d8e5dSAndroid Build Coastguard Worker #ifdef __APPLE__
37*c05d8e5dSAndroid Build Coastguard Worker fprintf(stderr, "libc++abi.dylib: ");
38*c05d8e5dSAndroid Build Coastguard Worker #endif
39*c05d8e5dSAndroid Build Coastguard Worker va_list list;
40*c05d8e5dSAndroid Build Coastguard Worker va_start(list, format);
41*c05d8e5dSAndroid Build Coastguard Worker vfprintf(stderr, format, list);
42*c05d8e5dSAndroid Build Coastguard Worker va_end(list);
43*c05d8e5dSAndroid Build Coastguard Worker fprintf(stderr, "\n");
44*c05d8e5dSAndroid Build Coastguard Worker #endif
45*c05d8e5dSAndroid Build Coastguard Worker
46*c05d8e5dSAndroid Build Coastguard Worker #if defined(__APPLE__) && defined(HAVE_CRASHREPORTERCLIENT_H)
47*c05d8e5dSAndroid Build Coastguard Worker // record message in crash report
48*c05d8e5dSAndroid Build Coastguard Worker char* buffer;
49*c05d8e5dSAndroid Build Coastguard Worker va_list list2;
50*c05d8e5dSAndroid Build Coastguard Worker va_start(list2, format);
51*c05d8e5dSAndroid Build Coastguard Worker vasprintf(&buffer, format, list2);
52*c05d8e5dSAndroid Build Coastguard Worker va_end(list2);
53*c05d8e5dSAndroid Build Coastguard Worker CRSetCrashLogMessage(buffer);
54*c05d8e5dSAndroid Build Coastguard Worker #elif defined(__BIONIC__)
55*c05d8e5dSAndroid Build Coastguard Worker char* buffer;
56*c05d8e5dSAndroid Build Coastguard Worker va_list list2;
57*c05d8e5dSAndroid Build Coastguard Worker va_start(list2, format);
58*c05d8e5dSAndroid Build Coastguard Worker vasprintf(&buffer, format, list2);
59*c05d8e5dSAndroid Build Coastguard Worker va_end(list2);
60*c05d8e5dSAndroid Build Coastguard Worker
61*c05d8e5dSAndroid Build Coastguard Worker #if __ANDROID_API__ >= 21
62*c05d8e5dSAndroid Build Coastguard Worker // Show error in tombstone.
63*c05d8e5dSAndroid Build Coastguard Worker android_set_abort_message(buffer);
64*c05d8e5dSAndroid Build Coastguard Worker
65*c05d8e5dSAndroid Build Coastguard Worker // Show error in logcat.
66*c05d8e5dSAndroid Build Coastguard Worker openlog("libc++abi", 0, 0);
67*c05d8e5dSAndroid Build Coastguard Worker syslog(LOG_CRIT, "%s", buffer);
68*c05d8e5dSAndroid Build Coastguard Worker closelog();
69*c05d8e5dSAndroid Build Coastguard Worker #else
70*c05d8e5dSAndroid Build Coastguard Worker // The good error reporting wasn't available in Android until L. Since we're
71*c05d8e5dSAndroid Build Coastguard Worker // about to abort anyway, just call __assert2, which will log _somewhere_
72*c05d8e5dSAndroid Build Coastguard Worker // (tombstone and/or logcat) in older releases.
73*c05d8e5dSAndroid Build Coastguard Worker __assert2(__FILE__, __LINE__, __func__, buffer);
74*c05d8e5dSAndroid Build Coastguard Worker #endif // __ANDROID_API__ >= 21
75*c05d8e5dSAndroid Build Coastguard Worker #endif // __BIONIC__
76*c05d8e5dSAndroid Build Coastguard Worker
77*c05d8e5dSAndroid Build Coastguard Worker abort();
78*c05d8e5dSAndroid Build Coastguard Worker }
79