diff -r 000000000000 -r eeea35fbf182 patches/gcc/3.4.0/pr15647-fix.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/gcc/3.4.0/pr15647-fix.patch Sat Feb 24 11:00:05 2007 +0000 @@ -0,0 +1,288 @@ +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 ++} +