Zephyr Project API 4.0.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
zephyr_stdint.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2019 BayLibre SAS
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_INCLUDE_TOOLCHAIN_STDINT_H_
8#define ZEPHYR_INCLUDE_TOOLCHAIN_STDINT_H_
9
10/*
11 * Some gcc versions and/or configurations as found in the Zephyr SDK
12 * (questionably) define __INT32_TYPE__ and derivatives as a long int
13 * which makes the printf format checker to complain about long vs int
14 * mismatch when %u is given a uint32_t argument, and uint32_t pointers not
15 * being compatible with int pointers. Let's redefine them to follow
16 * common expectations and usage.
17 */
18
19/*
20 * If the compiler does not define __SIZEOF_INT__ deduce it from __INT_MAX__
21 * or INT_MAX.
22 */
23#if !defined(__SIZEOF_INT__)
24
25#if defined(__INT_MAX__)
26/* GCC >= 3.3.0 has __<val>__ implicitly defined. */
27#define __Z_INT_MAX __INT_MAX__
28#else
29/* Fall back to POSIX versions from <limits.h> */
30#define __Z_INT_MAX INT_MAX
31#include <limits.h>
32#endif
33
34#if __Z_INT_MAX == 0x7fff
35#define __SIZEOF_INT__ 2
36#elif __Z_INT_MAX == 0x7fffffffL
37#define __SIZEOF_INT__ 4
38#elif __Z_INT_MAX > 0x7fffffffL
39#define __SIZEOF_INT__ 8
40#endif
41
42#undef __Z_INT_MAX
43
44#endif
45
46#if __SIZEOF_INT__ != 4
47#error "unexpected int width"
48#endif
49
50#undef __INT32_TYPE__
51#undef __UINT32_TYPE__
52#undef __INT_FAST32_TYPE__
53#undef __UINT_FAST32_TYPE__
54#undef __INT_LEAST32_TYPE__
55#undef __UINT_LEAST32_TYPE__
56#undef __INT64_TYPE__
57#undef __UINT64_TYPE__
58#undef __INT_FAST64_TYPE__
59#undef __UINT_FAST64_TYPE__
60#undef __INT_LEAST64_TYPE__
61#undef __UINT_LEAST64_TYPE__
62
63#define __INT32_TYPE__ int
64#define __UINT32_TYPE__ unsigned int
65#define __INT_FAST32_TYPE__ __INT32_TYPE__
66#define __UINT_FAST32_TYPE__ __UINT32_TYPE__
67#define __INT_LEAST32_TYPE__ __INT32_TYPE__
68#define __UINT_LEAST32_TYPE__ __UINT32_TYPE__
69#define __INT64_TYPE__ long long int
70#define __UINT64_TYPE__ unsigned long long int
71#define __INT_FAST64_TYPE__ __INT64_TYPE__
72#define __UINT_FAST64_TYPE__ __UINT64_TYPE__
73#define __INT_LEAST64_TYPE__ __INT64_TYPE__
74#define __UINT_LEAST64_TYPE__ __UINT64_TYPE__
75
76/*
77 * The confusion also exists with __INTPTR_TYPE__ which is either an int
78 * (even when __INT32_TYPE__ is a long int) or a long int. Let's redefine
79 * it to a long int to get some uniformity. Doing so also makes it compatible
80 * with LP64 (64-bit) targets where a long is always 64-bit wide.
81 */
82
83#if __SIZEOF_POINTER__ != __SIZEOF_LONG__
84#error "unexpected size difference between pointers and long ints"
85#endif
86
87#undef __INTPTR_TYPE__
88#undef __UINTPTR_TYPE__
89#define __INTPTR_TYPE__ long int
90#define __UINTPTR_TYPE__ long unsigned int
91
92/*
93 * Re-define the INTN_C(value) integer constant expression macros to match the
94 * integer types re-defined above.
95 */
96
97#undef __INT32_C
98#undef __UINT32_C
99#undef __INT64_C
100#undef __UINT64_C
101#define __INT32_C(c) c
102#define __UINT32_C(c) c ## U
103#define __INT64_C(c) c ## LL
104#define __UINT64_C(c) c ## ULL
105
106#endif /* ZEPHYR_INCLUDE_TOOLCHAIN_STDINT_H_ */