blob: 026a103ae4cb450947c19e29da05ed2d3fec2fa7 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
#ifndef OPENTITAN_SW_DEVICE_LIB_BASE_FREESTANDING_STDINT_H_
#define OPENTITAN_SW_DEVICE_LIB_BASE_FREESTANDING_STDINT_H_
/**
* @file
* @brief C library Integer types (Freestanding)
*
* This header implements the stdint.h standard header, as required by C11 S4p6.
* This header is specified in detail in S7.20 the same.
*
* Actual limit values below are defined as:
* - Unsigned MAXs are defined as the `0xff..ffU` all-ones representation.
* - Signed MINs are defined as `0x80..00` all-zeroes-but-the-last
* representation.
* - Unsigned MAXs are defined as `0x7f..ff` all-ones-but-the-last
* representation.
* These shorthands are correct for two's complement and the ones least likely
* to get a mistake in.
*
* It goes without saying that this file assumes the underlying representation
* is two's complement and little-endian.
*
* See https://github.com/riscv/riscv-elf-psabi-doc/blob/master/riscv-elf.md
* for the RISC-V specifics this file conforms to.
*/
typedef __UINT8_TYPE__ uint8_t;
typedef __UINT16_TYPE__ uint16_t;
typedef __UINT32_TYPE__ uint32_t;
typedef __UINT64_TYPE__ uint64_t;
typedef __INT8_TYPE__ int8_t;
typedef __INT16_TYPE__ int16_t;
typedef __INT32_TYPE__ int32_t;
typedef __INT64_TYPE__ int64_t;
typedef __UINT_LEAST8_TYPE__ uint_least8_t;
typedef __UINT_LEAST16_TYPE__ uint_least16_t;
typedef __UINT_LEAST32_TYPE__ uint_least32_t;
typedef __UINT_LEAST64_TYPE__ uint_least64_t;
typedef __INT_LEAST8_TYPE__ int_least8_t;
typedef __INT_LEAST16_TYPE__ int_least16_t;
typedef __INT_LEAST32_TYPE__ int_least32_t;
typedef __INT_LEAST64_TYPE__ int_least64_t;
typedef __UINT_FAST8_TYPE__ uint_fast8_t;
typedef __UINT_FAST16_TYPE__ uint_fast16_t;
typedef __UINT_FAST32_TYPE__ uint_fast32_t;
typedef __UINT_FAST64_TYPE__ uint_fast64_t;
typedef __INT_FAST8_TYPE__ int_fast8_t;
typedef __INT_FAST16_TYPE__ int_fast16_t;
typedef __INT_FAST32_TYPE__ int_fast32_t;
typedef __INT_FAST64_TYPE__ int_fast64_t;
typedef __UINTPTR_TYPE__ uintptr_t;
typedef __INTPTR_TYPE__ intptr_t;
typedef __UINTMAX_TYPE__ uintmax_t;
typedef __INTMAX_TYPE__ intmax_t;
// NOTE: Below, we use GCC/Clang's built-in defines for limits. However, only
// MAX limits are provided and, as such, we define a signed MIN, given a MAX, as
// (-MIN - 1). (MAX + 1) will trigger signed overflow and, as such, Undefined
// Behavior.
#define INT8_MIN (-__INT8_MAX__ - 1) /**< @hideinitializer */
#define INT8_MAX __INT8_MAX__ /**< @hideinitializer */
#define UINT8_MAX __UINT8_MAX__ /**< @hideinitializer */
#define INT16_MIN (-__INT16_MAX__ - 1) /**< @hideinitializer */
#define INT16_MAX __INT16_MAX__ /**< @hideinitializer */
#define UINT16_MAX __UINT16_MAX__ /**< @hideinitializer */
#define INT32_MIN (-__INT32_MAX__ - 1) /**< @hideinitializer */
#define INT32_MAX __INT32_MAX__ /**< @hideinitializer */
#define UINT32_MAX __UINT32_MAX__ /**< @hideinitializer */
#define INT64_MIN (-__INT64_MAX__ - 1) /**< @hideinitializer */
#define INT64_MAX __INT64_MAX__ /**< @hideinitializer */
#define UINT64_MAX __UINT64_MAX__ /**< @hideinitializer */
#define INT_LEAST8_MIN (-__INT_LEAST8_MAX__ - 1) /**< @hideinitializer */
#define INT_LEAST8_MAX __INT_LEAST8_MAX__ /**< @hideinitializer */
#define UINT_LEAST8_MAX __UINT_LEAST8_MAX__ /**< @hideinitializer */
#define INT_LEAST16_MIN (-__INT_LEAST16_MAX__ - 1) /**< @hideinitializer */
#define INT_LEAST16_MAX __INT_LEAST16_MAX__ /**< @hideinitializer */
#define UINT_LEAST16_MAX __UINT_LEAST16_MAX__ /**< @hideinitializer */
#define INT_LEAST32_MIN (-__INT_LEAST32_MAX__ - 1) /**< @hideinitializer */
#define INT_LEAST32_MAX __INT_LEAST32_MAX__ /**< @hideinitializer */
#define UINT_LEAST32_MAX __UINT_LEAST32_MAX__ /**< @hideinitializer */
#define INT_LEAST64_MIN (-__INT_LEAST64_MAX__ - 1) /**< @hideinitializer */
#define INT_LEAST64_MAX __INT_LEAST64_MAX__ /**< @hideinitializer */
#define UINT_LEAST64_MAX __UINT_LEAST64_MAX__ /**< @hideinitializer */
#define INT_FAST8_MIN (-__INT_FAST8_MAX__ - 1) /**< @hideinitializer */
#define INT_FAST8_MAX __INT_FAST8_MAX__ /**< @hideinitializer */
#define UINT_FAST8_MAX __UINT_FAST8_MAX__ /**< @hideinitializer */
#define INT_FAST16_MIN (-__INT_FAST16_MAX__ - 1) /**< @hideinitializer */
#define INT_FAST16_MAX __INT_FAST16_MAX__ /**< @hideinitializer */
#define UINT_FAST16_MAX __UINT_FAST16_MAX__ /**< @hideinitializer */
#define INT_FAST32_MIN (-__INT_FAST32_MAX__ - 1) /**< @hideinitializer */
#define INT_FAST32_MAX __INT_FAST32_MAX__ /**< @hideinitializer */
#define UINT_FAST32_MAX __UINT_FAST32_MAX__ /**< @hideinitializer */
#define INT_FAST64_MIN (-__INT_FAST64_MAX__ - 1) /**< @hideinitializer */
#define INT_FAST64_MAX __INT_FAST64_MAX__ /**< @hideinitializer */
#define UINT_FAST64_MAX __UINT_FAST64_MAX__ /**< @hideinitializer */
#define INTPTR_MIN (-__INTPTR_MAX__ - 1) /**< @hideinitializer */
#define INTPTR_MAX __INTPTR_MAX__ /**< @hideinitializer */
#define UINTPTR_MAX __UINTPTR_MAX__ /**< @hideinitializer */
#define INTMAX_MIN (-__INTMAX_MAX__ - 1) /**< @hideinitializer */
#define INTMAX_MAX __INTMAX_MAX__ /**< @hideinitializer */
#define UINTMAX_MAX __UINTMAX_MAX__ /**< @hideinitializer */
#define PTRDIFF_MIN (-__PTRDIFF_MAX__ - 1) /**< @hideinitializer */
#define PTRDIFF_MAX __PTRDIFF_MAX__ /**< @hideinitializer */
#define SIZE_MAX __SIZE_MAX__ /**< @hideinitializer */
#define WCHAR_MIN (-__WCHAR_MAX__ - 1) /**< @hideinitializer */
#define WCHAR_MAX __WCHAR_MAX__ /**< @hideinitializer */
// NOTE: While GCC and Clang both provide macros for implememting the _C macros,
// they are inconsistent on which is correct, so we implement them ourselves
// below.
#define INT8_C(value) (value) /**< @hideinitializer */
#define INT16_C(value) (value) /**< @hideinitializer */
#define INT32_C(value) (value) /**< @hideinitializer */
#define INT64_C(value) (value##LL) /**< @hideinitializer */
#define INTMAX_C(value) (value##LL) /**< @hideinitializer */
#define UINT8_C(value) (value##U) /**< @hideinitializer */
#define UINT16_C(value) (value##U) /**< @hideinitializer */
#define UINT32_C(value) (value##U) /**< @hideinitializer */
#define UINT64_C(value) (value##ULL) /**< @hideinitializer */
#define UINTMAX_C(value) (value##ULL) /**< @hideinitializer */
#endif // OPENTITAN_SW_DEVICE_LIB_BASE_FREESTANDING_STDINT_H_