1401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar/* ===-- int_util.c - Implement internal utilities --------------------------===
2401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar *
3401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar *                     The LLVM Compiler Infrastructure
4401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar *
5401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar * This file is dual licensed under the MIT and the University of Illinois Open
6401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar * Source Licenses. See LICENSE.TXT for details.
7401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar *
8401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar * ===----------------------------------------------------------------------===
9401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar */
10401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar
11401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar#include "int_lib.h"
123d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar#include "int_util.h"
13401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar
141626d864159d42d1c5a492c1cb686f629e81f815Daniel Dunbar/* NOTE: The definitions in this file are declared weak because we clients to be
151626d864159d42d1c5a492c1cb686f629e81f815Daniel Dunbar * able to arbitrarily package individual functions into separate .a files. If
161626d864159d42d1c5a492c1cb686f629e81f815Daniel Dunbar * we did not declare these weak, some link situations might end up seeing
171626d864159d42d1c5a492c1cb686f629e81f815Daniel Dunbar * duplicate strong definitions of the same symbol.
181626d864159d42d1c5a492c1cb686f629e81f815Daniel Dunbar *
191626d864159d42d1c5a492c1cb686f629e81f815Daniel Dunbar * We can't use this solution for kernel use (which may not support weak), but
201626d864159d42d1c5a492c1cb686f629e81f815Daniel Dunbar * currently expect that when built for kernel use all the functionality is
211626d864159d42d1c5a492c1cb686f629e81f815Daniel Dunbar * packaged into a single library.
221626d864159d42d1c5a492c1cb686f629e81f815Daniel Dunbar */
231626d864159d42d1c5a492c1cb686f629e81f815Daniel Dunbar
24401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar#ifdef KERNEL_USE
25401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar
263d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarNORETURN extern void panic(const char *, ...);
276092c21b37146ad5f859f3f23b6ddf80f3d8f3d4Anton Korobeynikov#ifndef _WIN32
28401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar__attribute__((visibility("hidden")))
296092c21b37146ad5f859f3f23b6ddf80f3d8f3d4Anton Korobeynikov#endif
30401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbarvoid compilerrt_abort_impl(const char *file, int line, const char *function) {
31401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar  panic("%s:%d: abort in %s", file, line, function);
32401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar}
33401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar
34868082b4f9eb6fd7f2f9c9cc36002afbfdf17802Tim Northover#elif __APPLE__
35c453bd5ba0faad8344cb94d627a6683a9ad14ca7Nick Kledzik
36c453bd5ba0faad8344cb94d627a6683a9ad14ca7Nick Kledzik/* from libSystem.dylib */
373d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga NainarNORETURN extern void __assert_rtn(const char *func, const char *file, int line,
383d763c0d3700e73b3aead8e65e04ec28efc56138Pirama Arumuga Nainar                                  const char *message);
39c453bd5ba0faad8344cb94d627a6683a9ad14ca7Nick Kledzik
406092c21b37146ad5f859f3f23b6ddf80f3d8f3d4Anton Korobeynikov#ifndef _WIN32
41c453bd5ba0faad8344cb94d627a6683a9ad14ca7Nick Kledzik__attribute__((weak))
42c453bd5ba0faad8344cb94d627a6683a9ad14ca7Nick Kledzik__attribute__((visibility("hidden")))
436092c21b37146ad5f859f3f23b6ddf80f3d8f3d4Anton Korobeynikov#endif
44c453bd5ba0faad8344cb94d627a6683a9ad14ca7Nick Kledzikvoid compilerrt_abort_impl(const char *file, int line, const char *function) {
45c453bd5ba0faad8344cb94d627a6683a9ad14ca7Nick Kledzik  __assert_rtn(function, file, line, "libcompiler_rt abort");
46c453bd5ba0faad8344cb94d627a6683a9ad14ca7Nick Kledzik}
47c453bd5ba0faad8344cb94d627a6683a9ad14ca7Nick Kledzik
48401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar#else
49401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar
50401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar/* Get the system definition of abort() */
51401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar#include <stdlib.h>
52401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar
536092c21b37146ad5f859f3f23b6ddf80f3d8f3d4Anton Korobeynikov#ifndef _WIN32
541626d864159d42d1c5a492c1cb686f629e81f815Daniel Dunbar__attribute__((weak))
55401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar__attribute__((visibility("hidden")))
566092c21b37146ad5f859f3f23b6ddf80f3d8f3d4Anton Korobeynikov#endif
57401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbarvoid compilerrt_abort_impl(const char *file, int line, const char *function) {
58401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar  abort();
59401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar}
60401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar
61401f693a874c0f2fd9e37173e3ab7045a1bdeb3dDaniel Dunbar#endif
62