Loading toolchain/gcc/3.4.4/71_all_sh-pr16665-fix.patch 0 → 100644 +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; toolchain/gcc/3.4.4/72_all_sh-no-reorder-blocks.patch 0 → 100644 +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) \ toolchain/gcc/3.4.4/73_all_sh-pr20617.patch 0 → 100644 +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 Loading
toolchain/gcc/3.4.4/71_all_sh-pr16665-fix.patch 0 → 100644 +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;
toolchain/gcc/3.4.4/72_all_sh-no-reorder-blocks.patch 0 → 100644 +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) \
toolchain/gcc/3.4.4/73_all_sh-pr20617.patch 0 → 100644 +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