diff --git a/libs/libc/Makefile b/libs/libc/Makefile index 21785e97817..8a027ed0fc6 100644 --- a/libs/libc/Makefile +++ b/libs/libc/Makefile @@ -73,6 +73,8 @@ include wctype/Make.defs include wqueue/Make.defs include fdt/Make.defs +CSRCS += limits_check.c + # Use double delim to fix windows native build and give an error: # makefile:132: *** target mode do not include“%”. stop. # diff --git a/libs/libc/limits_check.c b/libs/libc/limits_check.c new file mode 100644 index 00000000000..8a28ef5bb52 --- /dev/null +++ b/libs/libc/limits_check.c @@ -0,0 +1,195 @@ +/**************************************************************************** + * libs/libc/limits_check.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/* NuttX prefers defining limits per architecture directly as constants + * instead of using compiler provided definitions. That is to support + * compilers that do not provide such definitions. On the other hand in case + * compiler provides these definitions we should not deviate from them. This + * file thus contains only checks of NuttX's defined limits against compiler + * definitions if available. + */ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include +#include + +/**************************************************************************** + * Pre-processor Prototypes + ****************************************************************************/ + +#ifdef static_assert +# define static_assert_equal(COMPILER_DEF, DEF) \ + static_assert(COMPILER_DEF == DEF, "Compiler definition mismatch for " #DEF) +#else +# define DEFINITION_ASSERT(COMPILER_DEF, DEF) +#endif + +#ifdef __CHAR_BIT__ +static_assert_equal(__CHAR_BIT__, CHAR_BIT); +#endif + +#ifdef __SCHAR_MAX__ +static_assert_equal(__SCHAR_MAX__, SCHAR_MAX); +#endif + +#ifdef __SHRT_MAX__ +static_assert_equal(__SHRT_MAX__, SHRT_MAX); +#endif + +#ifdef __LONG_MAX__ +static_assert_equal(__LONG_MAX__, LONG_MAX); +#endif + +#ifdef __LONG_LONG_MAX__ +static_assert_equal(__LONG_LONG_MAX__, LLONG_MAX); +#endif + +#ifdef __UINTPTR_MAX__ +static_assert_equal(__UINTPTR_MAX__, UPTR_MAX); +#endif + +#ifdef __WCHAR_MAX__ +static_assert_equal(__WCHAR_MAX__, WCHAR_MAX); +#endif + +#ifdef __FLT_MANT_DIG__ +static_assert_equal(__FLT_MANT_DIG__, FLT_MANT_DIG); +#endif + +#ifdef __DBL_MANT_DIG__ +static_assert_equal(__DBL_MANT_DIG__, DBL_MANT_DIG); +#endif + +#ifdef __LDBL_MANT_DIG__ +static_assert_equal(__LDBL_MANT_DIG__, LDBL_MANT_DIG); +#endif + +#ifdef __FLT_DIG__ +static_assert_equal(__FLT_DIG__, FLT_DIG); +#endif + +#ifdef __DBL_DIG__ +static_assert_equal(__DBL_DIG__, DBL_DIG); +#endif + +#ifdef __LDBL_DIG__ +static_assert_equal(__LDBL_DIG__, LDBL_DIG); +#endif + +#ifdef __FLT_MIN_EXP__ +static_assert_equal(__FLT_MIN_EXP__, FLT_MIN_EXP); +#endif + +#ifdef __DBL_MIN_EXP__ +static_assert_equal(__DBL_MIN_EXP__, DBL_MIN_EXP); +#endif + +#ifdef __LDBL_MIN_EXP__ +static_assert_equal(__LDBL_MIN_EXP__, LDBL_MIN_EXP); +#endif + +#ifdef __FLT_MIN_10_EXP__ +static_assert_equal(__FLT_MIN_10_EXP__, FLT_MIN_10_EXP); +#endif + +#ifdef __DBL_MIN_10_EXP__ +static_assert_equal(__DBL_MIN_10_EXP__, DBL_MIN_10_EXP); +#endif + +#ifdef __LDBL_MIN_10_EXP__ +static_assert_equal(__LDBL_MIN_10_EXP__, LDBL_MIN_10_EXP); +#endif + +#ifdef __FLT_MAX_EXP__ +static_assert_equal(__FLT_MAX_EXP__, FLT_MAX_EXP); +#endif + +#ifdef __DBL_MAX_EXP__ +static_assert_equal(__DBL_MAX_EXP__, DBL_MAX_EXP); +#endif + +#ifdef __LDBL_MAX_EXP__ +static_assert_equal(__LDBL_MAX_EXP__, LDBL_MAX_EXP); +#endif + +#ifdef __FLT_MAX_10_EXP__ +static_assert_equal(__FLT_MAX_10_EXP__, FLT_MAX_10_EXP); +#endif + +#ifdef __DBL_MAX_10_EXP__ +static_assert_equal(__DBL_MAX_10_EXP__, DBL_MAX_10_EXP); +#endif + +#ifdef __LDBL_MAX_10_EXP__ +static_assert_equal(__LDBL_MAX_10_EXP__, LDBL_MAX_10_EXP); +#endif + +#ifdef __FLT_MAX__ +static_assert_equal(__FLT_MAX__, FLT_MAX); +#endif + +#ifdef __DBL_MAX__ +static_assert_equal(__DBL_MAX__, DBL_MAX); +#endif + +#ifdef __LDBL_MAX__ +static_assert_equal(__LDBL_MAX__, LDBL_MAX); +#endif + +#ifdef __FLT_EPSILON__ +static_assert_equal(__FLT_EPSILON__, FLT_EPSILON); +#endif + +#ifdef __DBL_EPSILON__ +static_assert_equal(__DBL_EPSILON__, DBL_EPSILON); +#endif + +#ifdef __LDBL_EPSILON__ +static_assert_equal(__LDBL_EPSILON__, LDBL_EPSILON); +#endif + +#ifdef __FLT_MIN__ +static_assert_equal(__FLT_MIN__, FLT_MIN); +#endif + +#ifdef __DBL_MIN__ +static_assert_equal(__DBL_MIN__, DBL_MIN); +#endif + +#ifdef __LDBL_MIN__ +static_assert_equal(__LDBL_MIN__, LDBL_MIN); +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/