xref: /freebsd/contrib/llvm-project/compiler-rt/lib/builtins/int_util.c (revision c7a063741720ef81d4caa4613242579d12f1d605)
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