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 #if __SIZEOF_INT__ != 4
20 #error "unexpected int width"
21 #endif
22 
23 #undef __INT32_TYPE__
24 #undef __UINT32_TYPE__
25 #undef __INT_FAST32_TYPE__
26 #undef __UINT_FAST32_TYPE__
27 #undef __INT_LEAST32_TYPE__
28 #undef __UINT_LEAST32_TYPE__
29 #undef __INT64_TYPE__
30 #undef __UINT64_TYPE__
31 #undef __INT_FAST64_TYPE__
32 #undef __UINT_FAST64_TYPE__
33 #undef __INT_LEAST64_TYPE__
34 #undef __UINT_LEAST64_TYPE__
35 
36 #define __INT32_TYPE__ int
37 #define __UINT32_TYPE__ unsigned int
38 #define __INT_FAST32_TYPE__ __INT32_TYPE__
39 #define __UINT_FAST32_TYPE__ __UINT32_TYPE__
40 #define __INT_LEAST32_TYPE__ __INT32_TYPE__
41 #define __UINT_LEAST32_TYPE__ __UINT32_TYPE__
42 #define __INT64_TYPE__ long long int
43 #define __UINT64_TYPE__ unsigned long long int
44 #define __INT_FAST64_TYPE__ __INT64_TYPE__
45 #define __UINT_FAST64_TYPE__ __UINT64_TYPE__
46 #define __INT_LEAST64_TYPE__ __INT64_TYPE__
47 #define __UINT_LEAST64_TYPE__ __UINT64_TYPE__
48 
49 /*
50  * The confusion also exists with __INTPTR_TYPE__ which is either an int
51  * (even when __INT32_TYPE__ is a long int) or a long int. Let's redefine
52  * it to a long int to get some uniformity. Doing so also makes it compatible
53  * with LP64 (64-bit) targets where a long is always 64-bit wide.
54  */
55 
56 #if __SIZEOF_POINTER__ != __SIZEOF_LONG__
57 #error "unexpected size difference between pointers and long ints"
58 #endif
59 
60 #undef __INTPTR_TYPE__
61 #undef __UINTPTR_TYPE__
62 #define __INTPTR_TYPE__ long int
63 #define __UINTPTR_TYPE__ long unsigned int
64 
65 /*
66  * Re-define the INTN_C(value) integer constant expression macros to match the
67  * integer types re-defined above.
68  */
69 
70 #undef __INT32_C
71 #undef __UINT32_C
72 #undef __INT64_C
73 #undef __UINT64_C
74 #define __INT32_C(c) c
75 #define __UINT32_C(c) c ## U
76 #define __INT64_C(c) c ## LL
77 #define __UINT64_C(c) c ## ULL
78 
79 #endif /* ZEPHYR_INCLUDE_TOOLCHAIN_STDINT_H_ */
80