yann@1: Received: (qmail 11693 invoked from network); 26 May 2004 03:17:41 -0000 yann@1: Received: from unknown (HELO r-rr.iij4u.or.jp) (210.130.0.76) yann@1: by sourceware dot org with SMTP; 26 May 2004 03:17:41 -0000 yann@1: Received: from localhost (frgw.3in.ne.jp [210.251.121.226]) yann@1: by r-rr dot iij4u dot or dot jp (8 dot 11 dot 6+IIJ/8 dot 11 dot 6) with ESMTP id i4Q3HbJ21421; yann@1: Wed, 26 May 2004 12:17:37 +0900 (JST) yann@1: Date: Wed, 26 May 2004 12:13:58 +0900 (JST) yann@1: Message-Id: <20040526.121358.39460214.kkojima@rr.iij4u.or.jp> yann@1: To: gcc-patches at gcc dot gnu dot org yann@1: Cc: Mark Mitchell yann@1: Subject: [PATCH] Fix PR target/15647 for sh-linux yann@1: From: Kaz Kojima yann@1: Mime-Version: 1.0 yann@1: Content-Type: Text/Plain; charset=us-ascii yann@1: Content-Transfer-Encoding: 7bit yann@1: yann@1: Hi, yann@1: yann@1: The appended patch is to fix PR target/15647 yann@1: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15647 yann@1: for linux. yann@1: __udivsi3 is exported from libgcc_s.so.1 and gcc generates the code yann@1: which assumes r1 will be not clobbered when calling __udivsi3 in SH3 yann@1: case. This is bad because r1 is clobbered by PLT. yann@1: The another functions listed in the standard libgcc-std.ver which yann@1: possively have similar problem are __ashlsi3, __ashrsi3 and __lshrsi3, yann@1: though these are used only by SH1/2. yann@1: The patch below simply uses an SH specific libgcc-std.ver which drops yann@1: these functions. SH linux uses a linker script libgcc_s.so having yann@1: libgcc.a as a suppementary library, so these functions given by yann@1: libgcc.a when needed in the link time. yann@1: Although mainline has one failure in bulding zlib which can be avoided yann@1: with -fno-reorder-blocks for sh3-unknown-linux-gnu target, x86 cross yann@1: to sh3-unknown-linux-gnu can be build successfully on mainline with yann@1: this patch except the above failure. 3.4-branch successfully bootstraps yann@1: with it and there are no new failures on the native sh4-unknown-linux-gnu. yann@1: The patch is highly sh-linux specific and seems to be safe. I'll check yann@1: it into mainline. yann@1: The original PR is also for sh3 netbsd. I'd like to leave it for the yann@1: netbsd experts. yann@1: yann@1: I think that it's too late for 3.3.4. Mark, is it also late for yann@1: 3.4.1? yann@1: yann@1: Regards, yann@1: kaz yann@1: -- yann@1: 2004-05-26 Kaz Kojima yann@1: yann@1: * config/sh/t-linux (SHLIB_MAPFILES): Use sh specific yann@1: libgcc-std.ver. yann@1: * config/sh/libgcc-std.ver: New file. yann@1: yann@1: diff -u3prN ORIG-gcc/gcc/config/sh/t-linux LOCAL-gcc/gcc/config/sh/t-linux yann@1: --- ORIG-gcc/gcc/config/sh/t-linux Mon Feb 16 20:13:25 2004 yann@1: +++ LOCAL-gcc/gcc/config/sh/t-linux Tue May 25 18:25:48 2004 yann@1: @@ -11,8 +11,11 @@ MULTILIB_EXCEPTIONS= yann@1: EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o yann@1: yann@1: # Override t-slibgcc-elf-ver to export some libgcc symbols with yann@1: -# the symbol versions that glibc used. yann@1: -SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver $(srcdir)/config/sh/libgcc-glibc.ver yann@1: +# the symbol versions that glibc used. Also use an sh specific yann@1: +# libgcc-std.ver to avoid to export some lib1func routines which yann@1: +# should not be called via PLT. yann@1: +SHLIB_MAPFILES = $(srcdir)/config/sh/libgcc-std.ver \ yann@1: + $(srcdir)/config/sh/libgcc-glibc.ver yann@1: yann@1: # Override SHLIB_LINK and SHLIB_INSTALL to use linker script yann@1: # libgcc_s.so. yann@1: diff -u3prN ORIG-gcc/gcc/config/sh/libgcc-std.ver LOCAL-gcc/gcc/config/sh/libgcc-std.ver yann@1: --- ORIG-gcc/gcc/config/sh/libgcc-std.ver Thu Jan 1 09:00:00 1970 yann@1: +++ LOCAL-gcc/gcc/config/sh/libgcc-std.ver Tue May 25 18:50:54 2004 yann@1: @@ -0,0 +1,213 @@ yann@1: +GCC_3.0 { yann@1: + # libgcc1 integer symbols yann@1: + __absvsi2 yann@1: + __addvsi3 yann@1: + # __ashlsi3 yann@1: + # __ashrsi3 yann@1: + __divsi3 yann@1: + # __lshrsi3 yann@1: + __modsi3 yann@1: + __mulsi3 yann@1: + __mulvsi3 yann@1: + __negvsi2 yann@1: + __subvsi3 yann@1: + # __udivsi3 yann@1: + __umodsi3 yann@1: + yann@1: + # libgcc1 floating point symbols yann@1: + __addsf3 yann@1: + __adddf3 yann@1: + __addxf3 yann@1: + __addtf3 yann@1: + __divsf3 yann@1: + __divdf3 yann@1: + __divxf3 yann@1: + __divtf3 yann@1: + __eqsf2 yann@1: + __eqdf2 yann@1: + __eqxf2 yann@1: + __eqtf2 yann@1: + __extenddfxf2 yann@1: + __extenddftf2 yann@1: + __extendsfdf2 yann@1: + __extendsfxf2 yann@1: + __extendsftf2 yann@1: + __fixsfsi yann@1: + __fixdfsi yann@1: + __fixxfsi yann@1: + __fixtfsi yann@1: + __floatsisf yann@1: + __floatsidf yann@1: + __floatsixf yann@1: + __floatsitf yann@1: + __gesf2 yann@1: + __gedf2 yann@1: + __gexf2 yann@1: + __getf2 yann@1: + __gtsf2 yann@1: + __gtdf2 yann@1: + __gtxf2 yann@1: + __gttf2 yann@1: + __lesf2 yann@1: + __ledf2 yann@1: + __lexf2 yann@1: + __letf2 yann@1: + __ltsf2 yann@1: + __ltdf2 yann@1: + __ltxf2 yann@1: + __lttf2 yann@1: + __mulsf3 yann@1: + __muldf3 yann@1: + __mulxf3 yann@1: + __multf3 yann@1: + __negsf2 yann@1: + __negdf2 yann@1: + __negxf2 yann@1: + __negtf2 yann@1: + __nesf2 yann@1: + __nedf2 yann@1: + __nexf2 yann@1: + __netf2 yann@1: + __subsf3 yann@1: + __subdf3 yann@1: + __subxf3 yann@1: + __subtf3 yann@1: + __truncdfsf2 yann@1: + __truncxfsf2 yann@1: + __trunctfsf2 yann@1: + __truncxfdf2 yann@1: + __trunctfdf2 yann@1: + yann@1: + # libgcc2 DImode arithmetic (for 32-bit targets). yann@1: + __absvdi2 yann@1: + __addvdi3 yann@1: + __ashldi3 yann@1: + __ashrdi3 yann@1: + __cmpdi2 yann@1: + __divdi3 yann@1: + __ffsdi2 yann@1: + __fixdfdi yann@1: + __fixsfdi yann@1: + __fixtfdi yann@1: + __fixxfdi yann@1: + __fixunsdfdi yann@1: + __fixunsdfsi yann@1: + __fixunssfsi yann@1: + __fixunssfdi yann@1: + __fixunstfdi yann@1: + __fixunstfsi yann@1: + __fixunsxfdi yann@1: + __fixunsxfsi yann@1: + __floatdidf yann@1: + __floatdisf yann@1: + __floatdixf yann@1: + __floatditf yann@1: + __lshrdi3 yann@1: + __moddi3 yann@1: + __muldi3 yann@1: + __mulvdi3 yann@1: + __negdi2 yann@1: + __negvdi2 yann@1: + __subvdi3 yann@1: + __ucmpdi2 yann@1: + __udivdi3 yann@1: + __udivmoddi4 yann@1: + __umoddi3 yann@1: + yann@1: + # libgcc2 TImode arithmetic (for 64-bit targets). yann@1: + __ashlti3 yann@1: + __ashrti3 yann@1: + __cmpti2 yann@1: + __divti3 yann@1: + __ffsti2 yann@1: + __fixdfti yann@1: + __fixsfti yann@1: + __fixtfti yann@1: + __fixxfti yann@1: + __lshrti3 yann@1: + __modti3 yann@1: + __multi3 yann@1: + __negti2 yann@1: + __ucmpti2 yann@1: + __udivmodti4 yann@1: + __udivti3 yann@1: + __umodti3 yann@1: + __fixunsdfti yann@1: + __fixunssfti yann@1: + __fixunstfti yann@1: + __fixunsxfti yann@1: + __floattidf yann@1: + __floattisf yann@1: + __floattixf yann@1: + __floattitf yann@1: + yann@1: + # Used to deal with trampoline initialization on some platforms yann@1: + __clear_cache yann@1: + yann@1: + # EH symbols yann@1: + _Unwind_DeleteException yann@1: + _Unwind_Find_FDE yann@1: + _Unwind_ForcedUnwind yann@1: + _Unwind_GetGR yann@1: + _Unwind_GetIP yann@1: + _Unwind_GetLanguageSpecificData yann@1: + _Unwind_GetRegionStart yann@1: + _Unwind_GetTextRelBase yann@1: + _Unwind_GetDataRelBase yann@1: + _Unwind_RaiseException yann@1: + _Unwind_Resume yann@1: + _Unwind_SetGR yann@1: + _Unwind_SetIP yann@1: + __deregister_frame yann@1: + __deregister_frame_info yann@1: + __deregister_frame_info_bases yann@1: + __register_frame yann@1: + __register_frame_info yann@1: + __register_frame_info_bases yann@1: + __register_frame_info_table yann@1: + __register_frame_info_table_bases yann@1: + __register_frame_table yann@1: + yann@1: + # SjLj EH symbols yann@1: + _Unwind_SjLj_Register yann@1: + _Unwind_SjLj_Unregister yann@1: + _Unwind_SjLj_RaiseException yann@1: + _Unwind_SjLj_ForcedUnwind yann@1: + _Unwind_SjLj_Resume yann@1: +} yann@1: + yann@1: +%inherit GCC_3.3 GCC_3.0 yann@1: +GCC_3.3 { yann@1: + _Unwind_FindEnclosingFunction yann@1: + _Unwind_GetCFA yann@1: + _Unwind_Backtrace yann@1: + _Unwind_Resume_or_Rethrow yann@1: + _Unwind_SjLj_Resume_or_Rethrow yann@1: +} yann@1: + yann@1: +%inherit GCC_3.3.1 GCC_3.3 yann@1: +GCC_3.3.1 { yann@1: + __gcc_personality_sj0 yann@1: + __gcc_personality_v0 yann@1: +} yann@1: + yann@1: +%inherit GCC_3.3.2 GCC_3.3.1 yann@1: +GCC_3.3.2 { yann@1: +} yann@1: + yann@1: +%inherit GCC_3.4 GCC_3.3.2 yann@1: +GCC_3.4 { yann@1: + # bit scanning and counting built-ins yann@1: + __clzsi2 yann@1: + __clzdi2 yann@1: + __clzti2 yann@1: + __ctzsi2 yann@1: + __ctzdi2 yann@1: + __ctzti2 yann@1: + __popcountsi2 yann@1: + __popcountdi2 yann@1: + __popcountti2 yann@1: + __paritysi2 yann@1: + __paritydi2 yann@1: + __parityti2 yann@1: +} yann@1: