1226633Sdim/*===-- include/Support/DataTypes.h - Define fixed size types -----*- C -*-===*\
2218885Sdim|*                                                                            *|
3218885Sdim|*                     The LLVM Compiler Infrastructure                       *|
4218885Sdim|*                                                                            *|
5218885Sdim|* This file is distributed under the University of Illinois Open Source      *|
6218885Sdim|* License. See LICENSE.TXT for details.                                      *|
7218885Sdim|*                                                                            *|
8218885Sdim|*===----------------------------------------------------------------------===*|
9218885Sdim|*                                                                            *|
10218885Sdim|* This file contains definitions to figure out the size of _HOST_ data types.*|
11218885Sdim|* This file is important because different host OS's define different macros,*|
12218885Sdim|* which makes portability tough.  This file exports the following            *|
13218885Sdim|* definitions:                                                               *|
14218885Sdim|*                                                                            *|
15218885Sdim|*   [u]int(32|64)_t : typedefs for signed and unsigned 32/64 bit system types*|
16218885Sdim|*   [U]INT(8|16|32|64)_(MIN|MAX) : Constants for the min and max values.     *|
17218885Sdim|*                                                                            *|
18218885Sdim|* No library is required when using these functions.                         *|
19218885Sdim|*                                                                            *|
20218885Sdim|*===----------------------------------------------------------------------===*/
21218885Sdim
22218885Sdim/* Please leave this file C-compatible. */
23218885Sdim
24226633Sdim/* Please keep this file in sync with DataTypes.h.cmake */
25226633Sdim
26218885Sdim#ifndef SUPPORT_DATATYPES_H
27218885Sdim#define SUPPORT_DATATYPES_H
28218885Sdim
29218885Sdim#undef HAVE_INTTYPES_H
30218885Sdim#undef HAVE_STDINT_H
31218885Sdim#undef HAVE_UINT64_T
32218885Sdim#undef HAVE_U_INT64_T
33218885Sdim
34218885Sdim#ifdef __cplusplus
35218885Sdim#include <cmath>
36218885Sdim#else
37218885Sdim#include <math.h>
38218885Sdim#endif
39218885Sdim
40226633Sdim#ifndef _MSC_VER
41226633Sdim
42218885Sdim/* Note that this header's correct operation depends on __STDC_LIMIT_MACROS
43218885Sdim   being defined.  We would define it here, but in order to prevent Bad Things
44218885Sdim   happening when system headers or C++ STL headers include stdint.h before we
45218885Sdim   define it here, we define it on the g++ command line (in Makefile.rules). */
46218885Sdim#if !defined(__STDC_LIMIT_MACROS)
47226633Sdim# error "Must #define __STDC_LIMIT_MACROS before #including Support/DataTypes.h"
48218885Sdim#endif
49218885Sdim
50218885Sdim#if !defined(__STDC_CONSTANT_MACROS)
51218885Sdim# error "Must #define __STDC_CONSTANT_MACROS before " \
52226633Sdim        "#including Support/DataTypes.h"
53218885Sdim#endif
54218885Sdim
55218885Sdim/* Note that <inttypes.h> includes <stdint.h>, if this is a C99 system. */
56218885Sdim#include <sys/types.h>
57218885Sdim
58218885Sdim#ifdef HAVE_INTTYPES_H
59218885Sdim#include <inttypes.h>
60218885Sdim#endif
61218885Sdim
62218885Sdim#ifdef HAVE_STDINT_H
63218885Sdim#include <stdint.h>
64218885Sdim#endif
65218885Sdim
66218885Sdim#ifdef _AIX
67218885Sdim#include "llvm/Support/AIXDataTypesFix.h"
68218885Sdim#endif
69218885Sdim
70218885Sdim/* Handle incorrect definition of uint64_t as u_int64_t */
71218885Sdim#ifndef HAVE_UINT64_T
72218885Sdim#ifdef HAVE_U_INT64_T
73218885Sdimtypedef u_int64_t uint64_t;
74218885Sdim#else
75218885Sdim# error "Don't have a definition for uint64_t on this platform"
76218885Sdim#endif
77218885Sdim#endif
78218885Sdim
79226633Sdim#else /* _MSC_VER */
80226633Sdim/* Visual C++ doesn't provide standard integer headers, but it does provide
81226633Sdim   built-in data types. */
82226633Sdim#include <stdlib.h>
83226633Sdim#include <stddef.h>
84226633Sdim#include <sys/types.h>
85226633Sdim#ifdef __cplusplus
86226633Sdim#include <cmath>
87226633Sdim#else
88226633Sdim#include <math.h>
89226633Sdim#endif
90226633Sdimtypedef __int64 int64_t;
91226633Sdimtypedef unsigned __int64 uint64_t;
92226633Sdimtypedef signed int int32_t;
93226633Sdimtypedef unsigned int uint32_t;
94226633Sdimtypedef short int16_t;
95226633Sdimtypedef unsigned short uint16_t;
96226633Sdimtypedef signed char int8_t;
97226633Sdimtypedef unsigned char uint8_t;
98263508Sdim#if defined(_WIN64)
99263508Sdim  typedef signed __int64 ssize_t;
100263508Sdim#else
101263508Sdim  typedef signed int ssize_t;
102263508Sdim#endif
103263508Sdim
104226633Sdim#ifndef INT8_MAX
105226633Sdim# define INT8_MAX 127
106226633Sdim#endif
107226633Sdim#ifndef INT8_MIN
108226633Sdim# define INT8_MIN -128
109226633Sdim#endif
110226633Sdim#ifndef UINT8_MAX
111226633Sdim# define UINT8_MAX 255
112226633Sdim#endif
113226633Sdim#ifndef INT16_MAX
114226633Sdim# define INT16_MAX 32767
115226633Sdim#endif
116226633Sdim#ifndef INT16_MIN
117226633Sdim# define INT16_MIN -32768
118226633Sdim#endif
119226633Sdim#ifndef UINT16_MAX
120226633Sdim# define UINT16_MAX 65535
121226633Sdim#endif
122226633Sdim#ifndef INT32_MAX
123226633Sdim# define INT32_MAX 2147483647
124226633Sdim#endif
125226633Sdim#ifndef INT32_MIN
126226633Sdim/* MSC treats -2147483648 as -(2147483648U). */
127226633Sdim# define INT32_MIN (-INT32_MAX - 1)
128226633Sdim#endif
129226633Sdim#ifndef UINT32_MAX
130226633Sdim# define UINT32_MAX 4294967295U
131226633Sdim#endif
132226633Sdim/* Certain compatibility updates to VC++ introduce the `cstdint'
133226633Sdim * header, which defines the INT*_C macros. On default installs they
134226633Sdim * are absent. */
135226633Sdim#ifndef INT8_C
136226633Sdim# define INT8_C(C)   C##i8
137226633Sdim#endif
138226633Sdim#ifndef UINT8_C
139226633Sdim# define UINT8_C(C)  C##ui8
140226633Sdim#endif
141226633Sdim#ifndef INT16_C
142226633Sdim# define INT16_C(C)  C##i16
143226633Sdim#endif
144226633Sdim#ifndef UINT16_C
145226633Sdim# define UINT16_C(C) C##ui16
146226633Sdim#endif
147226633Sdim#ifndef INT32_C
148226633Sdim# define INT32_C(C)  C##i32
149226633Sdim#endif
150226633Sdim#ifndef UINT32_C
151226633Sdim# define UINT32_C(C) C##ui32
152226633Sdim#endif
153226633Sdim#ifndef INT64_C
154226633Sdim# define INT64_C(C)  C##i64
155226633Sdim#endif
156226633Sdim#ifndef UINT64_C
157226633Sdim# define UINT64_C(C) C##ui64
158226633Sdim#endif
159226633Sdim
160234353Sdim#ifndef PRId64
161234353Sdim# define PRId64 "I64d"
162234353Sdim#endif
163234353Sdim#ifndef PRIi64
164234353Sdim# define PRIi64 "I64i"
165234353Sdim#endif
166234353Sdim#ifndef PRIo64
167234353Sdim# define PRIo64 "I64o"
168234353Sdim#endif
169234353Sdim#ifndef PRIu64
170234353Sdim# define PRIu64 "I64u"
171234353Sdim#endif
172226633Sdim#ifndef PRIx64
173226633Sdim# define PRIx64 "I64x"
174226633Sdim#endif
175234353Sdim#ifndef PRIX64
176234353Sdim# define PRIX64 "I64X"
177234353Sdim#endif
178226633Sdim
179226633Sdim#endif /* _MSC_VER */
180226633Sdim
181218885Sdim/* Set defaults for constants which we cannot find. */
182218885Sdim#if !defined(INT64_MAX)
183218885Sdim# define INT64_MAX 9223372036854775807LL
184218885Sdim#endif
185218885Sdim#if !defined(INT64_MIN)
186218885Sdim# define INT64_MIN ((-INT64_MAX)-1)
187218885Sdim#endif
188218885Sdim#if !defined(UINT64_MAX)
189218885Sdim# define UINT64_MAX 0xffffffffffffffffULL
190218885Sdim#endif
191218885Sdim
192218885Sdim#if __GNUC__ > 3
193218885Sdim#define END_WITH_NULL __attribute__((sentinel))
194218885Sdim#else
195218885Sdim#define END_WITH_NULL
196218885Sdim#endif
197218885Sdim
198218885Sdim#ifndef HUGE_VALF
199218885Sdim#define HUGE_VALF (float)HUGE_VAL
200218885Sdim#endif
201218885Sdim
202218885Sdim#endif  /* SUPPORT_DATATYPES_H */
203