[PATCH] Fix PR target/15647 for sh-linux

Kaz Kojima kkojima@rr.iij4u.or.jp
Wed May 26 11:14:00 GMT 2004


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  <kkojima@gcc.gnu.org>

	* 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
+}



More information about the Gcc-patches mailing list