diff --git a/libc/config/linux/api.td b/libc/config/linux/api.td --- a/libc/config/linux/api.td +++ b/libc/config/linux/api.td @@ -117,6 +117,20 @@ }]; } +def FloatT : TypeDecl<"float_t"> { + let Decl = [{ + #define __need_float_t + #include <__llvm-libc-stdc-types.h> + }]; +} + +def DoubleT : TypeDecl<"double_t"> { + let Decl = [{ + #define __need_double_t + #include <__llvm-libc-stdc-types.h> + }]; +} + def MathAPI : PublicAPI<"math.h"> { let Macros = [ SimpleMacroDef<"MATH_ERRNO", "1">, @@ -130,6 +144,10 @@ IsInfMacro, IsNanMacro, ]; + let TypeDeclarations = [ + DoubleT, + FloatT, + ]; let Functions = [ "cosf", "round", diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt --- a/libc/include/CMakeLists.txt +++ b/libc/include/CMakeLists.txt @@ -11,6 +11,12 @@ __posix-types.h ) +add_header( + stdc_types + HDR + __llvm-libc-stdc-types.h +) + add_header( ctype HDR @@ -25,6 +31,7 @@ GEN_HDR math.h DEPENDS .llvm_libc_common_h + .stdc_types ) add_gen_header( diff --git a/libc/include/__llvm-libc-stdc-types.h b/libc/include/__llvm-libc-stdc-types.h new file mode 100644 --- /dev/null +++ b/libc/include/__llvm-libc-stdc-types.h @@ -0,0 +1,37 @@ +//===-- Definitions of common types from the C standard. ------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +// This header file does not have a header guard. It is internal to LLVM libc +// and intended to be used to pick specific definitions without polluting the +// public headers with unnecessary definitions. + +#undef __DEFINE_LLVM_LIBC_FLOAT_T +#undef __DEFINE_LLVM_LIBC_DOUBLE_T + +#if !defined(__FLT_EVAL_METHOD__) || __FLT_EVAL_METHOD__ == 0 +#define __DEFINE_LLVM_LIBC_FLOAT_T typedef float float_t +#define __DEFINE_LLVM_LIBC_DOUBLE_T typedef double double_t +#elif __FLT_EVAL_METHOD__ == 1 +#define __DEFINE_LLVM_LIBC_FLOAT_T typedef double float_t +#define __DEFINE_LLVM_LIBC_DOUBLE_T typedef double double_t +#elif __FLT_EVAL_METHOD__ == 2 +#define __DEFINE_LLVM_LIBC_FLOAT_T typedef long double float_t +#define __DEFINE_LLVM_LIBC_DOUBLE_T typedef long double double_t +#else +#error "Unsupported __FLT_EVAL_METHOD__ value." +#endif + +#if defined(__need_float_t) && !defined(__llvm_libc_float_t_defined) +__DEFINE_LLVM_LIBC_FLOAT_T; +#define __llvm_libc_float_t_defined +#endif // __need_float_t + +#if defined(__need_double_t) && !defined(__llvm_libc_double_t_defined) +__DEFINE_LLVM_LIBC_DOUBLE_T; +#define __llvm_libc_double_t_defined +#endif // __need_double_t