This is the mail archive of the libc-hacker@sourceware.org mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix int64_t/u_int64_t on 64-bit arches with non-GCC compilers


Hi!

On 64-bit arches and non-GCC compilers, <sys/types.h> uses long long resp.
unsigned long long types for int64_t/u_int64_t.  But, <stdint.h> uses
there long resp. unsigned long and so does <sys/types.h> for GCC
(it uses DImode int, which mangles as l rather than x).
With those compilers, depending if you include <stdint.h> or <sys/types.h>
first thus affects mangling, the same function can mangle differently
based on the order of the above headers included.

The following patch is an ABI change with those compilers, makes even
non-GCC compilers do the same as GCC (and the same as <stdint.h> already
does).

2006-02-28  Jakub Jelinek  <jakub@redhat.com>

	* posix/sys/types.h [!__GNUC_PREREQ (2, 7)] (int64_t, u_int64_t):
	typedef to long int resp. unsigned long int on 64-bit arches.

--- libc/posix/sys/types.h.jj	2002-10-24 01:48:51.000000000 +0200
+++ libc/posix/sys/types.h	2006-02-28 13:34:44.000000000 +0100
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991,1992,1994,1995,1996,1997,1998,1999,2000,2001,2002
+/* Copyright (C) 1991,1992,1994,1995,1996,1997,1998,1999,2000,2001,2002,2006
    	Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -163,7 +163,9 @@ typedef unsigned int uint;
 typedef	char int8_t;
 typedef	short int int16_t;
 typedef	int int32_t;
-#  if __GLIBC_HAVE_LONG_LONG
+#  if __WORDSIZE == 64
+typedef long int int64_t;
+#  elif __GLIBC_HAVE_LONG_LONG
 __extension__ typedef long long int int64_t;
 #  endif
 # endif
@@ -172,7 +174,9 @@ __extension__ typedef long long int int6
 typedef	unsigned char u_int8_t;
 typedef	unsigned short int u_int16_t;
 typedef	unsigned int u_int32_t;
-# if __GLIBC_HAVE_LONG_LONG
+# if __WORDSIZE == 64
+typedef unsigned long int u_int64_t;
+# elif __GLIBC_HAVE_LONG_LONG
 __extension__ typedef unsigned long long int u_int64_t;
 # endif
 

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]