diff options
author | Imre Kaloz <kaloz@openwrt.org> | 2005-12-16 11:36:33 +0000 |
---|---|---|
committer | Imre Kaloz <kaloz@openwrt.org> | 2005-12-16 11:36:33 +0000 |
commit | 5375be1ec8fdb21b8038850c83ff77dd4e001f3c (patch) | |
tree | f8aa7884cbb0b6597a568436cccd4ed081c7e7df /toolchain/gcc/3.4.5/71_all_sh-pr16665-fix.patch | |
parent | b6062e1086572a2717612cde5ce0e2de74da0d98 (diff) | |
download | master-187ad058-5375be1ec8fdb21b8038850c83ff77dd4e001f3c.tar.gz master-187ad058-5375be1ec8fdb21b8038850c83ff77dd4e001f3c.tar.bz2 master-187ad058-5375be1ec8fdb21b8038850c83ff77dd4e001f3c.zip |
add gcc 3.4.5
git-svn-id: svn://svn.openwrt.org/openwrt/trunk/openwrt@2695 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'toolchain/gcc/3.4.5/71_all_sh-pr16665-fix.patch')
-rw-r--r-- | toolchain/gcc/3.4.5/71_all_sh-pr16665-fix.patch | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/toolchain/gcc/3.4.5/71_all_sh-pr16665-fix.patch b/toolchain/gcc/3.4.5/71_all_sh-pr16665-fix.patch new file mode 100644 index 0000000000..680bb3978d --- /dev/null +++ b/toolchain/gcc/3.4.5/71_all_sh-pr16665-fix.patch @@ -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; |