1 | //===-- int_util.c - Implement internal utilities -------------------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "int_lib.h" |
10 | |
11 | // NOTE: The definitions in this file are declared weak because we clients to be |
12 | // able to arbitrarily package individual functions into separate .a files. If |
13 | // we did not declare these weak, some link situations might end up seeing |
14 | // duplicate strong definitions of the same symbol. |
15 | // |
16 | // We can't use this solution for kernel use (which may not support weak), but |
17 | // currently expect that when built for kernel use all the functionality is |
18 | // packaged into a single library. |
19 | |
20 | #ifdef KERNEL_USE |
21 | |
22 | NORETURN extern void panic(const char *, ...); |
23 | #ifndef _WIN32 |
24 | __attribute__((visibility("hidden" ))) |
25 | #endif |
26 | void __compilerrt_abort_impl(const char *file, int line, const char *function) { |
27 | panic("%s:%d: abort in %s" , file, line, function); |
28 | } |
29 | |
30 | #elif __APPLE__ |
31 | |
32 | // from libSystem.dylib |
33 | NORETURN extern void __assert_rtn(const char *func, const char *file, int line, |
34 | const char *message); |
35 | |
36 | __attribute__((weak)) |
37 | __attribute__((visibility("hidden" ))) |
38 | void __compilerrt_abort_impl(const char *file, int line, const char *function) { |
39 | __assert_rtn(function, file, line, "libcompiler_rt abort" ); |
40 | } |
41 | |
42 | #else |
43 | |
44 | #ifdef _WIN32 |
45 | #include <stdlib.h> |
46 | #endif |
47 | |
48 | #ifndef _WIN32 |
49 | __attribute__((weak)) |
50 | __attribute__((visibility("hidden" ))) |
51 | #endif |
52 | void __compilerrt_abort_impl(const char *file, int line, const char *function) { |
53 | #if !__STDC_HOSTED__ |
54 | // Avoid depending on libc when compiling with -ffreestanding. |
55 | __builtin_trap(); |
56 | #elif defined(_WIN32) |
57 | abort(); |
58 | #else |
59 | __builtin_abort(); |
60 | #endif |
61 | } |
62 | |
63 | #endif |
64 | |