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