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