10e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens/*===-- include/Support/DataTypes.h - Define fixed size types -----*- C -*-===*\
20e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|*                                                                            *|
30e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|*                     The LLVM Compiler Infrastructure                       *|
40e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|*                                                                            *|
50e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|* This file is distributed under the University of Illinois Open Source      *|
60e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|* License. See LICENSE.TXT for details.                                      *|
70e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|*                                                                            *|
80e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|*===----------------------------------------------------------------------===*|
90e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|*                                                                            *|
100e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|* This file contains definitions to figure out the size of _HOST_ data types.*|
110e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|* This file is important because different host OS's define different macros,*|
120e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|* which makes portability tough.  This file exports the following            *|
130e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|* definitions:                                                               *|
140e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|*                                                                            *|
150e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|*   [u]int(32|64)_t : typedefs for signed and unsigned 32/64 bit system types*|
160e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|*   [U]INT(8|16|32|64)_(MIN|MAX) : Constants for the min and max values.     *|
170e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|*                                                                            *|
180e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|* No library is required when using these functions.                         *|
190e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|*                                                                            *|
200e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens|*===----------------------------------------------------------------------===*/
210e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
220e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens/* Please leave this file C-compatible. */
230e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
240e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#ifndef SUPPORT_DATATYPES_H
250e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define SUPPORT_DATATYPES_H
260e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
270e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define HAVE_INTTYPES_H 1
280e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define HAVE_STDINT_H 1
290e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define HAVE_UINT64_T 1
300e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define HAVE_U_INT64_T 1
310e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
320e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#ifdef __cplusplus
330e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#include <cmath>
340e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#else
350e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#include <math.h>
360e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif
370e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
380e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#ifdef __cplusplus
390e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#include <cinttypes>
400e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#else
410e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#ifdef HAVE_INTTYPES_H
420e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#include <inttypes.h>
430e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif
440e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif
450e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
460e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#ifdef __cplusplus
470e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#include <cstdint>
480e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#else
490e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#ifdef HAVE_STDINT_H
500e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#include <stdint.h>
510e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#else
520e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#error "Compiler must provide an implementation of stdint.h"
530e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif
540e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif
550e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
560e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#ifndef _MSC_VER
570e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
580e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#if !defined(UINT32_MAX)
590e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens# error "The standard header <cstdint> is not C++11 compliant. Must #define "\
600e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens        "__STDC_LIMIT_MACROS before #including Support/DataTypes.h"
610e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif
620e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
630e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#if !defined(UINT32_C)
640e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens# error "The standard header <cstdint> is not C++11 compliant. Must #define "\
650e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens        "__STDC_CONSTANT_MACROS before #including Support/DataTypes.h"
660e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif
670e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
680e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens/* Note that <inttypes.h> includes <stdint.h>, if this is a C99 system. */
690e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#include <sys/types.h>
700e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
710e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#ifdef _AIX
720e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens// GCC is strict about defining large constants: they must have LL modifier.
730e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#undef INT64_MAX
740e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#undef INT64_MIN
750e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif
760e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
770e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens/* Handle incorrect definition of uint64_t as u_int64_t */
780e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#ifndef HAVE_UINT64_T
790e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#ifdef HAVE_U_INT64_T
800e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capenstypedef u_int64_t uint64_t;
810e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#else
820e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens# error "Don't have a definition for uint64_t on this platform"
830e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif
840e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif
850e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
860e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#else /* _MSC_VER */
870e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#ifdef __cplusplus
880e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#include <cstdlib>
890e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#include <cstddef>
900e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#else
910e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#include <stdlib.h>
920e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#include <stddef.h>
930e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif
940e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#include <sys/types.h>
950e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
960e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#if defined(_WIN64)
970e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capenstypedef signed __int64 ssize_t;
980e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#else
990e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capenstypedef signed int ssize_t;
1000e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif /* _WIN64 */
1010e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
1020e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#ifndef HAVE_INTTYPES_H
1030e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define PRId64 "I64d"
1040e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define PRIi64 "I64i"
1050e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define PRIo64 "I64o"
1060e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define PRIu64 "I64u"
1070e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define PRIx64 "I64x"
1080e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define PRIX64 "I64X"
1090e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
1100e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define PRId32 "d"
1110e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define PRIi32 "i"
1120e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define PRIo32 "o"
1130e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define PRIu32 "u"
1140e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define PRIx32 "x"
1150e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define PRIX32 "X"
1160e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif /* HAVE_INTTYPES_H */
1170e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
1180e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif /* _MSC_VER */
1190e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
1200e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens/* Set defaults for constants which we cannot find. */
1210e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#if !defined(INT64_MAX)
1220e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens# define INT64_MAX 9223372036854775807LL
1230e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif
1240e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#if !defined(INT64_MIN)
1250e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens# define INT64_MIN ((-INT64_MAX)-1)
1260e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif
1270e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#if !defined(UINT64_MAX)
1280e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens# define UINT64_MAX 0xffffffffffffffffULL
1290e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif
1300e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
1310e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#ifndef HUGE_VALF
1320e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#define HUGE_VALF (float)HUGE_VAL
1330e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif
1340e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens
1350e0f146bac6a500532f94b4ac8de31057e07ebd1Nicolas Capens#endif /* SUPPORT_DATATYPES_H */
136