ia64-protos.h (ia64_initialize_trampoline): Remove.

* config/ia64/ia64-protos.h (ia64_initialize_trampoline): Remove.
        * config/ia64/ia64.c (TARGET_TRAMPOLINE_INIT): New.
        (ia64_trampoline_init): Rename from ia64_initialize_trampoline;
        make static; adjust for hook parameters.
        * config/ia64/ia64.h (INITIALIZE_TRAMPOLINE): Remove.

From-SVN: r151994
This commit is contained in:
Richard Henderson 2009-09-22 08:13:03 -07:00 committed by Richard Henderson
parent 9f6ef043a8
commit 2a1211e51b
4 changed files with 48 additions and 42 deletions

View File

@ -108,6 +108,12 @@
* config/h8300/h8300.h (INITIALIZE_TRAMPOLINE): Move code
to h8300_trampoline_init and adjust for hook parameters.
* config/ia64/ia64-protos.h (ia64_initialize_trampoline): Remove.
* config/ia64/ia64.c (TARGET_TRAMPOLINE_INIT): New.
(ia64_trampoline_init): Rename from ia64_initialize_trampoline;
make static; adjust for hook parameters.
* config/ia64/ia64.h (INITIALIZE_TRAMPOLINE): Remove.
2009-09-22 Jakub Jelinek <jakub@redhat.com>
* config/rs6000/rs6000.c (bdesc_2arg): Fix CODE_FOR_vector_gt* codes

View File

@ -54,7 +54,6 @@ extern int ia64_direct_return (void);
extern bool ia64_expand_load_address (rtx, rtx);
extern int ia64_hard_regno_rename_ok (int, int);
extern void ia64_initialize_trampoline (rtx, rtx, rtx);
extern void ia64_print_operand_address (FILE *, rtx);
extern void ia64_print_operand (FILE *, rtx, int);
extern enum reg_class ia64_preferred_reload_class (rtx, enum reg_class);

View File

@ -302,6 +302,7 @@ static enum machine_mode ia64_promote_function_mode (const_tree,
int *,
const_tree,
int);
static void ia64_trampoline_init (rtx, tree, rtx);
/* Table of valid machine attributes. */
static const struct attribute_spec ia64_attribute_table[] =
@ -532,6 +533,9 @@ static const struct attribute_spec ia64_attribute_table[] =
#undef TARGET_CAN_ELIMINATE
#define TARGET_CAN_ELIMINATE ia64_can_eliminate
#undef TARGET_TRAMPOLINE_INIT
#define TARGET_TRAMPOLINE_INIT ia64_trampoline_init
struct gcc_target targetm = TARGET_INITIALIZER;
typedef enum
@ -3945,10 +3949,35 @@ ia64_dbx_register_number (int regno)
return regno;
}
void
ia64_initialize_trampoline (rtx addr, rtx fnaddr, rtx static_chain)
/* Implement TARGET_TRAMPOLINE_INIT.
The trampoline should set the static chain pointer to value placed
into the trampoline and should branch to the specified routine.
To make the normal indirect-subroutine calling convention work,
the trampoline must look like a function descriptor; the first
word being the target address and the second being the target's
global pointer.
We abuse the concept of a global pointer by arranging for it
to point to the data we need to load. The complete trampoline
has the following form:
+-------------------+ \
TRAMP: | __ia64_trampoline | |
+-------------------+ > fake function descriptor
| TRAMP+16 | |
+-------------------+ /
| target descriptor |
+-------------------+
| static link |
+-------------------+
*/
static void
ia64_trampoline_init (rtx m_tramp, tree fndecl, rtx static_chain)
{
rtx addr_reg, tramp, eight = GEN_INT (8);
rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
rtx addr, addr_reg, tramp, eight = GEN_INT (8);
/* The Intel assembler requires that the global __ia64_trampoline symbol
be declared explicitly */
@ -3965,13 +3994,13 @@ ia64_initialize_trampoline (rtx addr, rtx fnaddr, rtx static_chain)
}
/* Make sure addresses are Pmode even if we are in ILP32 mode. */
addr = convert_memory_address (Pmode, addr);
addr = convert_memory_address (Pmode, XEXP (m_tramp, 0));
fnaddr = convert_memory_address (Pmode, fnaddr);
static_chain = convert_memory_address (Pmode, static_chain);
/* Load up our iterator. */
addr_reg = gen_reg_rtx (Pmode);
emit_move_insn (addr_reg, addr);
addr_reg = copy_to_reg (addr);
m_tramp = adjust_automodify_address (m_tramp, Pmode, addr_reg, 0);
/* The first two words are the fake descriptor:
__ia64_trampoline, ADDR+16. */
@ -3989,19 +4018,21 @@ ia64_initialize_trampoline (rtx addr, rtx fnaddr, rtx static_chain)
emit_move_insn (reg, gen_rtx_MEM (Pmode, reg));
tramp = reg;
}
emit_move_insn (gen_rtx_MEM (Pmode, addr_reg), tramp);
emit_move_insn (m_tramp, tramp);
emit_insn (gen_adddi3 (addr_reg, addr_reg, eight));
m_tramp = adjust_automodify_address (m_tramp, VOIDmode, NULL, 8);
emit_move_insn (gen_rtx_MEM (Pmode, addr_reg),
copy_to_reg (plus_constant (addr, 16)));
emit_move_insn (m_tramp, force_reg (Pmode, plus_constant (addr, 16)));
emit_insn (gen_adddi3 (addr_reg, addr_reg, eight));
m_tramp = adjust_automodify_address (m_tramp, VOIDmode, NULL, 8);
/* The third word is the target descriptor. */
emit_move_insn (gen_rtx_MEM (Pmode, addr_reg), fnaddr);
emit_move_insn (m_tramp, force_reg (Pmode, fnaddr));
emit_insn (gen_adddi3 (addr_reg, addr_reg, eight));
m_tramp = adjust_automodify_address (m_tramp, VOIDmode, NULL, 8);
/* The fourth word is the static chain. */
emit_move_insn (gen_rtx_MEM (Pmode, addr_reg), static_chain);
emit_move_insn (m_tramp, static_chain);
}
/* Do any needed setup for a variadic function. CUM has not been updated

View File

@ -1247,31 +1247,6 @@ do { \
#define STACK_SAVEAREA_MODE(LEVEL) \
((LEVEL) == SAVE_NONLOCAL ? OImode : Pmode)
/* Output assembler code for a block containing the constant parts of
a trampoline, leaving space for the variable parts.
The trampoline should set the static chain pointer to value placed
into the trampoline and should branch to the specified routine.
To make the normal indirect-subroutine calling convention work,
the trampoline must look like a function descriptor; the first
word being the target address and the second being the target's
global pointer.
We abuse the concept of a global pointer by arranging for it
to point to the data we need to load. The complete trampoline
has the following form:
+-------------------+ \
TRAMP: | __ia64_trampoline | |
+-------------------+ > fake function descriptor
| TRAMP+16 | |
+-------------------+ /
| target descriptor |
+-------------------+
| static link |
+-------------------+
*/
/* A C expression for the size in bytes of the trampoline, as an integer. */
#define TRAMPOLINE_SIZE 32
@ -1279,11 +1254,6 @@ do { \
/* Alignment required for trampolines, in bits. */
#define TRAMPOLINE_ALIGNMENT 64
/* A C statement to initialize the variable parts of a trampoline. */
#define INITIALIZE_TRAMPOLINE(ADDR, FNADDR, STATIC_CHAIN) \
ia64_initialize_trampoline((ADDR), (FNADDR), (STATIC_CHAIN))
/* Addressing Modes */