xref: /llvm-project/compiler-rt/lib/gwp_asan/platform_specific/utilities_posix.cpp (revision 0a94511aec7a41194c0e61d88801312542ff70ce)
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