diff options
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | sysdeps/powerpc/Makefile | 4 | ||||
-rw-r--r-- | sysdeps/powerpc/Versions | 1 | ||||
-rw-r--r-- | sysdeps/powerpc/divdi3.c | 43 | ||||
-rw-r--r-- | sysdeps/powerpc/libgcc-compat.S | 144 | ||||
-rw-r--r-- | sysdeps/powerpc/libgcc-compat.c | 113 |
6 files changed, 206 insertions, 113 deletions
diff --git a/ChangeLog b/ChangeLog index 34d9fd552d..87ba0fe005 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2002-08-20 Roland McGrath <roland@redhat.com> + + Fix ABI compatibility with libc compiled with old tools on powerpc. + Changes contributed by Franz Sirl <Franz.Sirl-kernel@lauterbach.com> + and Jack Howarth <howarth@bromo.med.uc.edu>. + * sysdeps/powerpc/Makefile [$(have-protected) = yes] + (CPPFLAGS-divdi3.c, CPPFLAGS-libgcc-compat.S): New variables, + pass -DHAVE_DOT_HIDDEN for these files. + * sysdeps/powerpc/Versions (libc: GLIBC_2.0): Added __floatdidf, + __floatdisf. + * sysdeps/powerpc/divdi3.c: New file. + * sysdeps/powerpc/libgcc-compat.S: New file, replacement for ... + * sysdeps/powerpc/libgcc-compat.c: ... this, file removed. + 2002-08-20 Jakub Jelinek <jakub@redhat.com> * locale/loadarchive.c (_nl_load_locale_from_archive): Handle diff --git a/sysdeps/powerpc/Makefile b/sysdeps/powerpc/Makefile index ce8fa7c175..0737f6f2d3 100644 --- a/sysdeps/powerpc/Makefile +++ b/sysdeps/powerpc/Makefile @@ -37,6 +37,10 @@ CFLAGS-gmon-start.o = -G0 endif ifeq (yes,$(build-shared)) # Compatibility +ifeq (yes,$(have-protected)) +CPPFLAGS-divdi3.c = -DHAVE_DOT_HIDDEN +CPPFLAGS-libgcc-compat.S = -DHAVE_DOT_HIDDEN +endif sysdep_routines += divdi3 libgcc-compat shared-only-routines += divdi3 libgcc-compat endif diff --git a/sysdeps/powerpc/Versions b/sysdeps/powerpc/Versions index 3e1686b96c..e26809a3c7 100644 --- a/sysdeps/powerpc/Versions +++ b/sysdeps/powerpc/Versions @@ -6,6 +6,7 @@ libc { __ashldi3; __ashrdi3; __lshrdi3; __fixdfdi; __fixunsdfdi; __fixsfdi; __fixunssfdi; + __floatdidf; __floatdisf; } } diff --git a/sysdeps/powerpc/divdi3.c b/sysdeps/powerpc/divdi3.c new file mode 100644 index 0000000000..647d1ad179 --- /dev/null +++ b/sysdeps/powerpc/divdi3.c @@ -0,0 +1,43 @@ +/* 64-bit multiplication and division libgcc routines for 32-bit PowerPC + 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. */ + +#define _DIVDI3_C +#include <sysdeps/wordsize-32/divdi3.c> + +INTDEF (__udivdi3); +INTDEF (__moddi3); +INTDEF (__umoddi3); + +#ifdef HAVE_DOT_HIDDEN +asm (".hidden __divdi3"); +asm (".hidden __udivdi3"); +asm (".hidden __moddi3"); +asm (".hidden __umoddi3"); +#endif + +#include <shlib-compat.h> + +#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2_6) + +symbol_version (INTUSE (__divdi3), __divdi3, GLIBC_2.0); +symbol_version (INTUSE (__udivdi3), __udivdi3, GLIBC_2.0); +symbol_version (INTUSE (__moddi3), __moddi3, GLIBC_2.0); +symbol_version (INTUSE (__umoddi3), __umoddi3, GLIBC_2.0); + +#endif diff --git a/sysdeps/powerpc/libgcc-compat.S b/sysdeps/powerpc/libgcc-compat.S new file mode 100644 index 0000000000..196293fd97 --- /dev/null +++ b/sysdeps/powerpc/libgcc-compat.S @@ -0,0 +1,144 @@ +/* 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. */ + + .file "libgcc-compat.S" + +#include <shlib-compat.h> + +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2_6) + +#define __ashldi3_v_glibc20 INTUSE (__ashldi3) +#define __ashrdi3_v_glibc20 INTUSE (__ashrdi3) +#define __lshrdi3_v_glibc20 INTUSE (__lshrdi3) +#define __cmpdi2_v_glibc20 INTUSE (__cmpdi2) +#define __ucmpdi2_v_glibc20 INTUSE (__ucmpdi2) +#define __fixdfdi_v_glibc20 INTUSE (__fixdfdi) +#define __fixsfdi_v_glibc20 INTUSE (__fixsfdi) +#define __fixunsdfdi_v_glibc20 INTUSE (__fixunsdfdi) +#define __fixunssfdi_v_glibc20 INTUSE (__fixunssfdi) +#define __floatdidf_v_glibc20 INTUSE (__floatdidf) +#define __floatdisf_v_glibc20 INTUSE (__floatdisf) + + .symver __ashldi3_v_glibc20,__ashldi3@GLIBC_2.0 + .symver __ashrdi3_v_glibc20,__ashrdi3@GLIBC_2.0 + .symver __lshrdi3_v_glibc20,__lshrdi3@GLIBC_2.0 + .symver __cmpdi2_v_glibc20,__cmpdi2@GLIBC_2.0 + .symver __ucmpdi2_v_glibc20,__ucmpdi2@GLIBC_2.0 + .symver __fixdfdi_v_glibc20,__fixdfdi@GLIBC_2.0 + .symver __fixunsdfdi_v_glibc20,__fixunsdfdi@GLIBC_2.0 + .symver __fixsfdi_v_glibc20,__fixsfdi@GLIBC_2.0 + .symver __fixunssfdi_v_glibc20,__fixunssfdi@GLIBC_2.0 + .symver __floatdidf_v_glibc20,__floatdidf@GLIBC_2.0 + .symver __floatdisf_v_glibc20,__floatdisf@GLIBC_2.0 + +#ifdef HAVE_DOT_HIDDEN + .hidden __ashldi3 + .hidden __ashrdi3 + .hidden __lshrdi3 + .hidden __cmpdi2 + .hidden __ucmpdi2 + .hidden __fixdfdi + .hidden __fixsfdi + .hidden __fixunsdfdi + .hidden __fixunssfdi + .hidden __floatdidf + .hidden __floatdisf +#endif + + .section ".text" + + .align 2 + .globl __ashldi3_v_glibc20 + .type __ashldi3_v_glibc20,@function +__ashldi3_v_glibc20: + b __ashldi3@local +.Lfe5: + .size __ashldi3_v_glibc20,.Lfe5-__ashldi3_v_glibc20 + .align 2 + .globl __ashrdi3_v_glibc20 + .type __ashrdi3_v_glibc20,@function +__ashrdi3_v_glibc20: + b __ashrdi3@local +.Lfe6: + .size __ashrdi3_v_glibc20,.Lfe6-__ashrdi3_v_glibc20 + .align 2 + .globl __lshrdi3_v_glibc20 + .type __lshrdi3_v_glibc20,@function +__lshrdi3_v_glibc20: + b __lshrdi3@local +.Lfe7: + .size __lshrdi3_v_glibc20,.Lfe7-__lshrdi3_v_glibc20 + .align 2 + .globl __cmpdi2_v_glibc20 + .type __cmpdi2_v_glibc20,@function +__cmpdi2_v_glibc20: + b __cmpdi2@local +.Lfe8: + .size __cmpdi2_v_glibc20,.Lfe8-__cmpdi2_v_glibc20 + .align 2 + .globl __ucmpdi2_v_glibc20 + .type __ucmpdi2_v_glibc20,@function +__ucmpdi2_v_glibc20: + b __ucmpdi2@local +.Lfe9: + .size __ucmpdi2_v_glibc20,.Lfe9-__ucmpdi2_v_glibc20 + .align 2 + .globl __fixdfdi_v_glibc20 + .type __fixdfdi_v_glibc20,@function +__fixdfdi_v_glibc20: + b __fixdfdi@local +.Lfe10: + .size __fixdfdi_v_glibc20,.Lfe10-__fixdfdi_v_glibc20 + .align 2 + .globl __fixunsdfdi_v_glibc20 + .type __fixunsdfdi_v_glibc20,@function +__fixunsdfdi_v_glibc20: + b __fixunsdfdi@local +.Lfe11: + .size __fixunsdfdi_v_glibc20,.Lfe11-__fixunsdfdi_v_glibc20 + .align 2 + .globl __fixsfdi_v_glibc20 + .type __fixsfdi_v_glibc20,@function +__fixsfdi_v_glibc20: + b __fixsfdi@local +.Lfe12: + .size __fixsfdi_v_glibc20,.Lfe12-__fixsfdi_v_glibc20 + .align 2 + .globl __fixunssfdi_v_glibc20 + .type __fixunssfdi_v_glibc20,@function +__fixunssfdi_v_glibc20: + b __fixunssfdi@local +.Lfe13: + .size __fixunssfdi_v_glibc20,.Lfe13-__fixunssfdi_v_glibc20 + .align 2 + .globl __floatdidf_v_glibc20 + .type __floatdidf_v_glibc20,@function +__floatdidf_v_glibc20: + b __floatdidf@local +.Lfe14: + .size __floatdidf_v_glibc20,.Lfe14-__floatdidf_v_glibc20 + .align 2 + .globl __floatdisf_v_glibc20 + .type __floatdisf_v_glibc20,@function +__floatdisf_v_glibc20: + b __floatdisf@local +.Lfe15: + .size __floatdisf_v_glibc20,.Lfe15-__floatdisf_v_glibc20 + +#endif diff --git a/sysdeps/powerpc/libgcc-compat.c b/sysdeps/powerpc/libgcc-compat.c deleted file mode 100644 index 9d94c35ad0..0000000000 --- a/sysdeps/powerpc/libgcc-compat.c +++ /dev/null @@ -1,113 +0,0 @@ -/* 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 |