1 /*
2  * Copyright (c) 2019 BayLibre SAS
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 /*
8  * Basic macro definitions that gcc and clang provide on their own
9  * but that xcc lacks. Only those that Zephyr requires are provided here.
10  */
11 
12 #ifndef ZEPHYR_INCLUDE_TOOLCHAIN_XCC_MISSING_DEFS_H_
13 #define ZEPHYR_INCLUDE_TOOLCHAIN_XCC_MISSING_DEFS_H_
14 
15 #if __CHAR_BIT__ == 8
16 #define __SCHAR_WIDTH__ 8
17 #else
18 #error "unexpected __CHAR_BIT__ value"
19 #endif
20 
21 #if __SHRT_MAX__ == 32767
22 #define __SHRT_WIDTH__ 16
23 #define __SIZEOF_SHORT__ 2
24 #else
25 #error "unexpected __SHRT_WIDTH__ value"
26 #endif
27 
28 #if __INT_MAX__ == 2147483647
29 #define __INT_WIDTH__ 32
30 #define __SIZEOF_INT__ 4
31 #else
32 #error "unexpected __INT_MAX__ value"
33 #endif
34 
35 #if __LONG_MAX__ == 2147483647L
36 #define __LONG_WIDTH__ 32
37 #define __SIZEOF_LONG__ 4
38 #else
39 #error "unexpected __LONG_MAX__ value"
40 #endif
41 
42 #if __LONG_LONG_MAX__ == 9223372036854775807LL
43 #define __LONG_LONG_WIDTH__ 64
44 #define __SIZEOF_LONG_LONG__ 8
45 #else
46 #error "unexpected __LONG_LONG_MAX__ value"
47 #endif
48 
49 #if __INTMAX_MAX__ == 9223372036854775807LL
50 #define __INTMAX_WIDTH__ 64
51 #define __SIZEOF_INTMAX__ 8
52 #define __UINTMAX_MAX__ 0xffffffffffffffffULL
53 #define __UINTMAX_WIDTH__ 64
54 #define __SIZEOF_UINTMAX__ 8
55 #else
56 #error "unexpected __INTMAX_MAX__ value"
57 #endif
58 
59 /*
60  * No xcc provided definitions related to pointers, so let's just enforce
61  * the Zephyr expected type.
62  */
63 
64 #define __INTPTR_MAX__ 0x7fffffffL
65 #define __INTPTR_TYPE__ long int
66 #define __INTPTR_WIDTH__ 32
67 #define __SIZEOF_POINTER__ 4
68 
69 #define __PTRDIFF_MAX__ 0x7fffffffL
70 #define __PTRDIFF_WIDTH__ 32
71 #define __SIZEOF_PTRDIFF_T__ 4
72 
73 #define __UINTPTR_MAX__ 0xffffffffLU
74 #define __UINTPTR_TYPE__ long unsigned int
75 
76 /*
77  * xcc already defines __SIZE_TYPE__ as "unsigned int" but there is no way
78  * to safeguard that here with preprocessor equality.
79  */
80 
81 #define __SIZE_MAX__ 0xffffffffU
82 #define __SIZE_WIDTH__ 32
83 #define __SIZEOF_SIZE_T__ 4
84 
85 /*
86  * The following defines are inferred from the xcc provided defines
87  * already tested above.
88  */
89 
90 #define __INT8_MAX__ 0x7f
91 #define __INT8_TYPE__ signed char
92 
93 #define __INT16_MAX__ 0x7fff
94 #define __INT16_TYPE__ short int
95 
96 #define __INT32_MAX__ 0x7fffffff
97 #define __INT32_TYPE__ int
98 
99 #define __INT64_MAX__ 0x7fffffffffffffffLL
100 #define __INT64_TYPE__ long long int
101 
102 #define __INT_FAST8_MAX__ 0x7f
103 #define __INT_FAST8_TYPE__ signed char
104 #define __INT_FAST8_WIDTH__ 8
105 
106 #define __INT_FAST16_MAX__ 0x7fffffff
107 #define __INT_FAST16_TYPE__ int
108 #define __INT_FAST16_WIDTH__ 32
109 
110 #define __INT_FAST32_MAX__ 0x7fffffff
111 #define __INT_FAST32_TYPE__ int
112 #define __INT_FAST32_WIDTH__ 32
113 
114 #define __INT_FAST64_MAX__ 0x7fffffffffffffffLL
115 #define __INT_FAST64_TYPE__ long long int
116 #define __INT_FAST64_WIDTH__ 64
117 
118 #define __INT_LEAST8_MAX__ 0x7f
119 #define __INT_LEAST8_TYPE__ signed char
120 #define __INT_LEAST8_WIDTH__ 8
121 
122 #define __INT_LEAST16_MAX__ 0x7fff
123 #define __INT_LEAST16_TYPE__ short int
124 #define __INT_LEAST16_WIDTH__ 16
125 
126 #define __INT_LEAST32_MAX__ 0x7fffffff
127 #define __INT_LEAST32_TYPE__ int
128 #define __INT_LEAST32_WIDTH__ 32
129 
130 #define __INT_LEAST64_MAX__ 0x7fffffffffffffffLL
131 #define __INT_LEAST64_TYPE__ long long int
132 #define __INT_LEAST64_WIDTH__ 64
133 
134 #define __UINT8_MAX__ 0xffU
135 #define __UINT8_TYPE__ unsigned char
136 
137 #define __UINT16_MAX__ 0xffffU
138 #define __UINT16_TYPE__ short unsigned int
139 
140 #define __UINT32_MAX__ 0xffffffffU
141 #define __UINT32_TYPE__ unsigned int
142 
143 #define __UINT64_MAX__ 0xffffffffffffffffULL
144 #define __UINT64_TYPE__ long long unsigned int
145 
146 #define __UINT_FAST8_MAX__ 0xffU
147 #define __UINT_FAST8_TYPE__ unsigned char
148 
149 #define __UINT_FAST16_MAX__ 0xffffffffU
150 #define __UINT_FAST16_TYPE__ unsigned int
151 
152 #define __UINT_FAST32_MAX__ 0xffffffffU
153 #define __UINT_FAST32_TYPE__ unsigned int
154 
155 #define __UINT_FAST64_MAX__ 0xffffffffffffffffULL
156 #define __UINT_FAST64_TYPE__ long long unsigned int
157 
158 #define __UINT_LEAST8_MAX__ 0xffU
159 #define __UINT_LEAST8_TYPE__ unsigned char
160 
161 #define __UINT_LEAST16_MAX__ 0xffffU
162 #define __UINT_LEAST16_TYPE__ short unsigned int
163 
164 #define __UINT_LEAST32_MAX__ 0xffffffffU
165 #define __UINT_LEAST32_TYPE__ unsigned int
166 
167 #define __UINT_LEAST64_MAX__ 0xffffffffffffffffULL
168 #define __UINT_LEAST64_TYPE__ long long unsigned int
169 
170 #endif
171