diff options
Diffstat (limited to 'libc/include')
| -rw-r--r-- | libc/include/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | libc/include/__llvm-libc-common.h | 3 | ||||
| -rw-r--r-- | libc/include/llvm-libc-macros/CMakeLists.txt | 15 | ||||
| -rw-r--r-- | libc/include/llvm-libc-macros/cfloat128-macros.h | 41 | ||||
| -rw-r--r-- | libc/include/llvm-libc-macros/cfloat16-macros.h | 20 | ||||
| -rw-r--r-- | libc/include/llvm-libc-macros/complex-macros.h | 29 | ||||
| -rw-r--r-- | libc/include/llvm-libc-types/CMakeLists.txt | 11 | ||||
| -rw-r--r-- | libc/include/llvm-libc-types/cfloat128.h | 39 | ||||
| -rw-r--r-- | libc/include/llvm-libc-types/cfloat16.h | 11 | ||||
| -rw-r--r-- | libc/include/math.yaml | 55 | ||||
| -rw-r--r-- | libc/include/time.yaml | 13 |
11 files changed, 196 insertions, 42 deletions
diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt index 74fcea0f15e2..8fd37b0ee5ad 100644 --- a/libc/include/CMakeLists.txt +++ b/libc/include/CMakeLists.txt @@ -70,6 +70,7 @@ add_header_macro( dlfcn.h DEPENDS .llvm_libc_common_h + .llvm-libc-types.dl_info ) add_header_macro( diff --git a/libc/include/__llvm-libc-common.h b/libc/include/__llvm-libc-common.h index 1fe3f4d2aea9..70d8263e63b6 100644 --- a/libc/include/__llvm-libc-common.h +++ b/libc/include/__llvm-libc-common.h @@ -37,9 +37,6 @@ #undef _Alignof #define _Alignof alignof -#undef _Thread_local -#define _Thread_local thread_local - #undef __NOEXCEPT #if __cplusplus >= 201103L #define __NOEXCEPT noexcept diff --git a/libc/include/llvm-libc-macros/CMakeLists.txt b/libc/include/llvm-libc-macros/CMakeLists.txt index 7aa549ddc75d..f71540313f0b 100644 --- a/libc/include/llvm-libc-macros/CMakeLists.txt +++ b/libc/include/llvm-libc-macros/CMakeLists.txt @@ -62,9 +62,24 @@ add_macro_header( ) add_macro_header( + cfloat128_macros + HDR + cfloat128-macros.h +) + +add_macro_header( + cfloat16_macros + HDR + cfloat16-macros.h +) + +add_macro_header( complex_macros HDR complex-macros.h + DEPENDS + .cfloat128_macros + .cfloat16_macros ) add_macro_header( diff --git a/libc/include/llvm-libc-macros/cfloat128-macros.h b/libc/include/llvm-libc-macros/cfloat128-macros.h new file mode 100644 index 000000000000..5f28cfa21aae --- /dev/null +++ b/libc/include/llvm-libc-macros/cfloat128-macros.h @@ -0,0 +1,41 @@ +//===-- Detection of _Complex _Float128 compiler builtin type -------------===// +// +// 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_MACROS_CFLOAT128_MACROS_H +#define LLVM_LIBC_MACROS_CFLOAT128_MACROS_H + +#include "float-macros.h" // LDBL_MANT_DIG + +// Currently, the complex variant of C23 `_Float128` type is only defined as a +// built-in type in GCC 7 or later, for C and in GCC 13 or later, for C++. For +// clang, the complex variant of `__float128` is defined instead, and only on +// x86-64 targets for clang 11 or later. +// +// TODO: Update the complex variant of C23 `_Float128` type detection again when +// clang supports it. +#ifdef __clang__ +#if (__clang_major__ >= 11) && \ + (defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)) +// Use _Complex __float128 type. clang uses __SIZEOF_FLOAT128__ or __FLOAT128__ +// macro to notify the availability of __float128 type: +// https://reviews.llvm.org/D15120 +#define LIBC_TYPES_HAS_CFLOAT128 +#endif +#elif defined(__GNUC__) +#if (defined(__STDC_IEC_60559_COMPLEX__) || defined(__SIZEOF_FLOAT128__)) && \ + (__GNUC__ >= 13 || (!defined(__cplusplus))) +#define LIBC_TYPES_HAS_CFLOAT128 +#endif +#endif + +#if !defined(LIBC_TYPES_HAS_CFLOAT128) && (LDBL_MANT_DIG == 113) +#define LIBC_TYPES_HAS_CFLOAT128 +#define LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE +#endif + +#endif // LLVM_LIBC_MACROS_CFLOAT128_MACROS_H diff --git a/libc/include/llvm-libc-macros/cfloat16-macros.h b/libc/include/llvm-libc-macros/cfloat16-macros.h new file mode 100644 index 000000000000..1f10adf3e3f2 --- /dev/null +++ b/libc/include/llvm-libc-macros/cfloat16-macros.h @@ -0,0 +1,20 @@ +//===-- Detection of _Complex _Float16 compiler builtin type --------------===// +// +// 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_MACROS_CFLOAT16_MACROS_H +#define LLVM_LIBC_MACROS_CFLOAT16_MACROS_H + +#if defined(__FLT16_MANT_DIG__) && \ + (!defined(__GNUC__) || __GNUC__ >= 13 || \ + (defined(__clang__) && __clang_major__ >= 14)) && \ + !defined(__arm__) && !defined(_M_ARM) && !defined(__riscv) && \ + !defined(_WIN32) +#define LIBC_TYPES_HAS_CFLOAT16 +#endif + +#endif // LLVM_LIBC_MACROS_CFLOAT16_MACROS_H diff --git a/libc/include/llvm-libc-macros/complex-macros.h b/libc/include/llvm-libc-macros/complex-macros.h index 427c68d289e0..db84bcd2b03b 100644 --- a/libc/include/llvm-libc-macros/complex-macros.h +++ b/libc/include/llvm-libc-macros/complex-macros.h @@ -9,6 +9,9 @@ #ifndef __LLVM_LIBC_MACROS_COMPLEX_MACROS_H #define __LLVM_LIBC_MACROS_COMPLEX_MACROS_H +#include "cfloat128-macros.h" +#include "cfloat16-macros.h" + #ifndef __STDC_NO_COMPLEX__ #define __STDC_VERSION_COMPLEX_H__ 202311L @@ -19,6 +22,32 @@ // TODO: Add imaginary macros once GCC or Clang support _Imaginary builtin-type. +#if __has_builtin(__builtin_complex) +#define __CMPLX(r, i, t) (__builtin_complex((t)(r), (t)(i))) +#else +#define __CMPLX(r, i, t) ((_Complex t){(t)(r), (t)(i)}) +#endif + +#define CMPLX(r, i) __CMPLX(r, i, double) +#define CMPLXF(r, i) __CMPLX(r, i, float) +#define CMPLXL(r, i) __CMPLX(r, i, long double) + +#ifdef LIBC_TYPES_HAS_CFLOAT16 +#if !defined(__clang__) || (__clang_major__ >= 22 && __clang_minor__ > 0) +#define CMPLXF16(r, i) __CMPLX(r, i, _Float16) +#else +#define CMPLXF16(r, i) ((complex _Float16)(__CMPLX(r, i, float))) #endif +#endif // LIBC_TYPES_HAS_CFLOAT16 + +#ifdef LIBC_TYPES_HAS_CFLOAT128 +#ifdef LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE +#define CMPLXF128(r, i) __CMPLX(r, i, long double) +#else +#define CMPLXF128(r, i) __CMPLX(r, i, float128) +#endif // LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE +#endif // LIBC_TYPES_HAS_CFLOAT128 + +#endif // __STDC_NO_COMPLEX__ #endif // __LLVM_LIBC_MACROS_COMPLEX_MACROS_H diff --git a/libc/include/llvm-libc-types/CMakeLists.txt b/libc/include/llvm-libc-types/CMakeLists.txt index 451beae6f1e6..70da983be909 100644 --- a/libc/include/llvm-libc-types/CMakeLists.txt +++ b/libc/include/llvm-libc-types/CMakeLists.txt @@ -72,6 +72,7 @@ add_header(stack_t HDR stack_t.h DEPENDS .size_t) add_header(suseconds_t HDR suseconds_t.h) add_header(struct_dirent HDR struct_dirent.h DEPENDS .ino_t .off_t) add_header(struct_dl_phdr_info HDR struct_dl_phdr_info.h DEPENDS .size_t libc.include.llvm-libc-macros.link_macros) +add_header(dl_info HDR Dl_info.h) add_header(struct_f_owner_ex HDR struct_f_owner_ex.h DEPENDS .pid_t) add_header(struct_flock HDR struct_flock.h DEPENDS .off_t .pid_t) add_header(struct_flock64 HDR struct_flock64.h DEPENDS .off64_t .pid_t) @@ -149,9 +150,15 @@ add_header( HDR cfloat128.h DEPENDS - libc.include.llvm-libc-macros.float_macros + libc.include.llvm-libc-macros.cfloat128_macros +) +add_header( + cfloat16 + HDR + cfloat16.h + DEPENDS + libc.include.llvm-libc-macros.cfloat16_macros ) -add_header(cfloat16 HDR cfloat16.h) add_header(fsblkcnt_t HDR fsblkcnt_t.h) add_header(fsfilcnt_t HDR fsfilcnt_t.h) add_header( diff --git a/libc/include/llvm-libc-types/cfloat128.h b/libc/include/llvm-libc-types/cfloat128.h index 83fad8791013..4b1d2543dd81 100644 --- a/libc/include/llvm-libc-types/cfloat128.h +++ b/libc/include/llvm-libc-types/cfloat128.h @@ -9,36 +9,19 @@ #ifndef LLVM_LIBC_TYPES_CFLOAT128_H #define LLVM_LIBC_TYPES_CFLOAT128_H -#include "../llvm-libc-macros/float-macros.h" // LDBL_MANT_DIG +#include "../llvm-libc-macros/cfloat128-macros.h" -// Currently, the complex variant of C23 `_Float128` type is only defined as a -// built-in type in GCC 7 or later, for C and in GCC 13 or later, for C++. For -// clang, the complex variant of `__float128` is defined instead, and only on -// x86-64 targets for clang 11 or later. -// -// TODO: Update the complex variant of C23 `_Float128` type detection again when -// clang supports it. -#ifdef __clang__ -#if (__clang_major__ >= 11) && \ - (defined(__FLOAT128__) || defined(__SIZEOF_FLOAT128__)) -// Use _Complex __float128 type. clang uses __SIZEOF_FLOAT128__ or __FLOAT128__ -// macro to notify the availability of __float128 type: -// https://reviews.llvm.org/D15120 -#define LIBC_TYPES_HAS_CFLOAT128 +#ifdef LIBC_TYPES_HAS_CFLOAT128 +#ifndef LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE +#if defined(__GNUC__) && !defined(__clang__) +// Remove the workaround when https://gcc.gnu.org/PR32187 gets fixed. +typedef __typeof__(_Complex __float128) cfloat128; +#else // ^^^ workaround / no workaround vvv typedef _Complex __float128 cfloat128; -#endif -#elif defined(__GNUC__) -#if (defined(__STDC_IEC_60559_COMPLEX__) || defined(__SIZEOF_FLOAT128__)) && \ - (__GNUC__ >= 13 || (!defined(__cplusplus))) -#define LIBC_TYPES_HAS_CFLOAT128 -typedef _Complex _Float128 cfloat128; -#endif -#endif - -#if !defined(LIBC_TYPES_HAS_CFLOAT128) && (LDBL_MANT_DIG == 113) -#define LIBC_TYPES_HAS_CFLOAT128 -#define LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE +#endif // ^^^ no workaround ^^^ +#else typedef _Complex long double cfloat128; -#endif +#endif // LIBC_TYPES_CFLOAT128_IS_COMPLEX_LONG_DOUBLE +#endif // LIBC_TYPES_HAS_CFLOAT128 #endif // LLVM_LIBC_TYPES_CFLOAT128_H diff --git a/libc/include/llvm-libc-types/cfloat16.h b/libc/include/llvm-libc-types/cfloat16.h index 2d4cef756272..644a6469f059 100644 --- a/libc/include/llvm-libc-types/cfloat16.h +++ b/libc/include/llvm-libc-types/cfloat16.h @@ -9,13 +9,10 @@ #ifndef LLVM_LIBC_TYPES_CFLOAT16_H #define LLVM_LIBC_TYPES_CFLOAT16_H -#if defined(__FLT16_MANT_DIG__) && \ - (!defined(__GNUC__) || __GNUC__ >= 13 || \ - (defined(__clang__) && __clang_major__ >= 14)) && \ - !defined(__arm__) && !defined(_M_ARM) && !defined(__riscv) && \ - !defined(_WIN32) -#define LIBC_TYPES_HAS_CFLOAT16 +#include "../llvm-libc-macros/cfloat16-macros.h" + +#ifdef LIBC_TYPES_HAS_CFLOAT16 typedef _Complex _Float16 cfloat16; -#endif +#endif // LIBC_TYPES_HAS_CFLOAT16 #endif // LLVM_LIBC_TYPES_CFLOAT16_H diff --git a/libc/include/math.yaml b/libc/include/math.yaml index 6f48e0e9fd35..17f26fcfcb30 100644 --- a/libc/include/math.yaml +++ b/libc/include/math.yaml @@ -141,6 +141,13 @@ functions: arguments: - type: float - name: atanhf16 + standatds: + - stdc + return_type: _Float16 + arguments: + - type: _Float16 + guard: LIBC_TYPES_HAS_FLOAT16 + - name: atanpif16 standards: - stdc return_type: _Float16 @@ -310,10 +317,33 @@ functions: arguments: - type: _Float16 guard: LIBC_TYPES_HAS_FLOAT16 + - name: daddf128 + standards: + - llvm_libc_ext + return_type: double + arguments: + - type: float128 + - type: float128 + guard: LIBC_TYPES_HAS_FLOAT128 + - name: daddl + standards: + - stdc + return_type: double + arguments: + - type: long double + - type: long double + - name: ddivf128 + standards: + - llvm_libc_ext + return_type: double + arguments: + - type: float128 + - type: float128 + guard: LIBC_TYPES_HAS_FLOAT128 - name: ddivl standards: - stdc - return_type: long double + return_type: double arguments: - type: long double - type: long double @@ -332,13 +362,20 @@ functions: arguments: - type: long double - type: long double + - name: dsqrtf128 + standards: + - llvm_libc_ext + return_type: double + arguments: + - type: float128 + guard: LIBC_TYPES_HAS_FLOAT128 - name: dsqrtl standards: - stdc return_type: double arguments: - type: long double - - name: dsqrtf128 + - name: dsubf128 standards: - llvm_libc_ext return_type: double @@ -346,6 +383,13 @@ functions: - type: float128 - type: float128 guard: LIBC_TYPES_HAS_FLOAT128 + - name: dsubl + standards: + - stdc + return_type: double + arguments: + - type: long double + - type: long double - name: erff standards: - stdc @@ -1167,6 +1211,13 @@ functions: - type: _Float16 - type: _Float16 guard: LIBC_TYPES_HAS_FLOAT16 + - name: fminimum_numl + standards: + - stdc + return_type: long double + arguments: + - type: long double + - type: long double - name: fminimumf standards: - stdc diff --git a/libc/include/time.yaml b/libc/include/time.yaml index 3b9d77c0aaae..2f8024298fad 100644 --- a/libc/include/time.yaml +++ b/libc/include/time.yaml @@ -41,6 +41,19 @@ functions: arguments: - type: const time_t * - type: char * + - name: localtime + standard: + - stdc + return_type: struct tm * + arguments: + - type: const time_t * + - name: localtime_r + standard: + - stdc + return_type: struct tm * + arguments: + - type: const time_t * + - type: struct tm * - name: clock standard: - stdc |
