PATCH: Use "%I64d" on Windows
Mark Mitchell
mark@codesourcery.com
Wed Nov 24 06:05:00 GMT 2004
The Windows C library uses "%I64d", not "%lld", to print arguments of
type "long long".
GCC will complain that this is an unknown printf-format on Windows;
the fix will be to use the machinery added for Solaris 10 to handle
the various Windows-specific formats.
Tested by building a cross-compiler to Windows for mips64-none-elf,
and looking at the generated .i files, applied on the mainline.
Although I did not heavily test the compiler built in this way, I did
test a very similar compiler built for a customer using this same
patch.
--
Mark Mitchell
CodeSourcery, LLC
mark@codesourcery.com
2004-11-23 Mark Mitchell <mark@codesourcery.com>
* hwint.h (HOST_LONG_LONG_FORMAT): New macro. Use it throughout.
* config/i386/xm-mingw32.h (HOST_LONG_LONG_FORMAT): Define.
* doc/hostconfig.texi (HOST_LONG_LONG_FORMAT): Document.
Index: hwint.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/hwint.h,v
retrieving revision 1.19
diff -c -5 -p -r1.19 hwint.h
*** hwint.h 15 Oct 2004 14:47:08 -0000 1.19
--- hwint.h 24 Nov 2004 04:25:08 -0000
***************
*** 13,22 ****
--- 13,28 ----
#define HOST_BITS_PER_CHAR CHAR_BIT
#define HOST_BITS_PER_SHORT (CHAR_BIT * SIZEOF_SHORT)
#define HOST_BITS_PER_INT (CHAR_BIT * SIZEOF_INT)
#define HOST_BITS_PER_LONG (CHAR_BIT * SIZEOF_LONG)
+ /* The string that should be inserted into a printf style format to
+ indicate a "long long" operand. */
+ #ifndef HOST_LONG_LONG_FORMAT
+ #define HOST_LONG_LONG_FORMAT "ll"
+ #endif
+
/* If HAVE_LONG_LONG and SIZEOF_LONG_LONG aren't defined, but
GCC_VERSION >= 3000, assume this is the second or later stage of a
bootstrap, we do have long long, and it's 64 bits. (This is
required by C99; we do have some ports that violate that assumption
but they're all cross-compile-only.) Just in case, force a
*************** extern char sizeof_long_long_must_be_8[s
*** 75,85 ****
# endif
#else
# define HOST_WIDE_INT_PRINT "ll"
# define HOST_WIDE_INT_PRINT_C "LL"
/* We can assume that 'long long' is at least 64 bits. */
! # define HOST_WIDE_INT_PRINT_DOUBLE_HEX "0x%llx%016llx"
#endif /* HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG */
#define HOST_WIDE_INT_PRINT_DEC "%" HOST_WIDE_INT_PRINT "d"
#define HOST_WIDE_INT_PRINT_DEC_C HOST_WIDE_INT_PRINT_DEC HOST_WIDE_INT_PRINT_C
#define HOST_WIDE_INT_PRINT_UNSIGNED "%" HOST_WIDE_INT_PRINT "u"
--- 81,92 ----
# endif
#else
# define HOST_WIDE_INT_PRINT "ll"
# define HOST_WIDE_INT_PRINT_C "LL"
/* We can assume that 'long long' is at least 64 bits. */
! # define HOST_WIDE_INT_PRINT_DOUBLE_HEX \
! "0x%" HOST_LONG_LONG_FORMAT "x%016" HOST_LONG_LONG_FORMAT "x"
#endif /* HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_LONG */
#define HOST_WIDE_INT_PRINT_DEC "%" HOST_WIDE_INT_PRINT "d"
#define HOST_WIDE_INT_PRINT_DEC_C HOST_WIDE_INT_PRINT_DEC HOST_WIDE_INT_PRINT_C
#define HOST_WIDE_INT_PRINT_UNSIGNED "%" HOST_WIDE_INT_PRINT "u"
*************** extern char sizeof_long_long_must_be_8[s
*** 107,121 ****
# define HOST_WIDEST_INT __int64
# else
#error "This line should be impossible to reach"
# endif
# endif
! # define HOST_WIDEST_INT_PRINT_DEC "%lld"
! # define HOST_WIDEST_INT_PRINT_DEC_C "%lldLL"
! # define HOST_WIDEST_INT_PRINT_UNSIGNED "%llu"
! # define HOST_WIDEST_INT_PRINT_HEX "0x%llx"
! # define HOST_WIDEST_INT_PRINT_DOUBLE_HEX "0x%llx%016llx"
#endif
/* Define HOST_WIDEST_FAST_INT to the widest integer type supported
efficiently in hardware. (That is, the widest integer type that fits
in a hardware register.) Normally this is "long" but on some hosts it
--- 114,129 ----
# define HOST_WIDEST_INT __int64
# else
#error "This line should be impossible to reach"
# endif
# endif
! # define HOST_WIDEST_INT_PRINT_DEC "%" HOST_LONG_LONG_FORMAT "d"
! # define HOST_WIDEST_INT_PRINT_DEC_C "%" HOST_LONG_LONG_FORMAT "dLL"
! # define HOST_WIDEST_INT_PRINT_UNSIGNED "%" HOST_LONG_LONG_FORMAT "u"
! # define HOST_WIDEST_INT_PRINT_HEX "0x%" HOST_LONG_LONG_FORMAT "x"
! # define HOST_WIDEST_INT_PRINT_DOUBLE_HEX \
! "0x%" HOST_LONG_LONG_FORMAT "x%016" HOST_LONG_LONG_FORMAT "x"
#endif
/* Define HOST_WIDEST_FAST_INT to the widest integer type supported
efficiently in hardware. (That is, the widest integer type that fits
in a hardware register.) Normally this is "long" but on some hosts it
Index: config/i386/xm-mingw32.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/i386/xm-mingw32.h,v
retrieving revision 1.21
diff -c -5 -p -r1.21 xm-mingw32.h
*** config/i386/xm-mingw32.h 20 Aug 2004 11:14:11 -0000 1.21
--- config/i386/xm-mingw32.h 24 Nov 2004 04:25:08 -0000
*************** Software Foundation, 59 Temple Place - S
*** 28,32 ****
--- 28,36 ----
/* This is the name of the null device on windows. */
#define HOST_BIT_BUCKET "nul"
/* The st_ino field of struct stat is always 0. */
#define HOST_LACKS_INODE_NUMBERS
+
+ /* MSVCRT does not support the "ll" format specifier for printing
+ "long long" values. Instead, we use "I64". */
+ #define HOST_LONG_LONG_FORMAT "I64"
Index: doc/hostconfig.texi
===================================================================
RCS file: /cvs/gcc/gcc/gcc/doc/hostconfig.texi,v
retrieving revision 1.14
diff -c -5 -p -r1.14 hostconfig.texi
*** doc/hostconfig.texi 5 Nov 2004 01:36:56 -0000 1.14
--- doc/hostconfig.texi 24 Nov 2004 04:30:18 -0000
*************** initialization when a compilation driver
*** 210,219 ****
--- 210,224 ----
@item SMALL_ARG_MAX
Define this macro if the host system has a small limit on the total
size of an argument vector. This causes the driver to take more care
not to pass unnecessary arguments to subprocesses.
+
+ @item HOST_LONG_LONG_FORMAT
+ If defined, the string used to indicate an argument of type @code{long
+ long} to functions like @code{printf}. The default value is
+ @code{"ll"}.
@end ftable
In addition, if @command{configure} generates an incorrect definition of
any of the macros in @file{auto-host.h}, you can override that
definition in a host configuration header. If you need to do this,
More information about the Gcc-patches
mailing list