some superh fixes

This commit is contained in:
Mike Frysinger 2005-08-30 22:53:18 +00:00
parent 58ba99a1ea
commit b75753d0c8
3 changed files with 84 additions and 0 deletions

View File

@ -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;

View File

@ -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) \

View File

@ -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