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