This is the mail archive of the
newlib@sources.redhat.com
mailing list for the newlib project.
Re: Newlib _ctype_ alias kludge now invalid due to PR middle-end/15700 fix.
On Mar 22 11:53, Corinna Vinschen wrote:
> On Mar 21 17:06, Jeff Johnston wrote:
> > This is introducing machine-specific code into a shared file. I would
> > rather see you add a new ctype_.c file in libc/machine/i386 which uses the
> > .asm method and avoids the array aliasing altogether. That should solve
> > your problem and remove the need for Cygwin flag checks in the shared
> > ctype_.c file.
>
> Ok, I've prepared a patch along these lines. The special handling for
> Cygwin was useless anyway (no need for "__declspec(dllexport)"), so it's
> just special handling for i386.
>
> Ok to apply?
Actually, I don't want to apply that patch. It's not right.
The assembler code is not really i386, it's target independent, because
it only uses pseudo ops. It's the one way to keep backward compatibility
and it entirely drops the need for the array aliasing test in configure.
Why giving up binary backward compatibility for all non-386 targets?
So, is it really correct to move this stuff into machine/*? I don't
think so. Below is an alternative patch, which is more correct, IMHO.
Using the assembler stuff for all targets should be ok, because
ALLOW_NEGATIVE_CTYPE_INDEX requires __GNUC__ anyway.
Corinna
* Makefile.in (libc_cv_array_aliasing): Remove.
* configure.in: Remove array aliasing check.
* newlib.hin (_HAVE_ARRAY_ALIASING): Remove.
* libc/ctype/ctype_.c: Remove useless special Cygwin handling.
Always define _ctype_ using assembler if ALLOW_NEGATIVE_CTYPE_INDEX
is set.
Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/newlib/Makefile.in,v
retrieving revision 1.37
diff -u -p -r1.37 Makefile.in
--- Makefile.in 17 Mar 2005 20:11:17 -0000 1.37
+++ Makefile.in 22 Mar 2005 11:07:27 -0000
@@ -103,7 +103,6 @@ SYS_OBJECTLIST = @SYS_OBJECTLIST@
UNIX_OBJECTLIST = @UNIX_OBJECTLIST@
VERSION = @VERSION@
aext = @aext@
-libc_cv_array_aliasing = @libc_cv_array_aliasing@
libc_cv_initfinit_array = @libc_cv_initfinit_array@
libm_machine_dir = @libm_machine_dir@
machine_dir = @machine_dir@
Index: configure.in
===================================================================
RCS file: /cvs/src/src/newlib/configure.in,v
retrieving revision 1.27
diff -u -p -r1.27 configure.in
--- configure.in 17 Mar 2005 20:11:17 -0000 1.27
+++ configure.in 22 Mar 2005 11:07:27 -0000
@@ -354,25 +354,6 @@ if test $libc_cv_initfinit_array = yes;
AC_DEFINE_UNQUOTED(HAVE_INITFINI_ARRAY)
fi
-AC_CACHE_CHECK(for array aliasing support,
- libc_cv_array_aliasing, [dnl
-cat > conftest.c <<EOF
-char x[3] = { 'a', 'b', 'c' };
-extern char y[2] __attribute__((alias ("x+1")));
-EOF
-if AC_TRY_COMMAND([${CC} $CFLAGS $CPPFLAGS -c conftest.c
- 1>&AS_MESSAGE_LOG_FD])
-then
- libc_cv_array_aliasing=yes
-else
- libc_cv_array_aliasing=no
-fi
-rm -f conftest*])
-AC_SUBST(libc_cv_array_aliasing)
-if test $libc_cv_array_aliasing = yes; then
- AC_DEFINE_UNQUOTED(_HAVE_ARRAY_ALIASING)
-fi
-
AC_OUTPUT(Makefile,
[if test -n "$CONFIG_FILES"; then
unset ac_file
Index: newlib.hin
===================================================================
RCS file: /cvs/src/src/newlib/newlib.hin,v
retrieving revision 1.9
diff -u -p -r1.9 newlib.hin
--- newlib.hin 17 Mar 2005 20:11:17 -0000 1.9
+++ newlib.hin 22 Mar 2005 11:07:27 -0000
@@ -141,8 +141,5 @@
* sections. */
#undef HAVE_INITFINI_ARRAY
-/* Define if the compiler supports aliasing an array to an address. */
-#undef _HAVE_ARRAY_ALIASING
-
#endif /* !__NEWLIB_H__ */
Index: libc/ctype/ctype_.c
===================================================================
RCS file: /cvs/src/src/newlib/libc/ctype/ctype_.c,v
retrieving revision 1.4
diff -u -p -r1.4 ctype_.c
--- libc/ctype/ctype_.c 17 Mar 2005 20:11:22 -0000 1.4
+++ libc/ctype/ctype_.c 22 Mar 2005 11:07:27 -0000
@@ -84,44 +84,21 @@ static _CONST char _ctype_b[128 + 256] =
_CTYPE_DATA_128_256
};
-# if defined(__CYGWIN__)
-_CONST char __declspec(dllexport) *__ctype_ptr = _ctype_b + 128;
-# else
-_CONST char *__ctype_ptr = _ctype_b + 128;
-# endif
-
-# if defined(_HAVE_ARRAY_ALIASING)
-
-# if defined(__CYGWIN__)
-extern _CONST char __declspec(dllexport) _ctype_[1 + 256] __attribute__ ((alias ("_ctype_b+127")));
-# else
-extern _CONST char _ctype_[1 + 256] __attribute__ ((alias ("_ctype_b+127")));
-# endif
+__asm__ (
+ ".data \n\t"
+ ".globl __ctype_ \n\t"
+ ".set __ctype_,__ctype_b+127");
-# else /* !_HAVE_ARRAY_ALIASING */
-
-# if defined(__CYGWIN__)
-_CONST char __declspec(dllexport) _ctype_[1 + 256] = {
-# else
-_CONST char _ctype_[1 + 256] = {
-# endif
- 0,
- _CTYPE_DATA_0_127,
- _CTYPE_DATA_128_256
-};
-# endif /* !_HAVE_ARRAY_ALIASING */
+_CONST char *__ctype_ptr = _ctype_b + 128;
#else /* !defined(ALLOW_NEGATIVE_CTYPE_INDEX) */
-# if defined(__CYGWIN__)
-_CONST char __declspec(dllexport) _ctype_[1 + 256] = {
-# else
_CONST char _ctype_[1 + 256] = {
-# endif
0,
_CTYPE_DATA_0_127,
_CTYPE_DATA_128_256
};
_CONST char *__ctype_ptr = _ctype_ + 1;
+
#endif
--
Corinna Vinschen
Cygwin Project Co-Leader
Red Hat, Inc.