OSDN Git Service

* config/pdp11/pdp11.c (pdp11_trampoline_init): New.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Sep 2009 15:14:54 +0000 (15:14 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Sep 2009 15:14:54 +0000 (15:14 +0000)
        (TARGET_TRAMPOLINE_INIT): New.
        * config/pdp11/pdp11.h (TRAMPOLINE_TEMPLATE): Remove.
        (INITIALIZE_TRAMPOLINE): Move code to pdp11_trampoline_init.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@152006 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/pdp11/pdp11.c
gcc/config/pdp11/pdp11.h

index cdb3ec9..1c1b45e 100644 (file)
        adjust for hook parameters.
        (TRAMPOLINE_ADJUST_ADDRESS): Move code to pa_trampoline_adjust_address.
 
+       * config/pdp11/pdp11.c (pdp11_trampoline_init): New.
+       (TARGET_TRAMPOLINE_INIT): New.
+       * config/pdp11/pdp11.h (TRAMPOLINE_TEMPLATE): Remove.
+       (INITIALIZE_TRAMPOLINE): Move code to pdp11_trampoline_init.
+
 2009-09-22  Jakub Jelinek  <jakub@redhat.com>
 
        * config/rs6000/rs6000.c (bdesc_2arg): Fix CODE_FOR_vector_gt* codes
index b467608..f95d03c 100644 (file)
@@ -152,6 +152,7 @@ static void pdp11_output_function_prologue (FILE *, HOST_WIDE_INT);
 static void pdp11_output_function_epilogue (FILE *, HOST_WIDE_INT);
 static bool pdp11_rtx_costs (rtx, int, int, int *, bool);
 static bool pdp11_return_in_memory (const_tree, const_tree);
+static void pdp11_trampoline_init (rtx, tree, rtx);
 \f
 /* Initialize the GCC target structure.  */
 #undef TARGET_ASM_BYTE_OP
@@ -185,6 +186,9 @@ static bool pdp11_return_in_memory (const_tree, const_tree);
 #undef TARGET_RETURN_IN_MEMORY
 #define TARGET_RETURN_IN_MEMORY pdp11_return_in_memory
 
+#undef TARGET_TRAMPOLINE_INIT
+#define TARGET_TRAMPOLINE_INIT pdp11_trampoline_init
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 \f
 /* Implement TARGET_HANDLE_OPTION.  */
@@ -1740,3 +1744,31 @@ pdp11_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
   return (TYPE_MODE (type) == DImode
          || (TYPE_MODE (type) == DFmode && ! TARGET_AC0));
 }
+
+/* Worker function for TARGET_TRAMPOLINE_INIT.
+
+   trampoline - how should i do it in separate i+d ? 
+   have some allocate_trampoline magic??? 
+
+   the following should work for shared I/D:
+
+   MV  #STATIC, $4     0x940Y  0x0000 <- STATIC; Y = STATIC_CHAIN_REGNUM
+   JMP FUNCTION        0x0058  0x0000 <- FUNCTION
+*/
+
+static void
+pdp11_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
+{
+  rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
+  rtx mem;
+
+  gcc_assert (!TARGET_SPLIT);
+
+  mem = adjust_address (m_tramp, HImode, 0);
+  emit_move_insn (mem, GEN_INT (0x9400+STATIC_CHAIN_REGNUM));
+  mem = adjust_address (m_tramp, HImode, 2);
+  emit_move_insn (mem, chain_value);
+  mem = adjust_address (m_tramp, HImode, 4);
+  emit_move_insn (mem, GEN_INT (0x0058));
+  emit_move_insn (mem, fnaddr);
+}
index ac678f5..8997612 100644 (file)
@@ -983,42 +983,9 @@ extern struct rtx_def *cc0_reg_rtx;
   fprintf (FILE, "\tmov (sp)+, %s\n", reg_names[REGNO])        \
 )
 
-/* trampoline - how should i do it in separate i+d ? 
-   have some allocate_trampoline magic??? 
-
-   the following should work for shared I/D: */
-
-/* lets see whether this works as trampoline:
-MV     #STATIC, $4     0x940Y  0x0000 <- STATIC; Y = STATIC_CHAIN_REGNUM
-JMP    FUNCTION        0x0058  0x0000 <- FUNCTION
-*/
-
-#define TRAMPOLINE_TEMPLATE(FILE)      \
-{                                      \
-  gcc_assert (!TARGET_SPLIT);          \
-                                       \
-  assemble_aligned_integer (2, GEN_INT (0x9400+STATIC_CHAIN_REGNUM));  \
-  assemble_aligned_integer (2, const0_rtx);                            \
-  assemble_aligned_integer (2, GEN_INT(0x0058));                       \
-  assemble_aligned_integer (2, const0_rtx);                            \
-}
-
 #define TRAMPOLINE_SIZE 8
 #define TRAMPOLINE_ALIGNMENT 16
 
-/* Emit RTL insns to initialize the variable parts of a trampoline.
-   FNADDR is an RTX for the address of the function's pure code.
-   CXT is an RTX for the static chain value for the function.  */
-
-#define INITIALIZE_TRAMPOLINE(TRAMP,FNADDR,CXT)        \
-{                                      \
-  gcc_assert (!TARGET_SPLIT);          \
-                                       \
-  emit_move_insn (gen_rtx_MEM (HImode, plus_constant (TRAMP, 2)), CXT); \
-  emit_move_insn (gen_rtx_MEM (HImode, plus_constant (TRAMP, 6)), FNADDR); \
-}
-
-
 /* Some machines may desire to change what optimizations are
    performed for various optimization levels.   This macro, if
    defined, is executed once just after the optimization level is