xref: /openbsd-src/gnu/llvm/compiler-rt/lib/builtins/int_util.c (revision d89ec533011f513df1010f142a111086a0785f09)
13cab2bb3Spatrick //===-- int_util.c - Implement internal utilities -------------------------===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick 
93cab2bb3Spatrick #include "int_lib.h"
103cab2bb3Spatrick 
113cab2bb3Spatrick // NOTE: The definitions in this file are declared weak because we clients to be
123cab2bb3Spatrick // able to arbitrarily package individual functions into separate .a files. If
133cab2bb3Spatrick // we did not declare these weak, some link situations might end up seeing
143cab2bb3Spatrick // duplicate strong definitions of the same symbol.
153cab2bb3Spatrick //
163cab2bb3Spatrick // We can't use this solution for kernel use (which may not support weak), but
173cab2bb3Spatrick // currently expect that when built for kernel use all the functionality is
183cab2bb3Spatrick // packaged into a single library.
193cab2bb3Spatrick 
203cab2bb3Spatrick #ifdef KERNEL_USE
213cab2bb3Spatrick 
223cab2bb3Spatrick NORETURN extern void panic(const char *, ...);
233cab2bb3Spatrick #ifndef _WIN32
243cab2bb3Spatrick __attribute__((visibility("hidden")))
253cab2bb3Spatrick #endif
__compilerrt_abort_impl(const char * file,int line,const char * function)263cab2bb3Spatrick void __compilerrt_abort_impl(const char *file, int line, const char *function) {
273cab2bb3Spatrick   panic("%s:%d: abort in %s", file, line, function);
283cab2bb3Spatrick }
293cab2bb3Spatrick 
303cab2bb3Spatrick #elif __APPLE__
313cab2bb3Spatrick 
323cab2bb3Spatrick // from libSystem.dylib
333cab2bb3Spatrick NORETURN extern void __assert_rtn(const char *func, const char *file, int line,
343cab2bb3Spatrick                                   const char *message);
353cab2bb3Spatrick 
363cab2bb3Spatrick __attribute__((weak))
373cab2bb3Spatrick __attribute__((visibility("hidden")))
__compilerrt_abort_impl(const char * file,int line,const char * function)383cab2bb3Spatrick void __compilerrt_abort_impl(const char *file, int line, const char *function) {
393cab2bb3Spatrick   __assert_rtn(function, file, line, "libcompiler_rt abort");
403cab2bb3Spatrick }
413cab2bb3Spatrick 
423cab2bb3Spatrick #else
433cab2bb3Spatrick 
44*d89ec533Spatrick #ifdef _WIN32
453cab2bb3Spatrick #include <stdlib.h>
46*d89ec533Spatrick #endif
473cab2bb3Spatrick 
483cab2bb3Spatrick #ifndef _WIN32
493cab2bb3Spatrick __attribute__((weak))
503cab2bb3Spatrick __attribute__((visibility("hidden")))
513cab2bb3Spatrick #endif
__compilerrt_abort_impl(const char * file,int line,const char * function)523cab2bb3Spatrick void __compilerrt_abort_impl(const char *file, int line, const char *function) {
53*d89ec533Spatrick #if !__STDC_HOSTED__
54*d89ec533Spatrick   // Avoid depending on libc when compiling with -ffreestanding.
55*d89ec533Spatrick   __builtin_trap();
56*d89ec533Spatrick #elif defined(_WIN32)
573cab2bb3Spatrick   abort();
58*d89ec533Spatrick #else
59*d89ec533Spatrick   __builtin_abort();
60*d89ec533Spatrick #endif
613cab2bb3Spatrick }
623cab2bb3Spatrick 
633cab2bb3Spatrick #endif
64