some superh fixes
authorMike Frysinger <vapier@gentoo.org>
Tue, 30 Aug 2005 22:53:18 +0000 (22:53 -0000)
committerMike Frysinger <vapier@gentoo.org>
Tue, 30 Aug 2005 22:53:18 +0000 (22:53 -0000)
toolchain/gcc/3.4.4/71_all_sh-pr16665-fix.patch [new file with mode: 0644]
toolchain/gcc/3.4.4/72_all_sh-no-reorder-blocks.patch [new file with mode: 0644]
toolchain/gcc/3.4.4/73_all_sh-pr20617.patch [new file with mode: 0644]

diff --git a/toolchain/gcc/3.4.4/71_all_sh-pr16665-fix.patch b/toolchain/gcc/3.4.4/71_all_sh-pr16665-fix.patch
new file mode 100644 (file)
index 0000000..680bb39
--- /dev/null
@@ -0,0 +1,43 @@
+--- 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;
diff --git a/toolchain/gcc/3.4.4/72_all_sh-no-reorder-blocks.patch b/toolchain/gcc/3.4.4/72_all_sh-no-reorder-blocks.patch
new file mode 100644 (file)
index 0000000..8b98268
--- /dev/null
@@ -0,0 +1,13 @@
+--- 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)                                    \
diff --git a/toolchain/gcc/3.4.4/73_all_sh-pr20617.patch b/toolchain/gcc/3.4.4/73_all_sh-pr20617.patch
new file mode 100644 (file)
index 0000000..6d8021c
--- /dev/null
@@ -0,0 +1,28 @@
+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