1 //===------------------------- abort_message.cpp --------------------------===// 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 10 #include <stdlib.h> 11 #include <stdio.h> 12 #include <stdarg.h> 13 #include "abort_message.h" 14 15 #pragma GCC visibility push(hidden) 16 17 #if __APPLE__ 18 # if defined(__has_include) && __has_include(<CrashReporterClient.h>) 19 # define HAVE_CRASHREPORTERCLIENT_H 1 20 # include <CrashReporterClient.h> 21 # endif 22 #endif 23 24 __attribute__((visibility("hidden"), noreturn)) 25 void abort_message(const char* format, ...) 26 { 27 // write message to stderr 28 #if __APPLE__ 29 fprintf(stderr, "libc++abi.dylib: "); 30 #endif 31 va_list list; 32 va_start(list, format); 33 vfprintf(stderr, format, list); 34 va_end(list); 35 fprintf(stderr, "\n"); 36 37 #if __APPLE__ && HAVE_CRASHREPORTERCLIENT_H 38 // record message in crash report 39 char* buffer; 40 va_list list2; 41 va_start(list2, format); 42 vasprintf(&buffer, format, list2); 43 va_end(list2); 44 CRSetCrashLogMessage(buffer); 45 #endif 46 47 abort(); 48 } 49 50 #pragma GCC visibility pop 51