[libc] Add definitions of double_t and float_t to math.h.
authorSiva Chandra Reddy <sivachandra@google.com>
Mon, 27 Apr 2020 20:35:21 +0000 (13:35 -0700)
committerSiva Chandra Reddy <sivachandra@google.com>
Thu, 30 Apr 2020 18:59:11 +0000 (11:59 -0700)
This change does not handle any extensions. Only the C standard
variations are handled.

Reviewers: abrachet

Differential Revision: https://reviews.llvm.org/D79150

libc/config/linux/api.td
libc/include/CMakeLists.txt
libc/include/__llvm-libc-stdc-types.h [new file with mode: 0644]

index 16bb0d7..7d81c0d 100644 (file)
@@ -117,6 +117,20 @@ def IsNanMacro : MacroDef<"isnan"> {
   }];
 }
 
+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 @@ def MathAPI : PublicAPI<"math.h"> {
     IsInfMacro,
     IsNanMacro,
   ];
+  let TypeDeclarations = [
+    DoubleT,
+    FloatT,
+  ];
   let Functions = [
    "cosf",
    "round",
index f9564b3..4dcd69a 100644 (file)
@@ -12,6 +12,12 @@ add_header(
 )
 
 add_header(
+  stdc_types
+  HDR
+    __llvm-libc-stdc-types.h
+)
+
+add_header(
   ctype
   HDR
    ctype.h
@@ -25,6 +31,7 @@ add_gen_header(
   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 (file)
index 0000000..8e3bad6
--- /dev/null
@@ -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 __LLVM_LIBC_FLOAT_T
+#undef __LLVM_LIBC_DOUBLE_T
+
+#if !defined(__FLT_EVAL_METHOD__) || __FLT_EVAL_METHOD__ == 0
+#define __LLVM_LIBC_FLOAT_T float
+#define __LLVM_LIBC_DOUBLE_T double
+#elif __FLT_EVAL_METHOD__ == 1
+#define __LLVM_LIBC_FLOAT_T double
+#define __LLVM_LIBC_DOUBLE_T double
+#elif __FLT_EVAL_METHOD__ == 2
+#define __LLVM_LIBC_FLOAT_T long double
+#define __LLVM_LIBC_DOUBLE_T long double
+#else
+#error "Unsupported __FLT_EVAL_METHOD__ value."
+#endif
+
+#if defined(__need_float_t) && !defined(__llvm_libc_float_t_defined)
+typedef __LLVM_LIBC_FLOAT_T float_t;
+#define __llvm_libc_float_t_defined
+#endif // __need_float_t
+
+#if defined(__need_double_t) && !defined(__llvm_libc_double_t_defined)
+typedef __LLVM_LIBC_DOUBLE_T double_t;
+#define __llvm_libc_double_t_defined
+#endif // __need_double_t