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 22NORETURN extern void panic(const char *, ...); 23#ifndef _WIN32 24__attribute__((visibility("hidden"))) 25#endif 26void __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 33NORETURN extern void __assert_rtn(const char *func, const char *file, int line, 34 const char *message); 35 36__attribute__((weak)) 37__attribute__((visibility("hidden"))) 38void __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 52void __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