diff options
Diffstat (limited to 'libc/include/__llvm-libc-common.h')
| -rw-r--r-- | libc/include/__llvm-libc-common.h | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/libc/include/__llvm-libc-common.h b/libc/include/__llvm-libc-common.h new file mode 100644 index 000000000000..c6fd33a55532 --- /dev/null +++ b/libc/include/__llvm-libc-common.h @@ -0,0 +1,98 @@ +//===-- Common definitions for LLVM-libc public header files --------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LLVM_LIBC_COMMON_H +#define _LLVM_LIBC_COMMON_H + +#define __LLVM_LIBC__ 1 + +#ifdef __cplusplus + +#undef __BEGIN_C_DECLS +#define __BEGIN_C_DECLS extern "C" { + +#undef __END_C_DECLS +#define __END_C_DECLS } + +// Standard C++ doesn't have C99 restrict but GNU C++ has it with __ spelling. +#undef __restrict +#ifndef __GNUC__ +#define __restrict +#endif + +#undef _Noreturn +#define _Noreturn [[noreturn]] + +#undef _Alignas +#define _Alignas alignas + +#undef _Static_assert +#define _Static_assert static_assert + +#undef _Alignof +#define _Alignof alignof + +#undef _Thread_local +#define _Thread_local thread_local + +#undef __NOEXCEPT +#if __cplusplus >= 201103L +#define __NOEXCEPT noexcept +#else +#define __NOEXCEPT throw() +#endif + +// This macro serves as a generic cast implementation for use in both C and C++, +// similar to `__BIONIC_CAST` in Android. +#undef __LLVM_LIBC_CAST +#define __LLVM_LIBC_CAST(cast, type, value) (cast<type>(value)) + +#else // not __cplusplus + +#undef __BEGIN_C_DECLS +#define __BEGIN_C_DECLS + +#undef __END_C_DECLS +#define __END_C_DECLS + +#undef __restrict +#if __STDC_VERSION__ >= 199901L +// C99 and above support the restrict keyword. +#define __restrict restrict +#elif !defined(__GNUC__) +// GNU-compatible compilers accept the __ spelling in all modes. +// Otherwise, omit the qualifier for pure C89 compatibility. +#define __restrict +#endif + +#undef _Noreturn +#if __STDC_VERSION__ >= 201112L +// In C11 and later, _Noreturn is a keyword. +#elif defined(__GNUC__) +// GNU-compatible compilers have an equivalent attribute. +#define _Noreturn __attribute__((__noreturn__)) +#else +#define _Noreturn +#endif + +#undef __NOEXCEPT +#ifdef __GNUC__ +#define __NOEXCEPT __attribute__((__nothrow__)) +#else +#define __NOEXCEPT +#endif + +#undef _Returns_twice +#define _Returns_twice __attribute__((returns_twice)) + +#undef __LLVM_LIBC_CAST +#define __LLVM_LIBC_CAST(cast, type, value) ((type)(value)) + +#endif // __cplusplus + +#endif // _LLVM_LIBC_COMMON_H |
