Commit b75753d0 authored by Mike Frysinger's avatar Mike Frysinger
Browse files

some superh fixes

parent 58ba99a1
Loading
Loading
Loading
Loading
+43 −0
Original line number Diff line number Diff line
--- gcc/gcc/config/sh/sh.c
+++ gcc/gcc/config/sh/sh.c
@@ -9106,6 +9106,15 @@ sh_output_mi_thunk (FILE *file, tree thu
     }
   this = FUNCTION_ARG (cum, Pmode, ptr_type_node, 1);
 
+  /* In PIC case, we set PIC register to compute the target address.  We
+     can use a scratch register to save and restore the original value  
+     except for SHcompact.  For SHcompact, use stack.  */
+  if (flag_pic && TARGET_SHCOMPACT)
+    {
+      push (PIC_OFFSET_TABLE_REGNUM);
+      emit_insn (gen_GOTaddr2picreg ());
+    }
+
   /* For SHcompact, we only have r0 for a scratch register: r1 is the
      static chain pointer (even if you can't have nested virtual functions
      right now, someone might implement them sometime), and the rest of the
@@ -9188,8 +9197,24 @@ sh_output_mi_thunk (FILE *file, tree thu
       assemble_external (function);
       TREE_USED (function) = 1;
     }
+  /* We can use scratch1 to save and restore the original value of
+     PIC register except for SHcompact.  */
+  if (flag_pic && ! TARGET_SHCOMPACT)
+    {
+      emit_move_insn (scratch1,
+		      gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM));
+      emit_insn (gen_GOTaddr2picreg ());
+    }
   funexp = XEXP (DECL_RTL (function), 0);
   emit_move_insn (scratch2, funexp);
+  if (flag_pic)
+    {
+      if (! TARGET_SHCOMPACT)
+	emit_move_insn (gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM),
+			scratch1);
+      else
+	pop (PIC_OFFSET_TABLE_REGNUM);
+    }
   funexp = gen_rtx_MEM (FUNCTION_MODE, scratch2);
   sibcall = emit_call_insn (gen_sibcall (funexp, const0_rtx, NULL_RTX));
   SIBLING_CALL_P (sibcall) = 1;
+13 −0
Original line number Diff line number Diff line
--- g/gcc/config/sh/sh.h
+++ g/gcc/config/sh/sh.h
@@ -422,6 +422,10 @@
 do {									\
   if (LEVEL)								\
     flag_omit_frame_pointer = -1;					\
+  if (LEVEL <= 2)							\
+    {									\
+      flag_reorder_blocks = 0;						\
+    }									\
   if (SIZE)								\
     target_flags |= SPACE_BIT;						\
   if (TARGET_SHMEDIA && LEVEL > 1)					\
+28 −0
Original line number Diff line number Diff line
2005-03-24  J"orn Rennecke <joern.rennecke@st.com>

	Band aid for PR target/20617:
	* config/sh/lib1funcs.asm (FUNC, ALIAS): Add .hidden directive.

--- g/gcc/config/sh/lib1funcs.asm
+++ g/gcc/config/sh/lib1funcs.asm
@@ -37,9 +37,19 @@ Boston, MA 02111-1307, USA.  */
    ELF local label prefixes by J"orn Rennecke
    amylaar@cygnus.com  */
 
+#define ALIAS(X,Y)	.global GLOBAL(X); .set GLOBAL(X),GLOBAL(Y)
+
 #ifdef __ELF__
 #define LOCAL(X)	.L_##X
-#define FUNC(X)		.type X,@function
+
+#if 1 /* ??? The export list mechanism is broken, everything that is not
+	 hidden is exported.  */
+#undef FUNC
+#define FUNC(X)		.type X,@function; .hidden X
+#undef ALIAS
+#define ALIAS(X,Y)	.global GLOBAL(X); .set GLOBAL(X),GLOBAL(Y); .hidden GLOBAL(X)
+#endif
+
 #define ENDFUNC0(X)	.Lfe_##X: .size X,.Lfe_##X-X
 #define ENDFUNC(X)	ENDFUNC0(X)
 #else