local-libgcc-compat-ports
authorGNU Libc Maintainers <debian-glibc@lists.debian.org>
Sat, 2 Dec 2017 10:07:17 +0000 (10:07 +0000)
committerAurelien Jarno <aurel32@debian.org>
Sat, 2 Dec 2017 10:07:17 +0000 (10:07 +0000)
# DP: Description: libgcc-compat symbols for mips, arm, m68k
# DP: Author: Guido Guenther, GOTO Masanori
# DP: Upstream status: Not submitted
# DP: Date: 2002-10-13, updated 2006-08-27

Gbp-Pq: Topic any
Gbp-Pq: Name local-libgcc-compat-ports.diff

17 files changed:
sysdeps/alpha/Makefile
sysdeps/alpha/Versions
sysdeps/alpha/libgcc-compat.c [new file with mode: 0644]
sysdeps/arm/Makefile
sysdeps/arm/Versions
sysdeps/arm/libgcc-compat.c [new file with mode: 0644]
sysdeps/ia64/Makefile
sysdeps/ia64/Versions
sysdeps/ia64/ia64libgcc.S [deleted file]
sysdeps/ia64/libgcc-compat.c [new file with mode: 0644]
sysdeps/m68k/Deps [new file with mode: 0644]
sysdeps/m68k/Makefile
sysdeps/m68k/Versions
sysdeps/m68k/libgcc-compat.c [new file with mode: 0644]
sysdeps/mips/mips32/Makefile
sysdeps/mips/mips32/Versions [new file with mode: 0644]
sysdeps/mips/mips32/libgcc-compat.c [new file with mode: 0644]

index 98da3b57e6e5d4d2e4e85488c0ee6ccb292e23f5..04962f0da4f5c9c280281a9743998fcbd7e6f84e 100644 (file)
@@ -60,3 +60,11 @@ sysdep-CFLAGS += -mieee -mfp-rounding-mode=d
 # libc.so requires about 16k for the small data area, which is well
 # below the 64k maximum.
 pic-ccflag = -fpic
