[PATCH] PPC libgcc compatibility

Franz Sirl Franz.Sirl-kernel@lauterbach.com
Mon May 20 08:46:00 GMT 2002


On Wednesday 15 May 2002 21:04, Franz Sirl wrote:
> On Wednesday 15 May 2002 14:58, Jakub Jelinek wrote:
> > On Wed, May 15, 2002 at 02:50:53PM +0200, Franz Sirl wrote:
> > > At 14:44 15.05.2002, Jakub Jelinek wrote:
> > > >On Wed, May 15, 2002 at 02:41:59PM +0200, Franz Sirl wrote:
> > > > > extern int64_t __fixdfdi (double);
> > > > >
> > > > > int64_t INTUSE (__fixdfdi) (double d)
> > > > > {
> > > > >    return __fixdfdi (d);
> > > > > }
> > > > > symbol_version (INTUSE (__fixdfdi), __fixdfdi, GLIBC_2.0);
> > > >
> > > >The linker won't let you do that I'm afraid.
> > >
> > > Really? I just tried it and glibc linked fine (binutils-2.12.90.0.7).
> > > Which linker error would you expect?
> >
> > If it was the default version, linker would certainly not be happy at
> > all, but apparently if it is non-default version, it might work.
> > In that case, it would make sense to change the IA-64 bits the same way
> > (though I think we should keep divdi3.c as it should be more efficient
> > than what libgcc has). Currently e.g. __divtf3 is compiled into glibc
> > twice on IA-64, once for the export and once hidden, since for the export
> > it is not the default version and thus linker puts in libgcc.a too.
>
> The appended patch against the branch works fine, but I noticed a new
> problem, since in gcc we have that for libgcc_s.so.1 in
> gcc/config/libgcc-glibc.ver:
>
> %inherit GCC_3.0 GLIBC_2.0
> GLIBC_2.0 {
>   # Sampling of DImode arithmetic used by (at least) i386 and m68k.
>   __divdi3
>   __moddi3
>   __udivdi3
>   __umoddi3
>
> Now ld complains when linking shared c++ libs :-(. Now, what can we do? Can
> I use GLIBC_2.1 as a version in glibc instead? Or maybe even a special
> GLIBC_COMPAT?

Ok, if I keep divdi3 all is well, I don't understand why, but no more 
complaints about doubled definitions between glibc and libgcc_s linking 
shared c++ libs.

Uli, unless 2.3 is very close, it would be nice if this could go on the branch 
too.

I leave the decision on what to do with the now superflous cmpdi2.c etc. to 
you.

Franz.


	* sysdeps/powerpc/Makefile (sysdeps_routines): Use libgcc-compat instead
	of cmpdi2, shdi3, fixdfdi, fixsfdi in csu dir.
	(shared-only-routines): Likewise.
	* sysdeps/powerpc/libgcc-compat.c: New file.

-------------- next part --------------
Index: sysdeps/powerpc/Makefile
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/powerpc/Makefile,v
retrieving revision 1.16
diff -u -p -r1.16 Makefile
--- sysdeps/powerpc/Makefile	15 May 2002 03:58:08 -0000	1.16
+++ sysdeps/powerpc/Makefile	20 May 2002 15:19:13 -0000
@@ -37,8 +37,8 @@ CFLAGS-gmon-start.o = -G0
 endif
 ifeq (yes,$(build-shared))
 # Compatibility
-sysdep_routines += divdi3 cmpdi2 shdi3 fixdfdi fixsfdi
-shared-only-routines += divdi3 cmpdi2 shdi3 fixdfdi fixsfdi
+sysdep_routines += divdi3 libgcc-compat
+shared-only-routines += divdi3 libgcc-compat
 endif
 endif
 
--- /dev/null	Thu Jan  1 01:00:00 1970
+++ sysdeps/powerpc/libgcc-compat.c	Mon May 20 16:55:45 2002
@@ -0,0 +1,113 @@
+/* pre-.hidden libgcc compatibility
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+
+#include <stdint.h>
+#include <shlib-compat.h>
+
+#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_6)
+
+extern int64_t __ashldi3 (int64_t, int32_t);
+int64_t INTUSE (__ashldi3) (int64_t u, int32_t b)
+{
+  return __ashldi3 (u, b);
+}
+symbol_version (INTUSE (__ashldi3), __ashldi3, GLIBC_2.0);
+
+
+extern int64_t __ashrdi3 (int64_t, int32_t);
+int64_t INTUSE (__ashrdi3) (int64_t u, int32_t b)
+{
+  return __ashrdi3 (u, b);
+}
+symbol_version (INTUSE (__ashrdi3), __ashrdi3, GLIBC_2.0);
+
+
+extern int64_t __lshrdi3 (int64_t, int32_t);
+int64_t INTUSE (__lshrdi3) (int64_t u, int32_t b)
+{
+  return __lshrdi3 (u, b);
+}
+symbol_version (INTUSE (__lshrdi3), __lshrdi3, GLIBC_2.0);
+
+
+extern int32_t __cmpdi2 (int64_t, int64_t);
+int32_t INTUSE (__cmpdi2) (int64_t u, int64_t v)
+{
+  return __cmpdi2 (u, v);
+}
+symbol_version (INTUSE (__cmpdi2), __cmpdi2, GLIBC_2.0);
+
+
+extern int32_t __ucmpdi2 (int64_t, int64_t);
+int32_t INTUSE (__ucmpdi2) (int64_t u, int64_t v)
+{
+  return __ucmpdi2 (u, v);
+}
+symbol_version (INTUSE (__ucmpdi2), __ucmpdi2, GLIBC_2.0);
+
+
+extern int64_t __fixdfdi (double);
+int64_t INTUSE (__fixdfdi) (double d)
+{
+  return __fixdfdi (d);
+}
+symbol_version (INTUSE (__fixdfdi), __fixdfdi, GLIBC_2.0);
+
+
+extern int64_t __fixunsdfdi (double);
+int64_t INTUSE (__fixunsdfdi) (double d)
+{
+  return __fixunsdfdi (d);
+}
+symbol_version (INTUSE (__fixunsdfdi), __fixunsdfdi, GLIBC_2.0);
+
+
+extern int64_t __fixsfdi (float);
+int64_t INTUSE (__fixsfdi) (float d)
+{
+  return __fixsfdi (d);
+}
+symbol_version (INTUSE (__fixsfdi), __fixsfdi, GLIBC_2.0);
+
+
+extern int64_t __fixunssfdi (float);
+int64_t INTUSE (__fixunssfdi) (float d)
+{
+  return __fixunssfdi (d);
+}
+symbol_version (INTUSE (__fixunssfdi), __fixunssfdi, GLIBC_2.0);
+
+
+extern double __floatdidf (int64_t);
+double INTUSE (__floatdidf) (int64_t u)
+{
+  return __floatdidf (u);
+}
+symbol_version (INTUSE (__floatdidf), __floatdidf, GLIBC_2.0);
+
+
+extern float __floatdisf (int64_t);
+float INTUSE (__floatdisf) (int64_t u)
+{
+  return __floatdisf (u);
+}
+symbol_version (INTUSE (__floatdisf), __floatdisf, GLIBC_2.0);
+
+#endif


More information about the Libc-alpha mailing list