xref: /freebsd/contrib/llvm-project/libc/include/__llvm-libc-common.h (revision 9c77fb6aaa366cbabc80ee1b834bcfe4df135491)
1 //===-- Common definitions for LLVM-libc public header files --------------===//
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 #ifndef _LLVM_LIBC_COMMON_H
10 #define _LLVM_LIBC_COMMON_H
11 
12 #define __LLVM_LIBC__ 1
13 
14 #ifdef __cplusplus
15 
16 #undef __BEGIN_C_DECLS
17 #define __BEGIN_C_DECLS extern "C" {
18 
19 #undef __END_C_DECLS
20 #define __END_C_DECLS }
21 
22 // Standard C++ doesn't have C99 restrict but GNU C++ has it with __ spelling.
23 #undef __restrict
24 #ifndef __GNUC__
25 #define __restrict
26 #endif
27 
28 #undef _Noreturn
29 #define _Noreturn [[noreturn]]
30 
31 #undef _Alignas
32 #define _Alignas alignas
33 
34 #undef _Static_assert
35 #define _Static_assert static_assert
36 
37 #undef _Alignof
38 #define _Alignof alignof
39 
40 #undef _Thread_local
41 #define _Thread_local thread_local
42 
43 #undef __NOEXCEPT
44 #if __cplusplus >= 201103L
45 #define __NOEXCEPT noexcept
46 #else
47 #define __NOEXCEPT throw()
48 #endif
49 
50 // This macro serves as a generic cast implementation for use in both C and C++,
51 // similar to `__BIONIC_CAST` in Android.
52 #undef __LLVM_LIBC_CAST
53 #define __LLVM_LIBC_CAST(cast, type, value) (cast<type>(value))
54 
55 #else // not __cplusplus
56 
57 #undef __BEGIN_C_DECLS
58 #define __BEGIN_C_DECLS
59 
60 #undef __END_C_DECLS
61 #define __END_C_DECLS
62 
63 #undef __restrict
64 #if __STDC_VERSION__ >= 199901L
65 // C99 and above support the restrict keyword.
66 #define __restrict restrict
67 #elif !defined(__GNUC__)
68 // GNU-compatible compilers accept the __ spelling in all modes.
69 // Otherwise, omit the qualifier for pure C89 compatibility.
70 #define __restrict
71 #endif
72 
73 #undef _Noreturn
74 #if __STDC_VERSION__ >= 201112L
75 // In C11 and later, _Noreturn is a keyword.
76 #elif defined(__GNUC__)
77 // GNU-compatible compilers have an equivalent attribute.
78 #define _Noreturn __attribute__((__noreturn__))
79 #else
80 #define _Noreturn
81 #endif
82 
83 #undef __NOEXCEPT
84 #ifdef __GNUC__
85 #define __NOEXCEPT __attribute__((__nothrow__))
86 #else
87 #define __NOEXCEPT
88 #endif
89 
90 #undef _Returns_twice
91 #define _Returns_twice __attribute__((returns_twice))
92 
93 #undef __LLVM_LIBC_CAST
94 #define __LLVM_LIBC_CAST(cast, type, value) ((type)(value))
95 
96 #endif // __cplusplus
97 
98 #endif // _LLVM_LIBC_COMMON_H
99