aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/bfin
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2009-09-22 08:12:16 -0700
committerRichard Henderson <rth@gcc.gnu.org>2009-09-22 08:12:16 -0700
commit92910d774d50640ec270c2386a96cfa78f1663ae (patch)
treea011fc87c218aa889113929577ca2988e764f419 /gcc/config/bfin
parent6eee506e2f0db40ff2d344c8cff9ebe7d0a6a458 (diff)
downloadgcc-92910d774d50640ec270c2386a96cfa78f1663ae.zip
gcc-92910d774d50640ec270c2386a96cfa78f1663ae.tar.gz
gcc-92910d774d50640ec270c2386a96cfa78f1663ae.tar.bz2
bfin-protos.h (initialize_trampoline): Remove.
* config/bfin/bfin-protos.h (initialize_trampoline): Remove. * config/bfin/bfin.c (bfin_asm_trampoline_template): New. (bfin_trampoline_init): Rename from initialize_trampoline; make static; update for target hook parameters. (TARGET_ASM_TRAMPOLINE_TEMPLATE, TARGET_TRAMPOLINE_INIT): New. * config/bfin/bfin.h (TRAMPOLINE_TEMPLATE): Move code to bfin_asm_trampoline_template. (INITIALIZE_TRAMPOLINE): Remove. From-SVN: r151988
Diffstat (limited to 'gcc/config/bfin')
-rw-r--r--gcc/config/bfin/bfin-protos.h1
-rw-r--r--gcc/config/bfin/bfin.c71
-rw-r--r--gcc/config/bfin/bfin.h24
3 files changed, 53 insertions, 43 deletions
diff --git a/gcc/config/bfin/bfin-protos.h b/gcc/config/bfin/bfin-protos.h
index b2d3d8c..4a9b7a1 100644
--- a/gcc/config/bfin/bfin-protos.h
+++ b/gcc/config/bfin/bfin-protos.h
@@ -110,7 +110,6 @@ extern void asm_conditional_branch (rtx, rtx *, int, int);
extern rtx bfin_gen_compare (rtx, Mmode);
extern int bfin_local_alignment (tree, int);
-extern void initialize_trampoline (rtx, rtx, rtx);
extern rtx bfin_va_arg (tree, tree);
extern void bfin_expand_prologue (void);
diff --git a/gcc/config/bfin/bfin.c b/gcc/config/bfin/bfin.c
index 92aaf57..32d72ab 100644
--- a/gcc/config/bfin/bfin.c
+++ b/gcc/config/bfin/bfin.c
@@ -2094,37 +2094,67 @@ bfin_function_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED,
return !called_func->local || this_func->local;
}
+/* Write a template for a trampoline to F. */
+
+static void
+bfin_asm_trampoline_template (FILE *f)
+{
+ if (TARGET_FDPIC)
+ {
+ fprintf (f, "\t.dd\t0x00000000\n"); /* 0 */
+ fprintf (f, "\t.dd\t0x00000000\n"); /* 0 */
+ fprintf (f, "\t.dd\t0x0000e109\n"); /* p1.l = fn low */
+ fprintf (f, "\t.dd\t0x0000e149\n"); /* p1.h = fn high */
+ fprintf (f, "\t.dd\t0x0000e10a\n"); /* p2.l = sc low */
+ fprintf (f, "\t.dd\t0x0000e14a\n"); /* p2.h = sc high */
+ fprintf (f, "\t.dw\t0xac4b\n"); /* p3 = [p1 + 4] */
+ fprintf (f, "\t.dw\t0x9149\n"); /* p1 = [p1] */
+ fprintf (f, "\t.dw\t0x0051\n"); /* jump (p1)*/
+ }
+ else
+ {
+ fprintf (f, "\t.dd\t0x0000e109\n"); /* p1.l = fn low */
+ fprintf (f, "\t.dd\t0x0000e149\n"); /* p1.h = fn high */
+ fprintf (f, "\t.dd\t0x0000e10a\n"); /* p2.l = sc low */
+ fprintf (f, "\t.dd\t0x0000e14a\n"); /* p2.h = sc high */
+ fprintf (f, "\t.dw\t0x0051\n"); /* jump (p1)*/
+ }
+}
+
/* Emit RTL insns to initialize the variable parts of a trampoline at
- TRAMP. 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. */
+ M_TRAMP. FNDECL is the target function. CHAIN_VALUE is an RTX for
+ the static chain value for the function. */
-void
-initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt)
+static void
+bfin_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
{
- rtx t1 = copy_to_reg (fnaddr);
- rtx t2 = copy_to_reg (cxt);
- rtx addr;
+ rtx t1 = copy_to_reg (XEXP (DECL_RTL (fndecl), 0));
+ rtx t2 = copy_to_reg (chain_value);
+ rtx mem;
int i = 0;
+ emit_block_move (m_tramp, assemble_trampoline_template (),
+ GEN_INT (TRAMPOLINE_SIZE), BLOCK_OP_NORMAL);
+
if (TARGET_FDPIC)
{
- rtx a = memory_address (Pmode, plus_constant (tramp, 8));
- addr = memory_address (Pmode, tramp);
- emit_move_insn (gen_rtx_MEM (SImode, addr), a);
+ rtx a = force_reg (Pmode, plus_constant (XEXP (m_tramp, 0), 8));
+ mem = adjust_address (m_tramp, Pmode, 0);
+ emit_move_insn (mem, a);
i = 8;
}
- addr = memory_address (Pmode, plus_constant (tramp, i + 2));
- emit_move_insn (gen_rtx_MEM (HImode, addr), gen_lowpart (HImode, t1));
+ mem = adjust_address (m_tramp, HImode, i + 2);
+ emit_move_insn (mem, gen_lowpart (HImode, t1));
emit_insn (gen_ashrsi3 (t1, t1, GEN_INT (16)));
- addr = memory_address (Pmode, plus_constant (tramp, i + 6));
- emit_move_insn (gen_rtx_MEM (HImode, addr), gen_lowpart (HImode, t1));
+ mem = adjust_address (m_tramp, HImode, i + 6);
+ emit_move_insn (mem, gen_lowpart (HImode, t1));
- addr = memory_address (Pmode, plus_constant (tramp, i + 10));
- emit_move_insn (gen_rtx_MEM (HImode, addr), gen_lowpart (HImode, t2));
+ mem = adjust_address (m_tramp, HImode, i + 10);
+ emit_move_insn (mem, gen_lowpart (HImode, t2));
emit_insn (gen_ashrsi3 (t2, t2, GEN_INT (16)));
- addr = memory_address (Pmode, plus_constant (tramp, i + 14));
- emit_move_insn (gen_rtx_MEM (HImode, addr), gen_lowpart (HImode, t2));
+ mem = adjust_address (m_tramp, HImode, i + 14);
+ emit_move_insn (mem, gen_lowpart (HImode, t2));
}
/* Emit insns to move operands[1] into operands[0]. */
@@ -6619,4 +6649,9 @@ bfin_expand_builtin (tree exp, rtx target ATTRIBUTE_UNUSED,
#undef TARGET_CAN_ELIMINATE
#define TARGET_CAN_ELIMINATE bfin_can_eliminate
+#undef TARGET_ASM_TRAMPOLINE_TEMPLATE
+#define TARGET_ASM_TRAMPOLINE_TEMPLATE bfin_asm_trampoline_template
+#undef TARGET_TRAMPOLINE_INIT
+#define TARGET_TRAMPOLINE_INIT bfin_trampoline_init
+
struct gcc_target targetm = TARGET_INITIALIZER;
diff --git a/gcc/config/bfin/bfin.h b/gcc/config/bfin/bfin.h
index 34032b28..03a2790 100644
--- a/gcc/config/bfin/bfin.h
+++ b/gcc/config/bfin/bfin.h
@@ -386,30 +386,6 @@ extern const char *bfin_library_id_string;
&& (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
#define TRAMPOLINE_SIZE (TARGET_FDPIC ? 30 : 18)
-#define TRAMPOLINE_TEMPLATE(FILE) \
- if (TARGET_FDPIC) \
- { \
- fprintf(FILE, "\t.dd\t0x00000000\n"); /* 0 */ \
- fprintf(FILE, "\t.dd\t0x00000000\n"); /* 0 */ \
- fprintf(FILE, "\t.dd\t0x0000e109\n"); /* p1.l = fn low */ \
- fprintf(FILE, "\t.dd\t0x0000e149\n"); /* p1.h = fn high */ \
- fprintf(FILE, "\t.dd\t0x0000e10a\n"); /* p2.l = sc low */ \
- fprintf(FILE, "\t.dd\t0x0000e14a\n"); /* p2.h = sc high */ \
- fprintf(FILE, "\t.dw\t0xac4b\n"); /* p3 = [p1 + 4] */ \
- fprintf(FILE, "\t.dw\t0x9149\n"); /* p1 = [p1] */ \
- fprintf(FILE, "\t.dw\t0x0051\n"); /* jump (p1)*/ \
- } \
- else \
- { \
- fprintf(FILE, "\t.dd\t0x0000e109\n"); /* p1.l = fn low */ \
- fprintf(FILE, "\t.dd\t0x0000e149\n"); /* p1.h = fn high */ \
- fprintf(FILE, "\t.dd\t0x0000e10a\n"); /* p2.l = sc low */ \
- fprintf(FILE, "\t.dd\t0x0000e14a\n"); /* p2.h = sc high */ \
- fprintf(FILE, "\t.dw\t0x0051\n"); /* jump (p1)*/ \
- }
-
-#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
- initialize_trampoline (TRAMP, FNADDR, CXT)
/* Definitions for register eliminations.