blob: 771cc5cfe76c53f873e9516fdd1cbbfc2681acfe [file] [log] [blame]
Daniel Dunbar24768732009-10-27 17:48:46 +00001/* ===-- int_lib.h - configuration header for compiler-rt -----------------===
Edward O'Callaghandf720462009-08-05 01:47:29 +00002 *
3 * The LLVM Compiler Infrastructure
4 *
Howard Hinnant5b791f62010-11-16 22:13:33 +00005 * This file is dual licensed under the MIT and the University of Illinois Open
6 * Source Licenses. See LICENSE.TXT for details.
Edward O'Callaghandf720462009-08-05 01:47:29 +00007 *
8 * ===----------------------------------------------------------------------===
9 *
Daniel Dunbar24768732009-10-27 17:48:46 +000010 * This file is a configuration header for compiler-rt.
Edward O'Callaghandf720462009-08-05 01:47:29 +000011 * This file is not part of the interface of this library.
12 *
13 * ===----------------------------------------------------------------------===
14 */
Daniel Dunbarfd089992009-06-26 16:47:03 +000015
16#ifndef INT_LIB_H
17#define INT_LIB_H
18
Daniel Dunbarcc675f42011-11-15 18:56:21 +000019/* Assumption: Signed integral is 2's complement. */
20/* Assumption: Right shift of signed negative is arithmetic shift. */
21/* Assumption: Endianness is little or big (not mixed). */
22
Saleem Abdulrasool0d6094b2015-08-21 04:39:52 +000023#if defined(__ELF__)
Josh Gao772527c2015-08-21 02:51:17 +000024#define FNALIAS(alias_name, original_name) \
25 void alias_name() __attribute__((alias(#original_name)))
Saleem Abdulrasool0d6094b2015-08-21 04:39:52 +000026#else
27#define FNALIAS(alias, name) _Pragma("GCC error(\"alias unsupported on this file format\")")
28#endif
Josh Gao772527c2015-08-21 02:51:17 +000029
Daniel Dunbarb6f75f72011-11-15 18:34:44 +000030/* ABI macro definitions */
31
32#if __ARM_EABI__
33# define ARM_EABI_FNALIAS(aeabi_name, name) \
34 void __aeabi_##aeabi_name() __attribute__((alias("__" #name)));
Saleem Abdulrasoolb6a85b42014-09-06 21:33:55 +000035# define COMPILER_RT_ABI __attribute__((pcs("aapcs")))
Daniel Dunbarb6f75f72011-11-15 18:34:44 +000036#else
37# define ARM_EABI_FNALIAS(aeabi_name, name)
Saleem Abdulrasoole6f96522015-10-06 04:33:05 +000038# if defined(__arm__) && defined(_WIN32) && (!defined(_MSC_VER) || defined(__clang__))
Saleem Abdulrasoola3b39522015-05-22 21:47:24 +000039# define COMPILER_RT_ABI __attribute__((pcs("aapcs")))
40# else
41# define COMPILER_RT_ABI
42# endif
Daniel Dunbarb6f75f72011-11-15 18:34:44 +000043#endif
44
Saleem Abdulrasoole6f96522015-10-06 04:33:05 +000045#ifdef _MSC_VER
46#define NOINLINE __declspec(noinline)
47#define NORETURN __declspec(noreturn)
48#define UNUSED
49#else
50#define NOINLINE __attribute__((noinline))
51#define NORETURN __attribute__((noreturn))
52#define UNUSED __attribute__((unused))
53#endif
54
Joerg Sonnenberger24f4a7d2013-12-03 16:19:14 +000055#if defined(__NetBSD__) && (defined(_KERNEL) || defined(_STANDALONE))
56/*
57 * Kernel and boot environment can't use normal headers,
58 * so use the equivalent system headers.
59 */
60# include <machine/limits.h>
61# include <sys/stdint.h>
62# include <sys/types.h>
63#else
Daniel Dunbar7205b232011-11-16 00:20:36 +000064/* Include the standard compiler builtin headers we use functionality from. */
Joerg Sonnenberger24f4a7d2013-12-03 16:19:14 +000065# include <limits.h>
66# include <stdint.h>
67# include <stdbool.h>
68# include <float.h>
69#endif
Daniel Dunbar7205b232011-11-16 00:20:36 +000070
Daniel Dunbarad4f9822011-11-15 18:56:13 +000071/* Include the commonly used internal type definitions. */
72#include "int_types.h"
Daniel Dunbarfd089992009-06-26 16:47:03 +000073
Daniel Dunbar2b88e032011-11-16 01:19:19 +000074/* Include internal utility function declarations. */
75#include "int_util.h"
76
Joerg Sonnenberger6e99daa2014-03-01 15:30:50 +000077COMPILER_RT_ABI si_int __paritysi2(si_int a);
78COMPILER_RT_ABI si_int __paritydi2(di_int a);
79
80COMPILER_RT_ABI di_int __divdi3(di_int a, di_int b);
81COMPILER_RT_ABI si_int __divsi3(si_int a, si_int b);
82COMPILER_RT_ABI su_int __udivsi3(su_int n, su_int d);
83
84COMPILER_RT_ABI su_int __udivmodsi4(su_int a, su_int b, su_int* rem);
85COMPILER_RT_ABI du_int __udivmoddi4(du_int a, du_int b, du_int* rem);
86#ifdef CRT_HAS_128BIT
Joerg Sonnenberger7e6a3142014-03-01 15:57:30 +000087COMPILER_RT_ABI si_int __clzti2(ti_int a);
Joerg Sonnenberger6e99daa2014-03-01 15:30:50 +000088COMPILER_RT_ABI tu_int __udivmodti4(tu_int a, tu_int b, tu_int* rem);
89#endif
90
Edward O'Callaghan7a6cb5f2009-08-05 19:57:20 +000091#endif /* INT_LIB_H */