1/*===-- include/Support/DataTypes.h - Define fixed size types -----*- C -*-===*\
2|*                                                                            *|
3|*                     The LLVM Compiler Infrastructure                       *|
4|*                                                                            *|
5|* This file is distributed under the University of Illinois Open Source      *|
6|* License. See LICENSE.TXT for details.                                      *|
7|*                                                                            *|
8|*===----------------------------------------------------------------------===*|
9|*                                                                            *|
10|* This file contains definitions to figure out the size of _HOST_ data types.*|
11|* This file is important because different host OS's define different macros,*|
12|* which makes portability tough.  This file exports the following            *|
13|* definitions:                                                               *|
14|*                                                                            *|
15|*   [u]int(32|64)_t : typedefs for signed and unsigned 32/64 bit system types*|
16|*   [U]INT(8|16|32|64)_(MIN|MAX) : Constants for the min and max values.     *|
17|*                                                                            *|
18|* No library is required when using these functions.                         *|
19|*                                                                            *|
20|*===----------------------------------------------------------------------===*/
21
22/* Please leave this file C-compatible. */
23
24#ifndef SUPPORT_DATATYPES_H
25#define SUPPORT_DATATYPES_H
26
27#define HAVE_INTTYPES_H 1
28#define HAVE_STDINT_H 1
29#define HAVE_UINT64_T 1
30#define HAVE_U_INT64_T 1
31
32#ifdef __cplusplus
33#include <cmath>
34#else
35#include <math.h>
36#endif
37
38#ifdef __cplusplus
39#include <cinttypes>
40#else
41#ifdef HAVE_INTTYPES_H
42#include <inttypes.h>
43#endif
44#endif
45
46#ifdef __cplusplus
47#include <cstdint>
48#else
49#ifdef HAVE_STDINT_H
50#include <stdint.h>
51#else
52#error "Compiler must provide an implementation of stdint.h"
53#endif
54#endif
55
56#ifndef _MSC_VER
57
58#if !defined(UINT32_MAX)
59# error "The standard header <cstdint> is not C++11 compliant. Must #define "\
60        "__STDC_LIMIT_MACROS before #including Support/DataTypes.h"
61#endif
62
63#if !defined(UINT32_C)
64# error "The standard header <cstdint> is not C++11 compliant. Must #define "\
65        "__STDC_CONSTANT_MACROS before #including Support/DataTypes.h"
66#endif
67
68/* Note that <inttypes.h> includes <stdint.h>, if this is a C99 system. */
69#include <sys/types.h>
70
71#ifdef _AIX
72// GCC is strict about defining large constants: they must have LL modifier.
73#undef INT64_MAX
74#undef INT64_MIN
75#endif
76
77/* Handle incorrect definition of uint64_t as u_int64_t */
78#ifndef HAVE_UINT64_T
79#ifdef HAVE_U_INT64_T
80typedef u_int64_t uint64_t;
81#else
82# error "Don't have a definition for uint64_t on this platform"
83#endif
84#endif
85
86#else /* _MSC_VER */
87#ifdef __cplusplus
88#include <cstdlib>
89#include <cstddef>
90#else
91#include <stdlib.h>
92#include <stddef.h>
93#endif
94#include <sys/types.h>
95
96#if defined(_WIN64)
97typedef signed __int64 ssize_t;
98#else
99typedef signed int ssize_t;
100#endif /* _WIN64 */
101
102#ifndef HAVE_INTTYPES_H
103#define PRId64 "I64d"
104#define PRIi64 "I64i"
105#define PRIo64 "I64o"
106#define PRIu64 "I64u"
107#define PRIx64 "I64x"
108#define PRIX64 "I64X"
109
110#define PRId32 "d"
111#define PRIi32 "i"
112#define PRIo32 "o"
113#define PRIu32 "u"
114#define PRIx32 "x"
115#define PRIX32 "X"
116#endif /* HAVE_INTTYPES_H */
117
118#endif /* _MSC_VER */
119
120/* Set defaults for constants which we cannot find. */
121#if !defined(INT64_MAX)
122# define INT64_MAX 9223372036854775807LL
123#endif
124#if !defined(INT64_MIN)
125# define INT64_MIN ((-INT64_MAX)-1)
126#endif
127#if !defined(UINT64_MAX)
128# define UINT64_MAX 0xffffffffffffffffULL
129#endif
130
131#ifndef HUGE_VALF
132#define HUGE_VALF (float)HUGE_VAL
133#endif
134
135#endif /* SUPPORT_DATATYPES_H */
136