[PATCH 64bit] ssize_t

Ralf Corsepius ralf.corsepius@rtems.org
Wed Feb 20 15:44:00 GMT 2013


On 02/20/2013 04:17 PM, Corinna Vinschen wrote:
> On Feb 20 16:08, Ralf Corsepius wrote:
>> On 02/20/2013 03:14 PM, Corinna Vinschen wrote:
>>> Hi Yaakov,
>>>
>>> On Feb 20 03:23, Yaakov (Cygwin/X) wrote:
>>>> I just discovered an issue resulting from this commit:
>>>>
>>>> 2002-06-27  Jeff Johnston  <jjohnstn@...>
>>>>
>>>>          * libc/include/sys/_types.h: Define _ssize_t as int if int is
>>>>          32-bits, otherwise define it as long.
>>>>
>>>> On x86_64-cygwin (as on Linux), int is still 32 bits, but size_t is a
>>>> 64bit unsigned long and ssize_t should be as large but signed.
>>>> Possible patch for newlib attached; corresponding patches for
>>>> cygwin-64bit-branch on cygwin-patches@.
>>>
>>> Thanks for the patch.  I'm just wondering if ssize_t shouldn't ideally
>>> be based on size_t, at least when using GCC.  GCC has a predefined
>>> __SIZEOF_SIZE_T__ macro.
>>>
>>> What I'm thinking of is something like
>>>
>>> #ifndef __ssize_t_defined
>>> # ifdef __SIZEOF_SIZE_T__
>>> #  if defined (__SIZEOF_INT__) && __SIZEOF_SIZE_T__ == __SIZEOF_INT__
>>> typedef int ssize_t;
>>> #  else
>>> typedef long ssize_t
>>> #  endif
>>> # elif defined(__INT_MAX__) && defined(__LONG_MAX__) && __LONG_MAX__ == __INT_MAX__
>>> typedef int _ssize_t;
>>> # else
>>> typedef long _ssize_t;
>>> # endif
>>> #endif
>>>
>>>
>>> Does that make sense?
>>
>> GCC requires exact symmetry of types between ssize_t and size_t.
>> I.e. checking for sizes of types is not sufficient for [s]size_t.
>
> Do you have a code suggestion then?

Unfortunately no.

So far, the best I have been able to come up with for RTEMS, was a 
pretty unpleasant, error prone and lacking generality preprocessor cascade:

ATM, it looks like this:
<snip>
+++ newlib-1.20.0/newlib/libc/sys/rtems/machine/_types.h 
2012-10-15 10:31:19.635621334 +0200
@@ -13,7 +13,7 @@
   * could be applied here.
   */

-#if defined(__i386__) || defined(__m32r__) || defined(__h8300__) || 
defined(__arm__) || defined(__bfin__) || defined(__m68k__)
+#if defined(__i386__) || defined(__m32r__) || defined(__h8300__) || 
(defined(__arm__) && !defined(__ARM_EABI__)) || defined(__bfin__) || define
  #if defined(__H8300__)
  typedef signed int _ssize_t;
  #else
@@ -23,7 +23,8 @@
  #elif defined(__sparc__) && defined(__LP64__)
  typedef long signed int _ssize_t;
  #define __ssize_t_defined 1
-#elif defined(__AVR__) || defined(__lm32__) || defined(__m32c__) || 
defined(__mips__) || defined(__moxie__) || defined(__PPC__) || defined(__sp
+#elif defined(__AVR__) || defined(__lm32__) || defined(__m32c__) || 
defined(__mips__) || defined(__moxie__) || defined(__PPC__) || defined(__sp
+  || defined(__v850__) || defined(__v851__)
  typedef signed int _ssize_t;
  #define __ssize_t_defined 1
  #else
</snip>

>  GCC doesn't define ssize_t
> by itself,
Right, but GCC (IIRC, since 4.4) defines size_t (__SIZE_T_TYPE__) and 
also comes with pretty aggressive fprintf-format strings checks related 
to [s]size_t.

That said, IMO, in an ideal world, GCC also would define a corresponding 
__SSIZE_T_TYPE__.

Ralf



More information about the Newlib mailing list