1a6258684SMitch Phillips //===-- utilities_posix.cpp -------------------------------------*- C++ -*-===// 2a6258684SMitch Phillips // 3a6258684SMitch Phillips // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4a6258684SMitch Phillips // See https://llvm.org/LICENSE.txt for license information. 5a6258684SMitch Phillips // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6a6258684SMitch Phillips // 7a6258684SMitch Phillips //===----------------------------------------------------------------------===// 8a6258684SMitch Phillips 9*0a94511aSMitch Phillips #include <alloca.h> 10da59c2e4SFangrui Song #include <features.h> // IWYU pragma: keep (for __BIONIC__ macro) 11*0a94511aSMitch Phillips #include <inttypes.h> 12*0a94511aSMitch Phillips #include <stdint.h> 13*0a94511aSMitch Phillips #include <string.h> 14b9378690SMitch Phillips 155f2a74c8SMitch Phillips #ifdef __BIONIC__ 16b9378690SMitch Phillips #include "gwp_asan/definitions.h" 17a6258684SMitch Phillips #include <stdlib.h> 188d19af68SMitch Phillips extern "C" GWP_ASAN_WEAK void android_set_abort_message(const char *); 195f2a74c8SMitch Phillips #else // __BIONIC__ 20a6258684SMitch Phillips #include <stdio.h> 21a6258684SMitch Phillips #endif 22a6258684SMitch Phillips 23a6258684SMitch Phillips namespace gwp_asan { 24be8e4de7SKostya Kortchinsky void die(const char *Message) { 255f2a74c8SMitch Phillips #ifdef __BIONIC__ 268d19af68SMitch Phillips if (&android_set_abort_message != nullptr) 27a6258684SMitch Phillips android_set_abort_message(Message); 28a6258684SMitch Phillips abort(); 295f2a74c8SMitch Phillips #else // __BIONIC__ 30a6258684SMitch Phillips fprintf(stderr, "%s", Message); 31a6258684SMitch Phillips __builtin_trap(); 325f2a74c8SMitch Phillips #endif // __BIONIC__ 335f2a74c8SMitch Phillips } 34*0a94511aSMitch Phillips 35*0a94511aSMitch Phillips void dieWithErrorCode(const char *Message, int64_t ErrorCode) { 36*0a94511aSMitch Phillips #ifdef __BIONIC__ 37*0a94511aSMitch Phillips if (&android_set_abort_message == nullptr) 38*0a94511aSMitch Phillips abort(); 39*0a94511aSMitch Phillips 40*0a94511aSMitch Phillips size_t buffer_size = strlen(Message) + 48; 41*0a94511aSMitch Phillips char *buffer = static_cast<char *>(alloca(buffer_size)); 42*0a94511aSMitch Phillips snprintf(buffer, buffer_size, "%s (Error Code: %" PRId64 ")", Message, 43*0a94511aSMitch Phillips ErrorCode); 44*0a94511aSMitch Phillips android_set_abort_message(buffer); 45*0a94511aSMitch Phillips abort(); 46*0a94511aSMitch Phillips #else // __BIONIC__ 47*0a94511aSMitch Phillips fprintf(stderr, "%s (Error Code: %" PRId64 ")", Message, ErrorCode); 48*0a94511aSMitch Phillips __builtin_trap(); 49*0a94511aSMitch Phillips #endif // __BIONIC__ 50*0a94511aSMitch Phillips } 51a6258684SMitch Phillips } // namespace gwp_asan 52