1 /*
2 Copyright (c) 1982, 1986, 1993
3 The Regents of the University of California.  All rights reserved.
4 
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions
7 are met:
8 1. Redistributions of source code must retain the above copyright
9 notice, this list of conditions and the following disclaimer.
10 2. Redistributions in binary form must reproduce the above copyright
11 notice, this list of conditions and the following disclaimer in the
12 documentation and/or other materials provided with the distribution.
13 3. Neither the name of the University nor the names of its contributors
14 may be used to endorse or promote products derived from this software
15 without specific prior written permission.
16 
17 THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 SUCH DAMAGE.
28  */
29 #ifndef __SYS_CONFIG_H__
30 #define __SYS_CONFIG_H__
31 
32 #include <machine/ieeefp.h>  /* floating point macros */
33 #include <sys/features.h>	/* POSIX defs */
34 #include <float.h>
35 #include <newlib.h>
36 
37 #ifdef __aarch64__
38 #define MALLOC_ALIGNMENT 16
39 #endif
40 
41 #ifdef __AMDGCN__
42 #define __DYNAMIC_REENT__
43 #endif
44 
45 /* exceptions first */
46 #if defined(__H8500__) || defined(__W65__)
47 #define __SMALL_BITFIELDS
48 /* ???  This conditional is true for the h8500 and the w65, defining H8300
49    in those cases probably isn't the right thing to do.  */
50 #define H8300 1
51 #endif
52 
53 /* 16 bit integer machines */
54 #if defined(__Z8001__) || defined(__Z8002__) || defined(__H8500__) || defined(__W65__) || defined (__mn10200__) || defined (__AVR__) || defined (__MSP430__)
55 
56 #undef INT_MAX
57 #undef UINT_MAX
58 #define INT_MAX 32767
59 #define UINT_MAX 65535
60 #endif
61 
62 #if defined (__H8300__) || defined (__H8300H__) || defined(__H8300S__) || defined (__H8300SX__)
63 #define __SMALL_BITFIELDS
64 #define H8300 1
65 #undef INT_MAX
66 #undef UINT_MAX
67 #define INT_MAX __INT_MAX__
68 #define UINT_MAX (__INT_MAX__ * 2U + 1)
69 #endif
70 
71 #if (defined(__CR16__) || defined(__CR16C__) ||defined(__CR16CP__))
72 #ifndef __INT32__
73 #define __SMALL_BITFIELDS
74 #undef INT_MAX
75 #undef UINT_MAX
76 #define INT_MAX 32767
77 #define UINT_MAX (__INT_MAX__ * 2U + 1)
78 #else /* INT32 */
79 #undef INT_MAX
80 #undef UINT_MAX
81 #define INT_MAX 2147483647
82 #define UINT_MAX (__INT_MAX__ * 2U + 1)
83 #endif /* INT32 */
84 
85 #endif /* CR16C */
86 
87 #if defined (__xc16x__) || defined (__xc16xL__) || defined (__xc16xS__)
88 #define __SMALL_BITFIELDS
89 #endif
90 
91 #ifdef __W65__
92 #define __SMALL_BITFIELDS
93 #endif
94 
95 #if defined(__D10V__)
96 #define __SMALL_BITFIELDS
97 #undef INT_MAX
98 #undef UINT_MAX
99 #define INT_MAX __INT_MAX__
100 #define UINT_MAX (__INT_MAX__ * 2U + 1)
101 #define _POINTER_INT short
102 #endif
103 
104 #if defined(__mc68hc11__) || defined(__mc68hc12__) || defined(__mc68hc1x__)
105 #undef INT_MAX
106 #undef UINT_MAX
107 #define INT_MAX __INT_MAX__
108 #define UINT_MAX (__INT_MAX__ * 2U + 1)
109 #define _POINTER_INT short
110 #endif
111 
112 #ifdef ___AM29K__
113 #define _FLOAT_RET double
114 #endif
115 
116 #ifdef __i386__
117 #ifndef __unix__
118 /* in other words, go32 */
119 #define _FLOAT_RET double
120 #endif
121 #if defined(__linux__) || defined(__RDOS__)
122 /* we want the reentrancy structure to be returned by a function */
123 #define __DYNAMIC_REENT__
124 #define HAVE_GETDATE
125 #ifndef __LARGE64_FILES
126 #define __LARGE64_FILES 1
127 #endif
128 /* we use some glibc header files so turn on glibc large file feature */
129 #define _LARGEFILE64_SOURCE 1
130 #endif
131 #endif
132 
133 #ifdef __mn10200__
134 #define __SMALL_BITFIELDS
135 #endif
136 
137 #ifdef __AVR__
138 #define __SMALL_BITFIELDS
139 #define _POINTER_INT short
140 #endif
141 
142 #if defined(__v850) && !defined(__rtems__)
143 #define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__sda__))
144 #endif
145 
146 /* For the PowerPC eabi, force the _impure_ptr to be in .sdata */
147 #if defined(__PPC__)
148 #if defined(_CALL_SYSV)
149 #define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__section__(".sdata")))
150 #endif
151 #ifdef __SPE__
152 #define _LONG_DOUBLE double
153 #endif
154 #endif
155 
156 /* Configure small REENT structure for Xilinx MicroBlaze platforms */
157 #if defined (__MICROBLAZE__) && !defined(__rtems__)
158 #ifndef _REENT_SMALL
159 #define _REENT_SMALL
160 #endif
161 /* Xilinx XMK uses Unix98 mutex */
162 #ifdef __XMK__
163 #define _UNIX98_THREAD_MUTEX_ATTRIBUTES
164 #endif
165 #endif
166 
167 #if defined(__mips__) && !defined(__rtems__)
168 #define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__section__(".sdata")))
169 #endif
170 
171 #ifdef __xstormy16__
172 #define __SMALL_BITFIELDS
173 #undef INT_MAX
174 #undef UINT_MAX
175 #define INT_MAX __INT_MAX__
176 #define UINT_MAX (__INT_MAX__ * 2U + 1)
177 #define MALLOC_ALIGNMENT 8
178 #define _POINTER_INT short
179 #define __BUFSIZ__ 16
180 #define _REENT_SMALL
181 #endif
182 
183 #if defined __MSP430__
184 #ifndef _REENT_SMALL
185 #define _REENT_SMALL
186 #endif
187 
188 #define __BUFSIZ__ 256
189 #define __SMALL_BITFIELDS
190 
191 #ifdef __MSP430X_LARGE__
192 #define _POINTER_INT __int20
193 #else
194 #define _POINTER_INT int
195 #endif
196 #endif
197 
198 #ifdef __m32c__
199 #define __SMALL_BITFIELDS
200 #undef INT_MAX
201 #undef UINT_MAX
202 #define INT_MAX __INT_MAX__
203 #define UINT_MAX (__INT_MAX__ * 2U + 1)
204 #define MALLOC_ALIGNMENT 8
205 #if defined(__r8c_cpu__) || defined(__m16c_cpu__)
206 #define _POINTER_INT short
207 #else
208 #define _POINTER_INT long
209 #endif
210 #define __BUFSIZ__ 16
211 #define _REENT_SMALL
212 #endif /* __m32c__ */
213 
214 #ifdef __SPU__
215 #define MALLOC_ALIGNMENT 16
216 #define __CUSTOM_FILE_IO__
217 #endif
218 
219 #if defined(__or1k__) || defined(__or1knd__)
220 #define __DYNAMIC_REENT__
221 #endif
222 
223 /* This block should be kept in sync with GCC's limits.h.  The point
224    of having these definitions here is to not include limits.h, which
225    would pollute the user namespace, while still using types of the
226    the correct widths when deciding how to define __int32_t and
227    __int64_t.  */
228 #ifndef __INT_MAX__
229 # ifdef INT_MAX
230 #  define __INT_MAX__ INT_MAX
231 # else
232 #  define __INT_MAX__ 2147483647
233 # endif
234 #endif
235 
236 #ifndef __LONG_MAX__
237 # ifdef LONG_MAX
238 #  define __LONG_MAX__ LONG_MAX
239 # else
240 #  if defined (__alpha__) || (defined (__sparc__) && defined(__arch64__)) \
241       || defined (__sparcv9)
242 #   define __LONG_MAX__ 9223372036854775807L
243 #  else
244 #   define __LONG_MAX__ 2147483647L
245 #  endif /* __alpha__ || sparc64 */
246 # endif
247 #endif
248 /* End of block that should be kept in sync with GCC's limits.h.  */
249 
250 #ifndef _POINTER_INT
251 #define _POINTER_INT long
252 #endif
253 
254 #ifdef __frv__
255 #define __ATTRIBUTE_IMPURE_PTR__ __attribute__((__section__(".sdata")))
256 #endif
257 #undef __RAND_MAX
258 #if __INT_MAX__ == 32767
259 #define __RAND_MAX 32767
260 #else
261 #define __RAND_MAX 0x7fffffff
262 #endif
263 
264 #if defined(__CYGWIN__)
265 #include <cygwin/config.h>
266 #endif
267 
268 #if defined(__rtems__)
269 #define __FILENAME_MAX__ 255
270 #define __DYNAMIC_REENT__
271 #endif
272 
273 #ifndef __EXPORT
274 #define __EXPORT
275 #endif
276 
277 #ifndef __IMPORT
278 #define __IMPORT
279 #endif
280 
281 #ifndef __WCHAR_MAX__
282 #if __INT_MAX__ == 32767 || defined (_WIN32)
283 #define __WCHAR_MAX__ 0xffffu
284 #endif
285 #endif
286 
287 #ifdef PICOLIBC_TLS
288 #define NEWLIB_THREAD_LOCAL __thread
289 #else
290 #define NEWLIB_THREAD_LOCAL
291 #endif
292 
293 /* See if small reent asked for at configuration time and
294    is not chosen by the platform by default.  */
295 #ifdef _WANT_REENT_SMALL
296 #ifndef _REENT_SMALL
297 #define _REENT_SMALL
298 #endif
299 #endif
300 
301 #ifdef _WANT_USE_LONG_TIME_T
302 #ifndef _USE_LONG_TIME_T
303 #define _USE_LONG_TIME_T
304 #endif
305 #endif
306 
307 #ifdef _WANT_USE_GDTOA
308 #ifndef _USE_GDTOA
309 #define _USE_GDTOA
310 #endif
311 #endif
312 
313 #ifdef _WANT_REENT_BACKWARD_BINARY_COMPAT
314 #ifndef _REENT_BACKWARD_BINARY_COMPAT
315 #define _REENT_BACKWARD_BINARY_COMPAT
316 #endif
317 #endif
318 
319 #define _REENT_THREAD_LOCAL
320 
321 /* If _MB_EXTENDED_CHARSETS_ALL is set, we want all of the extended
322    charsets.  The extended charsets add a few functions and a couple
323    of tables of a few K each. */
324 #ifdef _MB_EXTENDED_CHARSETS_ALL
325 #define _MB_EXTENDED_CHARSETS_ISO 1
326 #define _MB_EXTENDED_CHARSETS_WINDOWS 1
327 #endif
328 
329 /* Figure out if long double is the same size as double. If the system
330  * doesn't provide long double, then those values will be undefined
331  * and cpp will substitute 0 for them in the test
332  */
333 #if LDBL_MANT_DIG == DBL_MANT_DIG && LDBL_MIN_EXP == DBL_MIN_EXP && \
334     LDBL_MAX_EXP == DBL_MAX_EXP
335 #define _LDBL_EQ_DBL
336 #endif
337 
338 /* Newlib doesn't fully support long double math functions so far.
339    On platforms where long double equals double the long double functions
340    simply call the double functions.  On Cygwin the long double functions
341    are implemented independently from newlib to be able to use optimized
342    assembler functions despite using the Microsoft x86_64 ABI. */
343 #if defined (_LDBL_EQ_DBL) || defined (__CYGWIN__) || (defined(__SIZEOF_LONG_DOUBLE__) && __SIZEOF_LONG_DOUBLE__ <= 8) || (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113)
344 #define _HAVE_LONG_DOUBLE_MATH
345 #endif
346 
347 /*
348  * When the address sanitizer is enabled, we must prevent the library
349  * from even reading beyond the end of input data. This happens in
350  * many optimized string functions.
351  */
352 #ifdef __has_feature
353 #if __has_feature(address_sanitizer)
354 #define PICOLIBC_NO_OUT_OF_BOUNDS_READS
355 #endif
356 #elif defined(__SANITIZE_ADDRESS__)
357 #define PICOLIBC_NO_OUT_OF_BOUNDS_READS
358 #endif
359 
360 #endif /* __SYS_CONFIG_H__ */
361