wchar_t change for ARM EABI

Bruce Evans brde at optusnet.com.au
Tue Jun 19 15:47:43 UTC 2012


On Tue, 19 Jun 2012, Andrew Turner wrote:

> On Sun, 17 Jun 2012 17:11:25 +1200
> Andrew Turner <andrew at fubar.geek.nz> wrote:
>
>> I have a patch at [1] to move the wchar_t type definition from
>> <sys/_types.h> to <machine/_types.h> I would like feedback on. The
>> need for this change is the ARM EABI requires wchar_t to be either an
>> unsigned int or an unsigned short, with the former preferred.
>
> I have an updated patch at [1]. This moves __WCHAR_MIN/__WCHAR_MAX from
> <machine/_types.h> to <machine/_limits.h> as they are limits rather
> than types. Does anybody see any issues with this? If not I'll update it
> for all architectures and commit later in the week.

I hoped to keep the types and limits closer together, especially for
the types that are declared in <machine/_types.h>.  <machine/_limits.h>
has mainly limits for basic (non-typedefed) types.  The exceptions
were just for size_t, ssize_t, off_t, and *quad_t (ugh).

> [1] http://people.freebsd.org/~andrew/wchar_unsigned_1.diff

% Index: sys/sys/_types.h
% ===================================================================
% --- sys/sys/_types.h	(revision 237150)
% +++ sys/sys/_types.h	(working copy)
% @@ -81,13 +81,12 @@
%   *
%   * NOTE: rune_t is not covered by ANSI nor other standards, and should not
%   * be instantiated outside of lib/libc/locale.  Use wchar_t.  wchar_t and
% - * rune_t must be the same type.  Also, wint_t must be no narrower than
% - * wchar_t, and should be able to hold all members of the largest
% - * character set plus one extra value (WEOF), and must be at least 16 bits.
% + * rune_t must be the same type.  Also, wint_t should be able to hold all
% + * members of the largest character set plus one extra value (WEOF), and
% + * must be at least 16 bits.
%   */

This still says that wchar_t MUST be the same as rune_t...

%  typedef	int		__ct_rune_t;	/* arg type for ctype funcs */
%  typedef	__ct_rune_t	__rune_t;	/* rune_t (see above) */
% -typedef	__ct_rune_t	__wchar_t;	/* wchar_t (see above) */

... but rune_t is still int, while wchar_t can be different (it is unsigned
on arm_eabi).

%  typedef	__ct_rune_t	__wint_t;	/* wint_t (see above) */

The above removes a MUST on wint_t instead, but wint_t hasn't been changed.
Was that intended?  The MUST is still satisfied, but isn't stated quite
right, since the sign bit is normally counted as part of the width but
probably shouldn't be in this requirement.

% 
%  typedef	__uint32_t	__dev_t;	/* device number */
% ...
% Index: sys/arm/include/_limits.h
% ===================================================================
% --- sys/arm/include/_limits.h	(revision 237150)
% +++ sys/arm/include/_limits.h	(working copy)
% @@ -78,6 +78,14 @@
%  #define	__QUAD_MAX	__LLONG_MAX	/* max value for a quad_t */
%  #define	__QUAD_MIN	__LLONG_MIN	/* min value for a quad_t */
% 
% +#ifdef __ARM_EABI__
% +#define	__WCHAR_MIN	(0)

Bogus parentheses.

% +#define	__WCHAR_MAX	__UINT_MAX
% +#else
% +#define	__WCHAR_MIN	__INT_MIN
% +#define	__WCHAR_MAX	__INT_MAX
% +#endif
% +

These definitions are missing banal comments, unlike all the other
definitions except the ones for __LONG_BIT and __WORD_BIT.  (The one for
__MINSIGSTKSZ is not missing, but is in an inconsistent style.)

%  #define	__LONG_BIT	32
%  #define	__WORD_BIT	32
%

Bruce


More information about the freebsd-arch mailing list