+
+ifeq ($(subdir),csu)
+ifeq (yes,$(build-shared))
+# Compatibility
+sysdep_routines += libgcc-compat
+shared-only-routines += libgcc-compat
+endif
+endif
index ae8fde7b23bf55a8bb79236e89c839e9c0f10858..6c49bbab25c81285eb8579e7a2cf33eca107f2bc 100644 (file)
@@ -3,6 +3,8 @@ libc {
     # functions with special/multiple interfaces
     __divqu; __remqu; __divqs; __remqs; __divlu; __remlu; __divls;
     __remls; __divl; __reml; __divq; __remq; __divqu; __remqu;
+    # libgcc-compat
+    __multi3;
   }
 }
 libm {
diff --git a/sysdeps/alpha/libgcc-compat.c b/sysdeps/alpha/libgcc-compat.c
new file mode 100644 (file)
index 0000000..56e198b
--- /dev/null
@@ -0,0 +1,35 @@
+/* pre-.hidden libgcc compatibility
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Guido Guenther <agx@sigxcpu.org>
+
+   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)
+
+typedef int int128_t __attribute__((__mode__(TI)));
+
+extern int128_t __multi3 (int128_t, int128_t);
+int128_t __multi3_internal (int128_t x, int128_t y)
+{
+  return __multi3 (x, y);
+}
+symbol_version (__multi3_internal, __multi3, GLIBC_2.0);
+
+#endif
index 2849aeda4238997975c5a8096da474e54da26932..e1d1d90f7c193ef43e69e8eeac57298f10eb6ac0 100644 (file)
@@ -37,6 +37,11 @@ $(objpfx)tst-armtlsdescextlazy: $(objpfx)tst-armtlsdescextlazymod.so
 endif
 endif
 endif
+ifeq (yes,$(build-shared))
+# Compatibility
+sysdep_routines += libgcc-compat
+shared-only-routines += libgcc-compat
+endif
 
 ifeq ($(subdir),csu)
 # get offset to rtld_global._dl_hwcap
index f26a1a7606ba2a2c06ecb53549fa24678a3a30d3..438e09253fc0f5afb08799febff1d06c62f1d08d 100644 (file)
@@ -21,4 +21,18 @@ libc {
     # This set has to exist in some Versions file so we can use 2.19 in
     # SHLIB_COMPAT.  Since it didn't exist anywhere else, we add it here.
   }
+  GLIBC_2.0 {
+    # Functions from libgcc.
+    __ashldi3; __ashrdi3;
+    __cmpdi2;
+    __divsi3;
+    __fixdfdi;
+    __floatdidf;
+    __floatdisf;
+    __modsi3;
+    __muldi3;
+    __ucmpdi2;
+    __udivsi3;
+    __umodsi3;
+  }
 }
diff --git a/sysdeps/arm/libgcc-compat.c b/sysdeps/arm/libgcc-compat.c
new file mode 100644 (file)
index 0000000..1157ecd
--- /dev/null
@@ -0,0 +1,111 @@
+/* pre-.hidden libgcc compatibility
+   Copyright (C) 2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by GOTO Masanori <gotom@debian.org>
+
+   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 __ashldi3_internal (int64_t u, int32_t b)
+{
+  return __ashldi3 (u, b);
+}
+symbol_version (__ashldi3_internal, __ashldi3, GLIBC_2.0);
+
+extern int64_t __ashrdi3 (int64_t, int32_t);
+int32_t __ashrdi3_internal (int64_t u, int32_t b)
+{
+  return __ashrdi3 (u, b);
+}
+symbol_version (__ashrdi3_internal, __ashrdi3, GLIBC_2.0);
+
+extern int32_t __cmpdi2 (int64_t, int64_t);
+int32_t __cmpdi2_internal (int64_t u, int64_t v)
+{
+  return __cmpdi2 (u, v);
+}
+symbol_version (__cmpdi2_internal, __cmpdi2, GLIBC_2.0);
+
+extern int32_t __divsi3 (int32_t, int32_t);
+int32_t __divsi3_internal (int32_t u, int32_t v)
+{
+  return __divsi3 (u, v);
+}
+symbol_version (__divsi3_internal, __divsi3, GLIBC_2.0);
+
+extern int64_t __fixdfdi (double);
+int64_t __fixdfdi_internal (double d)
+{
+  return __fixdfdi (d);
+}
+symbol_version (__fixdfdi_internal, __fixdfdi, GLIBC_2.0);
+
+extern double __floatdidf (int64_t);
+double __floatdidf_internal (int64_t u)
+{
+  return __floatdidf (u);
+}
+symbol_version (__floatdidf_internal, __floatdidf, GLIBC_2.0);
+
+extern float __floatdisf (int64_t);
+float __floatdisf_internal (int64_t u)
+{
+  return __floatdisf (u);
+}
+symbol_version (__floatdisf_internal, __floatdisf, GLIBC_2.0);
+
+extern int32_t __modsi3 (int32_t, int32_t);
+int32_t __modsi3_internal (int32_t u, int32_t v)
+{
+  return __modsi3 (u, v);
+}
+symbol_version (__modsi3_internal, __modsi3, GLIBC_2.0);
+
+extern int64_t __muldi3 (int64_t, int64_t);
+int64_t __muldi3_internal (int64_t u, int64_t v)
+{
+  return __muldi3 (u, v);
+}
+symbol_version (__muldi3_internal, __muldi3, GLIBC_2.0);
+
+extern int32_t __ucmpdi2 (int64_t, int64_t);
+int32_t __ucmpdi2_internal (int64_t u, int64_t v)
+{
+  return __ucmpdi2 (u, v);
+}
+symbol_version (__ucmpdi2_internal, __ucmpdi2, GLIBC_2.0);
+
+extern int32_t __udivsi3 (int32_t, int32_t);
+int32_t __udivsi3_internal (int32_t u, int32_t v)
+{
+  return __udivsi3 (u, v);
+}
+symbol_version (__udivsi3_internal, __udivsi3, GLIBC_2.0);
+
+extern int32_t __umodsi3 (int32_t, int32_t);
+int32_t __umodsi3_internal (int32_t u, int32_t v)
+{
+  return __umodsi3 (u, v);
+}
+symbol_version (__umodsi3_internal, __umodsi3, GLIBC_2.0);
+
+#endif
index 5ebca89afaaefce53661d63971b88de3edcf92d5..34e6009c3532c3c7d1accb21d78d331a1e6ce7a2 100644 (file)
@@ -10,8 +10,8 @@ CPPFLAGS-start.S = -D__ASSEMBLY__
 
 ifeq (yes,$(build-shared))
 # Compatibility
-sysdep_routines += ia64libgcc
-shared-only-routines += ia64libgcc
+sysdep_routines += libgcc-compat
+shared-only-routines += libgcc-compat
 endif
 endif
 
index ac3bff9b780888c2d7ae287e473ac942c1189aa4..2027f8d2df43dadbe93070f6dd2df8e95741c6f9 100644 (file)
@@ -10,6 +10,10 @@ libc {
     # Functions from libgcc.
     __divtf3; __divdf3; __divsf3; __divdi3; __moddi3; __udivdi3; __umoddi3;
     __multi3;
+    __divsi3;
+    __modsi3;
+    __udivsi3;
+    __umodsi3;
   }
 }
 libm {
diff --git a/sysdeps/ia64/ia64libgcc.S b/sysdeps/ia64/ia64libgcc.S
deleted file mode 100644 (file)
index 3f77b06..0000000
+++ /dev/null
@@ -1,350 +0,0 @@
-/* From the Intel IA-64 Optimization Guide, choose the minimum latency
-   alternative.  */
-
-#include <sysdep.h>
-#undef ret
-
-#include <shlib-compat.h>
-
-#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_2_6)
-
-/* __divtf3
-   Compute a 80-bit IEEE double-extended quotient.
-   farg0 holds the dividend.  farg1 holds the divisor.  */
-
-ENTRY(___divtf3)
-       cmp.eq p7, p0 = r0, r0
-       frcpa.s0 f10, p6 = farg0, farg1
-       ;;
-(p6)   cmp.ne p7, p0 = r0, r0
-       .pred.rel.mutex p6, p7
-(p6)   fnma.s1 f11 = farg1, f10, f1
-(p6)   fma.s1 f12 = farg0, f10, f0
-       ;;
-(p6)   fma.s1 f13 = f11, f11, f0
-(p6)   fma.s1 f14 = f11, f11, f11
-       ;;
-(p6)   fma.s1 f11 = f13, f13, f11
-(p6)   fma.s1 f13 = f14, f10, f10
-       ;;
-(p6)   fma.s1 f10 = f13, f11, f10
-(p6)   fnma.s1 f11 = farg1, f12, farg0
-       ;;
-(p6)   fma.s1 f11 = f11, f10, f12
-(p6)   fnma.s1 f12 = farg1, f10, f1
-       ;;
-(p6)   fma.s1 f10 = f12, f10, f10
-(p6)   fnma.s1 f12 = farg1, f11, farg0
-       ;;
-(p6)   fma.s0 fret0 = f12, f10, f11
-(p7)   mov fret0 = f10
-       br.ret.sptk rp
-END(___divtf3)
-       .symver ___divtf3, __divtf3@GLIBC_2.2
-
-/* __divdf3
-   Compute a 64-bit IEEE double quotient.
-   farg0 holds the dividend.  farg1 holds the divisor.  */
-
-ENTRY(___divdf3)
-       cmp.eq p7, p0 = r0, r0
-       frcpa.s0 f10, p6 = farg0, farg1
-       ;;
-(p6)   cmp.ne p7, p0 = r0, r0
-       .pred.rel.mutex p6, p7
-(p6)   fmpy.s1 f11 = farg0, f10
-(p6)   fnma.s1 f12 = farg1, f10, f1
-       ;;
-(p6)   fma.s1 f11 = f12, f11, f11
-(p6)   fmpy.s1 f13 = f12, f12
-       ;;
-(p6)   fma.s1 f10 = f12, f10, f10
-(p6)   fma.s1 f11 = f13, f11, f11
-       ;;
-(p6)   fmpy.s1 f12 = f13, f13
-(p6)   fma.s1 f10 = f13, f10, f10
-       ;;
-(p6)   fma.d.s1 f11 = f12, f11, f11
-(p6)   fma.s1 f10 = f12, f10, f10
-       ;;
-(p6)   fnma.d.s1 f8 = farg1, f11, farg0
-       ;;
-(p6)   fma.d fret0 = f8, f10, f11
-(p7)   mov fret0 = f10
-       br.ret.sptk rp
-       ;;
-END(___divdf3)
-       .symver ___divdf3, __divdf3@GLIBC_2.2
-
-/* __divsf3
-   Compute a 32-bit IEEE float quotient.
-   farg0 holds the dividend.  farg1 holds the divisor.  */
-
-ENTRY(___divsf3)
-       cmp.eq p7, p0 = r0, r0
-       frcpa.s0 f10, p6 = farg0, farg1
-       ;;
-(p6)   cmp.ne p7, p0 = r0, r0
-       .pred.rel.mutex p6, p7
-(p6)   fmpy.s1 f8 = farg0, f10
-(p6)   fnma.s1 f9 = farg1, f10, f1
-       ;;
-(p6)   fma.s1 f8 = f9, f8, f8
-(p6)   fmpy.s1 f9 = f9, f9
-       ;;
-(p6)   fma.s1 f8 = f9, f8, f8
-(p6)   fmpy.s1 f9 = f9, f9
-       ;;
-(p6)   fma.d.s1 f10 = f9, f8, f8
-       ;;
-(p6)   fnorm.s.s0 fret0 = f10
-(p7)   mov fret0 = f10
-       br.ret.sptk rp
-       ;;
-END(___divsf3)
-       .symver ___divsf3, __divsf3@GLIBC_2.2
-
-/* __divdi3
-   Compute a 64-bit integer quotient.
-   in0 holds the dividend.  in1 holds the divisor.  */
-
-ENTRY(___divdi3)
-       .regstk 2,0,0,0
-       /* Transfer inputs to FP registers.  */
-       setf.sig f8 = in0
-       setf.sig f9 = in1
-       ;;
-       /* Convert the inputs to FP, so that they won't be treated as
-          unsigned.  */
-       fcvt.xf f8 = f8
-       fcvt.xf f9 = f9
-       ;;
-       /* Compute the reciprocal approximation.  */
-       frcpa.s1 f10, p6 = f8, f9
-       ;;
-       /* 3 Newton-Raphson iterations.  */
-(p6)   fnma.s1 f11 = f9, f10, f1
-(p6)   fmpy.s1 f12 = f8, f10
-       ;;
-(p6)   fmpy.s1 f13 = f11, f11
-(p6)   fma.s1 f12 = f11, f12, f12
-       ;;
-(p6)   fma.s1 f10 = f11, f10, f10
-(p6)   fma.s1 f11 = f13, f12, f12
-       ;;
-(p6)   fma.s1 f10 = f13, f10, f10
-(p6)   fnma.s1 f12 = f9, f11, f8
-       ;;
-(p6)   fma.s1 f10 = f12, f10, f11
-       ;;
-       /* Round quotient to an integer.  */
-       fcvt.fx.trunc.s1 f10 = f10
-       ;;
-       /* Transfer result to GP registers.  */
-       getf.sig ret0 = f10
-       br.ret.sptk rp
-       ;;
-END(___divdi3)
-       .symver ___divdi3, __divdi3@GLIBC_2.2
-
-/* __moddi3
-   Compute a 64-bit integer modulus.
-   in0 holds the dividend (a).  in1 holds the divisor (b).  */
-
-ENTRY(___moddi3)
-       .regstk 2,0,0,0
-       /* Transfer inputs to FP registers.  */
-       setf.sig f14 = in0
-       setf.sig f9 = in1
-       ;;
-       /* Convert the inputs to FP, so that they won't be treated as
-          unsigned.  */
-       fcvt.xf f8 = f14
-       fcvt.xf f9 = f9
-       ;;
-       /* Compute the reciprocal approximation.  */
-       frcpa.s1 f10, p6 = f8, f9
-       ;;
-       /* 3 Newton-Raphson iterations.  */
-(p6)   fmpy.s1 f12 = f8, f10
-(p6)   fnma.s1 f11 = f9, f10, f1
-       ;;
-(p6)   fma.s1 f12 = f11, f12, f12
-(p6)   fmpy.s1 f13 = f11, f11
-       ;;
-(p6)   fma.s1 f10 = f11, f10, f10
-(p6)   fma.s1 f11 = f13, f12, f12
-       ;;
-       sub in1 = r0, in1
-(p6)   fma.s1 f10 = f13, f10, f10
-(p6)   fnma.s1 f12 = f9, f11, f8
-       ;;
-       setf.sig f9 = in1
-(p6)   fma.s1 f10 = f12, f10, f11
-       ;;
-       fcvt.fx.trunc.s1 f10 = f10
-       ;;
-       /* r = q * (-b) + a  */
-       xma.l f10 = f10, f9, f14
-       ;;
-       /* Transfer result to GP registers.  */
-       getf.sig ret0 = f10
-       br.ret.sptk rp
-       ;;
-END(___moddi3)
-       .symver ___moddi3, __moddi3@GLIBC_2.2
-
-/* __udivdi3
-   Compute a 64-bit unsigned integer quotient.
-   in0 holds the dividend.  in1 holds the divisor.  */
-
-ENTRY(___udivdi3)
-       .regstk 2,0,0,0
-       /* Transfer inputs to FP registers.  */
-       setf.sig f8 = in0
-       setf.sig f9 = in1
-       ;;
-       /* Convert the inputs to FP, to avoid FP software-assist faults.  */
-       fcvt.xuf.s1 f8 = f8
-       fcvt.xuf.s1 f9 = f9
-       ;;
-       /* Compute the reciprocal approximation.  */
-       frcpa.s1 f10, p6 = f8, f9
-       ;;
-       /* 3 Newton-Raphson iterations.  */
-(p6)   fnma.s1 f11 = f9, f10, f1
-(p6)   fmpy.s1 f12 = f8, f10
-       ;;
-(p6)   fmpy.s1 f13 = f11, f11
-(p6)   fma.s1 f12 = f11, f12, f12
-       ;;
-(p6)   fma.s1 f10 = f11, f10, f10
-(p6)   fma.s1 f11 = f13, f12, f12
-       ;;
-(p6)   fma.s1 f10 = f13, f10, f10
-(p6)   fnma.s1 f12 = f9, f11, f8
-       ;;
-(p6)   fma.s1 f10 = f12, f10, f11
-       ;;
-       /* Round quotient to an unsigned integer.  */
-       fcvt.fxu.trunc.s1 f10 = f10
-       ;;
-       /* Transfer result to GP registers.  */
-       getf.sig ret0 = f10
-       br.ret.sptk rp
-       ;;
-END(___udivdi3)
-       .symver ___udivdi3, __udivdi3@GLIBC_2.2
-
-/* __umoddi3
-   Compute a 64-bit unsigned integer modulus.
-   in0 holds the dividend (a).  in1 holds the divisor (b).  */
-
-ENTRY(___umoddi3)
-       .regstk 2,0,0,0
-       /* Transfer inputs to FP registers.  */
-       setf.sig f14 = in0
-       setf.sig f9 = in1
-       ;;
-       /* Convert the inputs to FP, to avoid FP software assist faults.  */
-       fcvt.xuf.s1 f8 = f14
-       fcvt.xuf.s1 f9 = f9
-       ;;
-       /* Compute the reciprocal approximation.  */
-       frcpa.s1 f10, p6 = f8, f9
-       ;;
-       /* 3 Newton-Raphson iterations.  */
-(p6)   fmpy.s1 f12 = f8, f10
-(p6)   fnma.s1 f11 = f9, f10, f1
-       ;;
-(p6)   fma.s1 f12 = f11, f12, f12
-(p6)   fmpy.s1 f13 = f11, f11
-       ;;
-(p6)   fma.s1 f10 = f11, f10, f10
-(p6)   fma.s1 f11 = f13, f12, f12
-       ;;
-       sub in1 = r0, in1
-(p6)   fma.s1 f10 = f13, f10, f10
-(p6)   fnma.s1 f12 = f9, f11, f8
-       ;;
-       setf.sig f9 = in1
-(p6)   fma.s1 f10 = f12, f10, f11
-       ;;
-       /* Round quotient to an unsigned integer.  */
-       fcvt.fxu.trunc.s1 f10 = f10
-       ;;
-       /* r = q * (-b) + a  */
-       xma.l f10 = f10, f9, f14
-       ;;
-       /* Transfer result to GP registers.  */
-       getf.sig ret0 = f10
-       br.ret.sptk rp
-       ;;
-END(___umoddi3)
-       .symver ___umoddi3, __umoddi3@GLIBC_2.2
-
-/* __multi3
-   Compute a 128-bit multiply of 128-bit multiplicands.
-   in0/in1 holds one multiplicand (a), in2/in3 holds the other one (b).  */
-
-ENTRY(___multi3)
-       .regstk 4,0,0,0
-       setf.sig f6 = in1
-       movl r19 = 0xffffffff
-       setf.sig f7 = in2
-       ;;
-       and r14 = r19, in0
-       ;;
-       setf.sig f10 = r14
-       and r14 = r19, in2
-       xmpy.l f9 = f6, f7
-       ;;
-       setf.sig f6 = r14
-       shr.u r14 = in0, 32
-       ;;
-       setf.sig f7 = r14
-       shr.u r14 = in2, 32
-       ;;
-       setf.sig f8 = r14
-       xmpy.l f11 = f10, f6
-       xmpy.l f6 = f7, f6
-       ;;
-       getf.sig r16 = f11
-       xmpy.l f7 = f7, f8
-       ;;
-       shr.u r14 = r16, 32
-       and r16 = r19, r16
-       getf.sig r17 = f6
-       setf.sig f6 = in0
-       ;;
-       setf.sig f11 = r14
-       getf.sig r21 = f7
-       setf.sig f7 = in3
-       ;;
-       xma.l f11 = f10, f8, f11
-       xma.l f6 = f6, f7, f9
-       ;;
-       getf.sig r18 = f11
-       ;;
-       add r18 = r18, r17
-       ;;
-       and r15 = r19, r18
-       cmp.ltu p7, p6 = r18, r17
-       ;;
-       getf.sig r22 = f6
-(p7)   adds r14 = 1, r19
-       ;;
-(p7)   add r21 = r21, r14
-       shr.u r14 = r18, 32
-       shl r15 = r15, 32
-       ;;
-       add r20 = r21, r14
-       ;;
-       add ret0 = r15, r16
-       add ret1 = r22, r20
-       br.ret.sptk rp
-       ;;
-END(___multi3)
-       .symver ___multi3, __multi3@GLIBC_2.2
-
-#endif
diff --git a/sysdeps/ia64/libgcc-compat.c b/sysdeps/ia64/libgcc-compat.c
new file mode 100644 (file)
index 0000000..36a1702
--- /dev/null
@@ -0,0 +1,112 @@
+/* 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_2, GLIBC_2_2_6)
+
+typedef int int128_t __attribute__((__mode__(TI)));
+
+extern long double __divtf3 (long double, long double) attribute_hidden;
+long double __divtf3_internal (long double x, long double y)
+{
+  return __divtf3 (x, y);
+}
+symbol_version (__divtf3_internal, __divtf3, GLIBC_2.2);
+
+extern double __divdf3 (double, double) attribute_hidden;
+double __divdf3_internal (double x, double y)
+{
+  return __divdf3 (x, y);
+}
+symbol_version (__divdf3_internal, __divdf3, GLIBC_2.2);
+
+extern float __divsf3 (float, float) attribute_hidden;
+float __divsf3_internal (float x, float y)
+{
+  return __divsf3 (x, y);
+}
+symbol_version (__divsf3_internal, __divsf3, GLIBC_2.2);
+
+extern int64_t __divdi3 (int64_t, int64_t) attribute_hidden;
+int64_t __divdi3_internal (int64_t x, int64_t y)
+{
+  return __divdi3 (x, y);
+}
+symbol_version (__divdi3_internal, __divdi3, GLIBC_2.2);
+
+extern int64_t __moddi3 (int64_t, int64_t) attribute_hidden;
+int64_t __moddi3_internal (int64_t x, int64_t y)
+{
+  return __moddi3 (x, y);
+}
+symbol_version (__moddi3_internal, __moddi3, GLIBC_2.2);
+
+extern uint64_t __udivdi3 (uint64_t, uint64_t) attribute_hidden;
+uint64_t __udivdi3_internal (uint64_t x, uint64_t y)
+{
+  return __udivdi3 (x, y);
+}
+symbol_version (__udivdi3_internal, __udivdi3, GLIBC_2.2);
+
+extern uint64_t __umoddi3 (uint64_t, uint64_t) attribute_hidden;
+uint64_t __umoddi3_internal (uint64_t x, uint64_t y)
+{
+  return __umoddi3 (x, y);
+}
+symbol_version (__umoddi3_internal, __umoddi3, GLIBC_2.2);
+
+extern int128_t __multi3 (int128_t, int128_t) attribute_hidden;
+int128_t __multi3_internal (int128_t x, int128_t y)
+{
+  return __multi3 (x, y);
+}
+symbol_version (__multi3_internal, __multi3, GLIBC_2.2);
+
+extern int64_t __divsi3 (int64_t, int64_t) attribute_hidden;
+int64_t __divsi3_internal (int64_t x, int64_t y)
+{
+  return __divsi3 (x, y);
+}
+symbol_version (__divsi3_internal, __divsi3, GLIBC_2.2);
+
+extern int64_t __modsi3 (int64_t, int64_t) attribute_hidden;
+int64_t __modsi3_internal (int64_t x, int64_t y)
+{
+  return __modsi3 (x, y);
+}
+symbol_version (__modsi3_internal, __modsi3, GLIBC_2.2);
+
+extern uint64_t __udivsi3 (uint64_t, uint64_t) attribute_hidden;
+uint64_t __udivsi3_internal (uint64_t x, uint64_t y)
+{
+  return __udivsi3 (x, y);
+}
+symbol_version (__udivsi3_internal, __udivsi3, GLIBC_2.2);
+
+extern uint64_t __umodsi3 (uint64_t, uint64_t) attribute_hidden;
+uint64_t __umodsi3_internal (uint64_t x, uint64_t y)
+{
+  return __umodsi3 (x, y);
+}
+symbol_version (__umodsi3_internal, __umodsi3, GLIBC_2.2);
+
+#endif
diff --git a/sysdeps/m68k/Deps b/sysdeps/m68k/Deps
new file mode 100644 (file)
index 0000000..7682409
--- /dev/null
@@ -0,0 +1 @@
+libgcc-compat.c
index 5a887bba70165845b273ee9a4d0adab22bd5f3a2..7a86e9d78990d1d29cf5543169882e30566113c7 100644 (file)
@@ -47,3 +47,11 @@ endif
 ifeq ($(subdir),gmon)
 CFLAGS-mcount.c += -Wno-frame-address
 endif
+
+ifeq ($(subdir),csu)
+ifeq (yes,$(build-shared))
+# Compatibility
+sysdep_routines += libgcc-compat
+shared-only-routines += libgcc-compat
+endif
+endif
index f450291a9bed37f4602c3d60e05f24b7262c0a9b..af462a69d027edf24e68993e839f22745b8e832e 100644 (file)
@@ -2,6 +2,14 @@ libc {
   GLIBC_2.0 {
     # Functions from libgcc.
     __divdi3; __moddi3; __udivdi3; __umoddi3;
+    __ashldi3;
+    __ashrdi3;
+    __fixdfdi;
+    __fixsfdi;
+    __fixunsdfdi;
+    __fixunssfdi;
+    __floatdidf;
+    __floatdisf;
   }
 }
 libm {
diff --git a/sysdeps/m68k/libgcc-compat.c b/sysdeps/m68k/libgcc-compat.c
new file mode 100644 (file)
index 0000000..6f2a935
--- /dev/null
@@ -0,0 +1,83 @@
+/* pre-.hidden libgcc compatibility
+   Copyright (C) 2003 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by GOTO Masanori <gotom@debian.org>
+
+   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 __ashldi3_internal (int64_t u, int32_t b)
+{
+  return __ashldi3 (u, b);
+}
+symbol_version (__ashldi3_internal, __ashldi3, GLIBC_2.0);
+
+extern int64_t __ashrdi3 (int64_t, int32_t);
+int64_t __ashrdi3_internal (int64_t u, int32_t b)
+{
+  return __ashrdi3 (u, b);
+}
+symbol_version (__ashrdi3_internal, __ashrdi3, GLIBC_2.0);
+
+extern int64_t __fixdfdi (double);
+int64_t __fixdfdi_internal (double d)
+{
+  return __fixdfdi (d);
+}
+symbol_version (__fixdfdi_internal, __fixdfdi, GLIBC_2.0);
+
+extern int64_t __fixsfdi (float);
+int64_t __fixsfdi_internal (float d)
+{
+  return __fixsfdi (d);
+}
+symbol_version (__fixsfdi_internal, __fixsfdi, GLIBC_2.0);
+
+extern int64_t __fixunsdfdi (double);
+int64_t __fixunsdfdi_internal (double d)
+{
+  return __fixunsdfdi (d);
+}
+symbol_version (__fixunsdfdi_internal, __fixunsdfdi, GLIBC_2.0);
+
+extern int64_t __fixunssfdi (float);
+int64_t __fixunssfdi_internal (float d)
+{
+  return __fixunssfdi (d);
+}
+symbol_version (__fixunssfdi_internal, __fixunssfdi, GLIBC_2.0);
+
+extern double __floatdidf (int64_t);
+double __floatdidf_internal (int64_t u)
+{
+  return __floatdidf (u);
+}
+symbol_version (__floatdidf_internal, __floatdidf, GLIBC_2.0);
+
+extern float __floatdisf (int64_t);
+float __floatdisf_internal (int64_t u)
+{
+  return __floatdisf (u);
+}
+symbol_version (__floatdisf_internal, __floatdisf, GLIBC_2.0);
+
+#endif
index dec0b024c3a84399ca2b59402a4e290a0273c484..80c2ebf397c4f5b4941f4b915bc9918aa610f56e 100644 (file)
@@ -1,3 +1,11 @@
 ifeq ($(filter -mabi=32,$(CC)),)
 CC += -mabi=32
 endif
+
+ifeq ($(subdir),csu)
+ifeq (yes,$(build-shared))
+# Compatibility
+sysdep_routines += libgcc-compat
+shared-only-routines += libgcc-compat
+endif
+endif
diff --git a/sysdeps/mips/mips32/Versions b/sysdeps/mips/mips32/Versions
new file mode 100644 (file)
index 0000000..98afb18
--- /dev/null
@@ -0,0 +1,8 @@
+libc {
+  GLIBC_2.0 {
+    # Functions from libgcc.
+    __cmpdi2; __ucmpdi2;
+    __divdi3; __moddi3; __udivdi3; __umoddi3;
+    __fixdfdi; __floatdidf; __floatdisf;
+  }
+}
diff --git a/sysdeps/mips/mips32/libgcc-compat.c b/sysdeps/mips/mips32/libgcc-compat.c
new file mode 100644 (file)
index 0000000..fd85c28
--- /dev/null
@@ -0,0 +1,66 @@
+/* pre-.hidden libgcc compatibility
+   Copyright (C) 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Guido Guenther <agx@sigxcpu.org>
+
+   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 int32_t __cmpdi2 (int64_t, int64_t);
+int32_t __cmpdi2_internal (int64_t u, int64_t v)
+{
+  return __cmpdi2 (u, v);
+}
+symbol_version (__cmpdi2_internal, __cmpdi2, GLIBC_2.0);
+
+
+extern int32_t __ucmpdi2 (int64_t, int64_t);
+int32_t __ucmpdi2_internal (int64_t u, int64_t v)
+{
+  return __ucmpdi2 (u, v);
+}
+symbol_version (__ucmpdi2_internal, __ucmpdi2, GLIBC_2.0);
+
+
+extern int64_t __fixdfdi (double);
+int64_t __fixdfdi_internal (double d)
+{
+  return __fixdfdi (d);
+}
+symbol_version (__fixdfdi_internal, __fixdfdi, GLIBC_2.0);
+
+
+extern double __floatdidf (int64_t);
+double __floatdidf_internal (int64_t u)
+{
+         return __floatdidf (u);
+}
+symbol_version (__floatdidf_internal, __floatdidf, GLIBC_2.0);
+
+
+extern float __floatdisf (int64_t);
+float __floatdisf_internal (int64_t u)
+{
+  return __floatdisf (u);
+}
+symbol_version (__floatdisf_internal, __floatdisf, GLIBC_2.0);
+
+#endif