[libc] Add definitions of double_t and float_t to math.h.

This change does not handle any extensions. Only the C standard
variations are handled.

Reviewers: abrachet

Differential Revision: https://reviews.llvm.org/D79150
This commit is contained in:
Siva Chandra Reddy 2020-04-27 13:35:21 -07:00
parent 675eea46f0
commit 245cbd15a4
3 changed files with 62 additions and 0 deletions

View 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",

View File

@ -11,6 +11,12 @@ add_header(
__posix-types.h
)
add_header(
stdc_types
HDR
__llvm-libc-stdc-types.h
)
add_header(
ctype
HDR
@ -25,6 +31,7 @@ add_gen_header(
GEN_HDR math.h
DEPENDS
.llvm_libc_common_h
.stdc_types
)
add_gen_header(

View File

@ -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