From: GNU Libc Maintainers Date: Sat, 2 Dec 2017 10:07:17 +0000 (+0000) Subject: local-libgcc-compat-ports X-Git-Tag: archive/raspbian/2.25-3+rpi1^2~28 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=5476d798f97140b04e258cee06abfae9f73a3fdc;p=glibc.git local-libgcc-compat-ports # 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 --- diff --git a/sysdeps/alpha/Makefile b/sysdeps/alpha/Makefile index 98da3b57e..04962f0da 100644 --- a/sysdeps/alpha/Makefile +++ b/sysdeps/alpha/Makefile @@ -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 diff --git a/sysdeps/alpha/Versions b/sysdeps/alpha/Versions index ae8fde7b2..6c49bbab2 100644 --- a/sysdeps/alpha/Versions +++ b/sysdeps/alpha/Versions @@ -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 index 000000000..56e198ba5 --- /dev/null +++ b/sysdeps/alpha/libgcc-compat.c @@ -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 + + 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 +#include + +#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 diff --git a/sysdeps/arm/Makefile b/sysdeps/arm/Makefile index 2849aeda4..e1d1d90f7 100644 --- a/sysdeps/arm/Makefile +++ b/sysdeps/arm/Makefile @@ -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 diff --git a/sysdeps/arm/Versions b/sysdeps/arm/Versions index f26a1a760..438e09253 100644 --- a/sysdeps/arm/Versions +++ b/sysdeps/arm/Versions @@ -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 index 000000000..1157ecd24 --- /dev/null +++ b/sysdeps/arm/libgcc-compat.c @@ -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 + + 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 +#include + +#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 diff --git a/sysdeps/ia64/Makefile b/sysdeps/ia64/Makefile index 5ebca89af..34e6009c3 100644 --- a/sysdeps/ia64/Makefile +++ b/sysdeps/ia64/Makefile @@ -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 diff --git a/sysdeps/ia64/Versions b/sysdeps/ia64/Versions index ac3bff9b7..2027f8d2d 100644 --- a/sysdeps/ia64/Versions +++ b/sysdeps/ia64/Versions @@ -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 index 3f77b06a5..000000000 --- a/sysdeps/ia64/ia64libgcc.S +++ /dev/null @@ -1,350 +0,0 @@ -/* From the Intel IA-64 Optimization Guide, choose the minimum latency - alternative. */ - -#include -#undef ret - -#include - -#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 index 000000000..36a17025b --- /dev/null +++ b/sysdeps/ia64/libgcc-compat.c @@ -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 +#include + +#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 index 000000000..768240925 --- /dev/null +++ b/sysdeps/m68k/Deps @@ -0,0 +1 @@ +libgcc-compat.c diff --git a/sysdeps/m68k/Makefile b/sysdeps/m68k/Makefile index 5a887bba7..7a86e9d78 100644 --- a/sysdeps/m68k/Makefile +++ b/sysdeps/m68k/Makefile @@ -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 diff --git a/sysdeps/m68k/Versions b/sysdeps/m68k/Versions index f450291a9..af462a69d 100644 --- a/sysdeps/m68k/Versions +++ b/sysdeps/m68k/Versions @@ -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 index 000000000..6f2a93578 --- /dev/null +++ b/sysdeps/m68k/libgcc-compat.c @@ -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 + + 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 +#include + +#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 diff --git a/sysdeps/mips/mips32/Makefile b/sysdeps/mips/mips32/Makefile index dec0b024c..80c2ebf39 100644 --- a/sysdeps/mips/mips32/Makefile +++ b/sysdeps/mips/mips32/Makefile @@ -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 index 000000000..98afb18b7 --- /dev/null +++ b/sysdeps/mips/mips32/Versions @@ -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 index 000000000..fd85c288a --- /dev/null +++ b/sysdeps/mips/mips32/libgcc-compat.c @@ -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 + + 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 +#include + +#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