hwint.h revision 132718
1/* HOST_WIDE_INT definitions for the GNU compiler. 2 Copyright (C) 1998, 2002 Free Software Foundation, Inc. 3 4 This file is part of GCC. 5 6 Provide definitions for macros which depend on HOST_BITS_PER_INT 7 and HOST_BITS_PER_LONG. */ 8 9#ifndef GCC_HWINT_H 10#define GCC_HWINT_H 11 12/* This describes the machine the compiler is hosted on. */ 13#define HOST_BITS_PER_CHAR CHAR_BIT 14#define HOST_BITS_PER_SHORT (CHAR_BIT * SIZEOF_SHORT) 15#define HOST_BITS_PER_INT (CHAR_BIT * SIZEOF_INT) 16#define HOST_BITS_PER_LONG (CHAR_BIT * SIZEOF_LONG) 17 18/* If HAVE_LONG_LONG and SIZEOF_LONG_LONG aren't defined, but 19 GCC_VERSION >= 3000, assume this is the second or later stage of a 20 bootstrap, we do have long long, and it's 64 bits. (This is 21 required by C99; we do have some ports that violate that assumption 22 but they're all cross-compile-only.) Just in case, force a 23 constraint violation if that assumption is incorrect. */ 24#if !defined HAVE_LONG_LONG 25# if GCC_VERSION >= 3000 26# define HAVE_LONG_LONG 1 27# define SIZEOF_LONG_LONG 8 28extern char sizeof_long_long_must_be_8[sizeof(long long) == 8 ? 1 : -1]; 29# endif 30#endif 31 32#ifdef HAVE_LONG_LONG 33# define HOST_BITS_PER_LONGLONG (CHAR_BIT * SIZEOF_LONG_LONG) 34#endif 35#ifdef HAVE___INT64 36# define HOST_BITS_PER___INT64 (CHAR_BIT * SIZEOF___INT64) 37#endif 38 39/* Set HOST_WIDE_INT. This should be the widest efficient host 40 integer type. It can be 32 or 64 bits, except that if we are 41 targeting a machine with 64-bit size_t then it has to be 64 bits. 42 43 With a sane ABI, 'long' is the largest efficient host integer type. 44 Thus, we use that unless we have to use 'long long' or '__int64' 45 because we're targeting a 64-bit machine from a 32-bit host. */ 46 47#if HOST_BITS_PER_LONG >= 64 || !defined NEED_64BIT_HOST_WIDE_INT 48# define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONG 49# define HOST_WIDE_INT long 50#else 51# if HOST_BITS_PER_LONGLONG >= 64 52# define HOST_BITS_PER_WIDE_INT HOST_BITS_PER_LONGLONG 53# define HOST_WIDE_INT long long 54# else 55# if HOST_BITS_PER___INT64 >= 64 56# define HOST_BITS_PER_WIDE_INT HOST_BITS_PER___INT64 57# define HOST_WIDE_INT __int64 58# else 59 #error "Unable to find a suitable type for HOST_WIDE_INT" 60# endif 61# endif 62#endif 63 64/* Various printf format strings for HOST_WIDE_INT. */ 65 66#if HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG 67# define HOST_WIDE_INT_PRINT "l" 68# define HOST_WIDE_INT_PRINT_C "L" 69 /* 'long' might be 32 or 64 bits, and the number of leading zeroes 70 must be tweaked accordingly. */ 71# if HOST_BITS_PER_WIDE_INT == 64 72# define HOST_WIDE_INT_PRINT_DOUBLE_HEX "0x%lx%016lx" 73# else 74# define HOST_WIDE_INT_PRINT_DOUBLE_HEX "0x%lx%08lx" 75# endif 76#else 77# define HOST_WIDE_INT_PRINT "ll" 78# define HOST_WIDE_INT_PRINT_C "LL" 79 /* We can assume that 'long long' is at least 64 bits. */ 80# define HOST_WIDE_INT_PRINT_DOUBLE_HEX "0x%llx%016llx" 81#endif /* HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG */ 82 83#define HOST_WIDE_INT_PRINT_DEC "%" HOST_WIDE_INT_PRINT "d" 84#define HOST_WIDE_INT_PRINT_DEC_C HOST_WIDE_INT_PRINT_DEC HOST_WIDE_INT_PRINT_C 85#define HOST_WIDE_INT_PRINT_UNSIGNED "%" HOST_WIDE_INT_PRINT "u" 86#define HOST_WIDE_INT_PRINT_HEX "0x%" HOST_WIDE_INT_PRINT "x" 87 88/* Set HOST_WIDEST_INT. This is a 64-bit type unless the compiler 89 in use has no 64-bit type at all; in that case it's 32 bits. */ 90 91#if HOST_BITS_PER_WIDE_INT >= 64 \ 92 || (HOST_BITS_PER_LONGLONG < 64 && HOST_BITS_PER___INT64 < 64) 93# define HOST_WIDEST_INT HOST_WIDE_INT 94# define HOST_BITS_PER_WIDEST_INT HOST_BITS_PER_WIDE_INT 95# define HOST_WIDEST_INT_PRINT_DEC HOST_WIDE_INT_PRINT_DEC 96# define HOST_WIDEST_INT_PRINT_DEC_C HOST_WIDE_INT_PRINT_DEC_C 97# define HOST_WIDEST_INT_PRINT_UNSIGNED HOST_WIDE_INT_PRINT_UNSIGNED 98# define HOST_WIDEST_INT_PRINT_HEX HOST_WIDE_INT_PRINT_HEX 99# define HOST_WIDEST_INT_PRINT_DOUBLE_HEX HOST_WIDE_INT_PRINT_DOUBLE_HEX 100#else 101# if HOST_BITS_PER_LONGLONG >= 64 102# define HOST_BITS_PER_WIDEST_INT HOST_BITS_PER_LONGLONG 103# define HOST_WIDEST_INT long long 104# else 105# if HOST_BITS_PER___INT64 >= 64 106# define HOST_BITS_PER_WIDEST_INT HOST_BITS_PER___INT64 107# define HOST_WIDEST_INT __int64 108# else 109 #error "This line should be impossible to reach" 110# endif 111# endif 112# define HOST_WIDEST_INT_PRINT_DEC "%lld" 113# define HOST_WIDEST_INT_PRINT_DEC_C "%lldLL" 114# define HOST_WIDEST_INT_PRINT_UNSIGNED "%llu" 115# define HOST_WIDEST_INT_PRINT_HEX "0x%llx" 116# define HOST_WIDEST_INT_PRINT_DOUBLE_HEX "0x%llx%016llx" 117#endif 118 119#endif /* ! GCC_HWINT_H */ 120