From 92910d774d50640ec270c2386a96cfa78f1663ae Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Tue, 22 Sep 2009 08:12:16 -0700 Subject: [PATCH] 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 --- gcc/ChangeLog | 9 +++++ gcc/config/bfin/bfin-protos.h | 1 - gcc/config/bfin/bfin.c | 73 ++++++++++++++++++++++++++--------- gcc/config/bfin/bfin.h | 24 ------------ 4 files changed, 63 insertions(+), 44 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ce25f08b776b..c9c2cda03f6f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -70,6 +70,15 @@ * config/avr/avr.h (TRAMPOLINE_TEMPLATE, 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. + 2009-09-22 Jakub Jelinek * config/rs6000/rs6000.c (bdesc_2arg): Fix CODE_FOR_vector_gt* codes diff --git a/gcc/config/bfin/bfin-protos.h b/gcc/config/bfin/bfin-protos.h index b2d3d8c2dbd1..4a9b7a117683 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 92aaf5770c42..32d72abc2aa9 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; } -/* 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. */ +/* Write a template for a trampoline to F. */ -void -initialize_trampoline (rtx tramp, rtx fnaddr, rtx cxt) +static void +bfin_asm_trampoline_template (FILE *f) { - rtx t1 = copy_to_reg (fnaddr); - rtx t2 = copy_to_reg (cxt); - rtx addr; + 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 + M_TRAMP. FNDECL is the target function. CHAIN_VALUE is an RTX for + the static chain value for the function. */ + +static void +bfin_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value) +{ + 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 34032b282251..03a279036f33 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.