summaryrefslogtreecommitdiff
path: root/libc/include
diff options
context:
space:
mode:
Diffstat (limited to 'libc/include')
-rw-r--r--libc/include/CMakeLists.txt1
-rw-r--r--libc/include/__llvm-libc-common.h3
-rw-r--r--libc/include/llvm-libc-macros/CMakeLists.txt15
-rw-r--r--libc/include/llvm-libc-macros/cfloat128-macros.h41
-rw-r--r--libc/include/llvm-libc-macros/cfloat16-macros.h20
-rw-r--r--libc/include/llvm-libc-macros/complex-macros.h29
-rw-r--r--libc/include/llvm-libc-types/CMakeLists.txt11
-rw-r--r--libc/include/llvm-libc-types/cfloat128.h39
-rw-r--r--libc/include/llvm-libc-types/cfloat16.h11
-rw-r--r--libc/include/math.yaml55
-rw-r--r--libc/include/time.yaml13
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