mips.h (TARGET_SPLIT_CALLS): Check TARGET_CALL_CLOBBERED_GP.

gcc/
	* config/mips/mips.h (TARGET_SPLIT_CALLS): Check
	TARGET_CALL_CLOBBERED_GP.
	(TARGET_SIBCALLS): Check TARGET_USE_GOT instead of TARGET_ABICALLS.
	(TARGET_USE_GOT, TARGET_CALL_CLOBBERED_GP): New macros.
	(TARGET_CALL_SAVED_GP, TARGET_USE_PIC_FN_ADDR_REG): Likewise.
	(STARTING_FRAME_OFFSET): Check TARGET_CALL_CLOBBERED_GP instead
	of TARGET_ABICALLS && !TARGET_NEWABI.
	(MIPS_CALL): Check TARGET_USE_GOT instead of TARGET_ABICALLS.
	* config/mips/mips.c (mips_load_call_address): Check
	TARGET_CALL_SAVED_GP instead of TARGET_NEWABI.
	(mips_global_pointer): Check TARGET_USE_GOT instead of TARGET_ABICALLS.
	Check TARGET_CALL_SAVED_GP instead of TARGET_NEWABI.
	(mips_save_reg_p): Check TARGET_CALL_SAVED_GP instead of
	TARGET_ABICALLS && TARGET_NEWABI.
	(mips_current_loadgp_style): Check TARGET_USE_GOT instead of
	TARGET_ABICALLS.
	(mips_expand_prologue): Check TARGET_OLDABI instead of !TARGET_NEWABI.
	(mips_expand_epilogue): Check TARGET_CALL_SAVED_GP instead of
	TARGET_ABICALLS && TARGET_NEWABI.
	(mips_output_mi_thunk): Check TARGET_USE_GOT instead of
	TARGET_ABICALLS.  Check TARGET_CALL_SAVED_GP instead of
	TARGET_NEWABI.  Use TARGET_USE_PIC_FN_ADDR_REG to decide
	whether indirect calls must use $25.
	(mips_extra_live_on_entry): Check TARGET_GOT instead of
	TARGET_ABICALLS.
	* config/mips/mips.md (jal_macro): Check flag_pic and
	TARGET_CALL_CLOBBERED_GP instead of TARGET_ABICALLS and TARGET_NEWABI.
	(builtin_setjmp_setup, builtin_longjmp): Check TARGET_USE_GOT
	instead of TARGET_ABICALLS.
	(exception_receiver): Check TARGET_CALL_CLOBBERED_GP instead of
	TARGET_ABICALLS && TARGET_OLDABI.
	(load_call<mode>): Check TARGET_USE_GOT instead of TARGET_ABICALLS.
	(sibcall): In the comment above the define_insn, mention
	TARGET_USE_PIC_FN_ADDR_REG instead of TARGET_ABICALLS.
	* config/mips/constraints.md (c): Check TARGET_USE_PIC_FN_ADDR_REG
	instead of TARGET_ABICALLS.

From-SVN: r123751
This commit is contained in:
Richard Sandiford 2007-04-12 17:10:56 +00:00 committed by Richard Sandiford
parent 2f11881446
commit 14976818e7
5 changed files with 107 additions and 55 deletions

View File

@ -1,3 +1,42 @@
2007-04-12 Richard Sandiford <richard@codesourcery.com>
* config/mips/mips.h (TARGET_SPLIT_CALLS): Check
TARGET_CALL_CLOBBERED_GP.
(TARGET_SIBCALLS): Check TARGET_USE_GOT instead of TARGET_ABICALLS.
(TARGET_USE_GOT, TARGET_CALL_CLOBBERED_GP): New macros.
(TARGET_CALL_SAVED_GP, TARGET_USE_PIC_FN_ADDR_REG): Likewise.
(STARTING_FRAME_OFFSET): Check TARGET_CALL_CLOBBERED_GP instead
of TARGET_ABICALLS && !TARGET_NEWABI.
(MIPS_CALL): Check TARGET_USE_GOT instead of TARGET_ABICALLS.
* config/mips/mips.c (mips_load_call_address): Check
TARGET_CALL_SAVED_GP instead of TARGET_NEWABI.
(mips_global_pointer): Check TARGET_USE_GOT instead of TARGET_ABICALLS.
Check TARGET_CALL_SAVED_GP instead of TARGET_NEWABI.
(mips_save_reg_p): Check TARGET_CALL_SAVED_GP instead of
TARGET_ABICALLS && TARGET_NEWABI.
(mips_current_loadgp_style): Check TARGET_USE_GOT instead of
TARGET_ABICALLS.
(mips_expand_prologue): Check TARGET_OLDABI instead of !TARGET_NEWABI.
(mips_expand_epilogue): Check TARGET_CALL_SAVED_GP instead of
TARGET_ABICALLS && TARGET_NEWABI.
(mips_output_mi_thunk): Check TARGET_USE_GOT instead of
TARGET_ABICALLS. Check TARGET_CALL_SAVED_GP instead of
TARGET_NEWABI. Use TARGET_USE_PIC_FN_ADDR_REG to decide
whether indirect calls must use $25.
(mips_extra_live_on_entry): Check TARGET_GOT instead of
TARGET_ABICALLS.
* config/mips/mips.md (jal_macro): Check flag_pic and
TARGET_CALL_CLOBBERED_GP instead of TARGET_ABICALLS and TARGET_NEWABI.
(builtin_setjmp_setup, builtin_longjmp): Check TARGET_USE_GOT
instead of TARGET_ABICALLS.
(exception_receiver): Check TARGET_CALL_CLOBBERED_GP instead of
TARGET_ABICALLS && TARGET_OLDABI.
(load_call<mode>): Check TARGET_USE_GOT instead of TARGET_ABICALLS.
(sibcall): In the comment above the define_insn, mention
TARGET_USE_PIC_FN_ADDR_REG instead of TARGET_ABICALLS.
* config/mips/constraints.md (c): Check TARGET_USE_PIC_FN_ADDR_REG
instead of TARGET_ABICALLS.
2007-04-12 Bernd Schmidt <bernd.schmidt@analog.com>
* doc/md.texi (Blackfin family constraints): Document PA and PB.

View File

@ -42,7 +42,7 @@
(define_register_constraint "b" "ALL_REGS"
"@internal")
(define_register_constraint "c" "TARGET_ABICALLS ? PIC_FN_ADDR_REG
(define_register_constraint "c" "TARGET_USE_PIC_FN_ADDR_REG ? PIC_FN_ADDR_REG
: TARGET_MIPS16 ? M16_NA_REGS
: GR_REGS"
"A register suitable for use in an indirect jump. This will always be

View File

@ -3354,10 +3354,10 @@ mips_load_call_address (rtx dest, rtx addr, int sibcall_p)
{
/* If we're generating PIC, and this call is to a global function,
try to allow its address to be resolved lazily. This isn't
possible for NewABI sibcalls since the value of $gp on entry
possible if TARGET_CALL_SAVED_GP since the value of $gp on entry
to the stub would be our caller's gp, not ours. */
if (TARGET_EXPLICIT_RELOCS
&& !(sibcall_p && TARGET_NEWABI)
&& !(sibcall_p && TARGET_CALL_SAVED_GP)
&& global_got_operand (addr, VOIDmode))
{
rtx high, lo_sum_symbol;
@ -6144,8 +6144,8 @@ mips_global_pointer (void)
{
unsigned int regno;
/* $gp is always available in non-abicalls code. */
if (!TARGET_ABICALLS)
/* $gp is always available unless we're using a GOT. */
if (!TARGET_USE_GOT)
return GLOBAL_POINTER_REGNUM;
/* We must always provide $gp when it is used implicitly. */
@ -6182,7 +6182,7 @@ mips_global_pointer (void)
/* We need a global pointer, but perhaps we can use a call-clobbered
register instead of $gp. */
if (TARGET_NEWABI && current_function_is_leaf)
if (TARGET_CALL_SAVED_GP && current_function_is_leaf)
for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
if (!regs_ever_live[regno]
&& call_used_regs[regno]
@ -6199,10 +6199,10 @@ mips_global_pointer (void)
static bool
mips_save_reg_p (unsigned int regno)
{
/* We only need to save $gp for NewABI PIC. */
/* We only need to save $gp if TARGET_CALL_SAVED_GP and only then
if we have not chosen a call-clobbered substitute. */
if (regno == GLOBAL_POINTER_REGNUM)
return (TARGET_ABICALLS && TARGET_NEWABI
&& cfun->machine->global_pointer == regno);
return TARGET_CALL_SAVED_GP && cfun->machine->global_pointer == regno;
/* Check call-saved registers. */
if (regs_ever_live[regno] && !call_used_regs[regno])
@ -6546,7 +6546,7 @@ mips_output_cplocal (void)
enum mips_loadgp_style
mips_current_loadgp_style (void)
{
if (!TARGET_ABICALLS || cfun->machine->global_pointer == 0)
if (!TARGET_USE_GOT || cfun->machine->global_pointer == 0)
return LOADGP_NONE;
if (TARGET_ABSOLUTE_ABICALLS)
@ -6858,7 +6858,7 @@ mips_expand_prologue (void)
mips_emit_loadgp ();
/* If generating o32/o64 abicalls, save $gp on the stack. */
if (TARGET_ABICALLS && !TARGET_NEWABI && !current_function_is_leaf)
if (TARGET_ABICALLS && TARGET_OLDABI && !current_function_is_leaf)
emit_insn (gen_cprestore (GEN_INT (current_function_outgoing_args_size)));
/* If we are profiling, make sure no instructions are scheduled before
@ -6992,10 +6992,10 @@ mips_expand_epilogue (int sibcall_p)
if (target != stack_pointer_rtx)
emit_move_insn (stack_pointer_rtx, target);
/* If we're using addressing macros for n32/n64 abicalls, $gp is
implicitly used by all SYMBOL_REFs. We must emit a blockage
insn before restoring it. */
if (TARGET_ABICALLS && TARGET_NEWABI && !TARGET_EXPLICIT_RELOCS)
/* If we're using addressing macros, $gp is implicitly used by all
SYMBOL_REFs. We must emit a blockage insn before restoring $gp
from the stack. */
if (TARGET_CALL_SAVED_GP && !TARGET_EXPLICIT_RELOCS)
emit_insn (gen_blockage ());
/* Restore the registers. */
@ -7086,12 +7086,12 @@ mips_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
reload_completed = 1;
reset_block_changes ();
/* Pick a global pointer for -mabicalls. Use $15 rather than $28
for TARGET_NEWABI since the latter is a call-saved register. */
if (TARGET_ABICALLS)
/* Pick a global pointer. Use a call-clobbered register if
TARGET_CALL_SAVED_GP, so that we can use a sibcall. */
if (TARGET_USE_GOT)
cfun->machine->global_pointer
= REGNO (pic_offset_table_rtx)
= TARGET_NEWABI ? 15 : GLOBAL_POINTER_REGNUM;
= TARGET_CALL_SAVED_GP ? 15 : GLOBAL_POINTER_REGNUM;
/* Set up the global pointer for n32 or n64 abicalls. */
mips_emit_loadgp ();
@ -7137,24 +7137,27 @@ mips_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
/* Jump to the target function. Use a sibcall if direct jumps are
allowed, otherwise load the address into a register first. */
fnaddr = XEXP (DECL_RTL (function), 0);
if (TARGET_MIPS16 || TARGET_ABICALLS || TARGET_LONG_CALLS)
if (TARGET_MIPS16 || TARGET_USE_GOT || TARGET_LONG_CALLS)
{
/* This is messy. gas treats "la $25,foo" as part of a call
sequence and may allow a global "foo" to be lazily bound.
The general move patterns therefore reject this combination.
In this context, lazy binding would actually be OK for o32 and o64,
but it's still wrong for n32 and n64; see mips_load_call_address.
We must therefore load the address via a temporary register if
mips_dangerous_for_la25_p.
In this context, lazy binding would actually be OK
for TARGET_CALL_CLOBBERED_GP, but it's still wrong for
TARGET_CALL_SAVED_GP; see mips_load_call_address.
We must therefore load the address via a temporary
register if mips_dangerous_for_la25_p.
If we jump to the temporary register rather than $25, the assembler
can use the move insn to fill the jump's delay slot. */
if (TARGET_ABICALLS && !mips_dangerous_for_la25_p (fnaddr))
if (TARGET_USE_PIC_FN_ADDR_REG
&& !mips_dangerous_for_la25_p (fnaddr))
temp1 = gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM);
mips_load_call_address (temp1, fnaddr, true);
if (TARGET_ABICALLS && REGNO (temp1) != PIC_FUNCTION_ADDR_REGNUM)
if (TARGET_USE_PIC_FN_ADDR_REG
&& REGNO (temp1) != PIC_FUNCTION_ADDR_REGNUM)
emit_move_insn (gen_rtx_REG (Pmode, PIC_FUNCTION_ADDR_REGNUM), temp1);
emit_jump_insn (gen_indirect_jump (temp1));
}
@ -10878,13 +10881,13 @@ mips_encode_section_info (tree decl, rtx rtl, int first)
}
}
/* Implement TARGET_EXTRA_LIVE_ON_ENTRY. PIC_FUNCTION_ADDR_REGNUM is live
on entry to a function when generating -mshared abicalls code. */
/* Implement TARGET_EXTRA_LIVE_ON_ENTRY. Some code models use the incoming
value of PIC_FUNCTION_ADDR_REGNUM to set up the global pointer. */
static void
mips_extra_live_on_entry (bitmap regs)
{
if (TARGET_ABICALLS && !TARGET_ABSOLUTE_ABICALLS)
if (TARGET_USE_GOT && !TARGET_ABSOLUTE_ABICALLS)
bitmap_set_bit (regs, PIC_FUNCTION_ADDR_REGNUM);
}

View File

@ -144,12 +144,11 @@ extern const struct mips_rtx_cost_data *mips_cost;
/* Run-time compilation parameters selecting different hardware subsets. */
/* True if the call patterns should be split into a jalr followed by
an instruction to restore $gp. This is only ever true for SVR4 PIC,
in which $gp is call-clobbered. It is only safe to split the load
an instruction to restore $gp. It is only safe to split the load
from the call when every use of $gp is explicit. */
#define TARGET_SPLIT_CALLS \
(TARGET_EXPLICIT_RELOCS && TARGET_ABICALLS && !TARGET_NEWABI)
(TARGET_EXPLICIT_RELOCS && TARGET_CALL_CLOBBERED_GP)
/* True if we're generating a form of -mabicalls in which we can use
operators like %hi and %lo to refer to locally-binding symbols.
@ -173,12 +172,22 @@ extern const struct mips_rtx_cost_data *mips_cost;
using sibling calls in this case anyway; they would usually
be longer than normal calls.
- TARGET_ABICALLS && !TARGET_EXPLICIT_RELOCS. call_insn_operand
accepts global constants, but "jr $25" is the only allowed
sibcall. */
- TARGET_USE_GOT && !TARGET_EXPLICIT_RELOCS. call_insn_operand
accepts global constants, but all sibcalls must be indirect. */
#define TARGET_SIBCALLS \
(!TARGET_MIPS16 && (!TARGET_ABICALLS || TARGET_EXPLICIT_RELOCS))
(!TARGET_MIPS16 && (!TARGET_USE_GOT || TARGET_EXPLICIT_RELOCS))
/* True if we need to use a global offset table to access some symbols. */
#define TARGET_USE_GOT TARGET_ABICALLS
/* True if TARGET_USE_GOT and if $gp is a call-clobbered register. */
#define TARGET_CALL_CLOBBERED_GP (TARGET_ABICALLS && TARGET_OLDABI)
/* True if TARGET_USE_GOT and if $gp is a call-saved register. */
#define TARGET_CALL_SAVED_GP (TARGET_USE_GOT && !TARGET_CALL_CLOBBERED_GP)
/* True if indirect calls must use register class PIC_FN_ADDR_REG. */
#define TARGET_USE_PIC_FN_ADDR_REG TARGET_ABICALLS
/* True if .gpword or .gpdword should be used for switch tables.
@ -1746,8 +1755,7 @@ extern const enum reg_class mips_regno_to_class[];
((flag_profile_values && ! TARGET_64BIT \
? MAX (REG_PARM_STACK_SPACE(NULL), current_function_outgoing_args_size) \
: current_function_outgoing_args_size) \
+ (TARGET_ABICALLS && !TARGET_NEWABI \
? MIPS_STACK_ALIGN (UNITS_PER_WORD) : 0))
+ (TARGET_CALL_CLOBBERED_GP ? MIPS_STACK_ALIGN (UNITS_PER_WORD) : 0))
#define RETURN_ADDR_RTX mips_return_addr
@ -2301,13 +2309,13 @@ typedef struct mips_args {
("j" or "jal"), OPERANDS are its operands, and OPNO is the operand number
of the target.
When generating -mabicalls without explicit relocation operators,
When generating GOT code without explicit relocation operators,
all calls should use assembly macros. Otherwise, all indirect
calls should use "jr" or "jalr"; we will arrange to restore $gp
afterwards if necessary. Finally, we can only generate direct
calls for -mabicalls by temporarily switching to non-PIC mode. */
#define MIPS_CALL(INSN, OPERANDS, OPNO) \
(TARGET_ABICALLS && !TARGET_EXPLICIT_RELOCS \
(TARGET_USE_GOT && !TARGET_EXPLICIT_RELOCS \
? "%*" INSN "\t%" #OPNO "%/" \
: REG_P (OPERANDS[OPNO]) \
? "%*" INSN "r\t%" #OPNO "%/" \

View File

@ -221,15 +221,16 @@
;; This attribute is YES if the instruction is a jal macro (not a
;; real jal instruction).
;;
;; jal is always a macro for o32 and o64 abicalls because it includes an
;; instruction to restore $gp. Direct jals are also macros for -mshared
;; abicalls because they first load the target address into $25.
;; jal is always a macro for TARGET_CALL_CLOBBERED_GP because it includes
;; an instruction to restore $gp. Direct jals are also macros for
;; flag_pic && !TARGET_ABSOLUTE_ABICALLS because they first load
;; the target address into a register.
(define_attr "jal_macro" "no,yes"
(cond [(eq_attr "jal" "direct")
(symbol_ref "TARGET_ABICALLS
&& (TARGET_OLDABI || !TARGET_ABSOLUTE_ABICALLS)")
(symbol_ref "TARGET_CALL_CLOBBERED_GP
|| (flag_pic && !TARGET_ABSOLUTE_ABICALLS)")
(eq_attr "jal" "indirect")
(symbol_ref "TARGET_ABICALLS && TARGET_OLDABI")]
(symbol_ref "TARGET_CALL_CLOBBERED_GP")]
(const_string "no")))
;; Classification of each insn.
@ -4947,14 +4948,14 @@
[(set_attr "type" "jump")
(set_attr "mode" "none")])
;; For TARGET_ABICALLS, we save the gp in the jmp_buf as well.
;; For TARGET_USE_GOT, we save the gp in the jmp_buf as well.
;; While it is possible to either pull it off the stack (in the
;; o32 case) or recalculate it given t9 and our target label,
;; it takes 3 or 4 insns to do so.
(define_expand "builtin_setjmp_setup"
[(use (match_operand 0 "register_operand"))]
"TARGET_ABICALLS"
"TARGET_USE_GOT"
{
rtx addr;
@ -4969,7 +4970,7 @@
(define_expand "builtin_longjmp"
[(use (match_operand 0 "register_operand"))]
"TARGET_ABICALLS"
"TARGET_USE_GOT"
{
/* The elements of the buffer are, in order: */
int W = GET_MODE_SIZE (Pmode);
@ -5105,7 +5106,7 @@
(define_insn_and_split "exception_receiver"
[(set (reg:SI 28)
(unspec_volatile:SI [(const_int 0)] UNSPEC_EH_RECEIVER))]
"TARGET_ABICALLS && TARGET_OLDABI"
"TARGET_CALL_CLOBBERED_GP"
"#"
"&& reload_completed"
[(const_int 0)]
@ -5143,7 +5144,7 @@
(match_operand:P 2 "immediate_operand" "")
(reg:P FAKE_CALL_REGNO)]
UNSPEC_LOAD_CALL))]
"TARGET_ABICALLS"
"TARGET_USE_GOT"
"<load>\t%0,%R2(%1)"
[(set_attr "type" "load")
(set_attr "mode" "<MODE>")
@ -5157,9 +5158,10 @@
;; constraints.
;; When we use an indirect jump, we need a register that will be
;; preserved by the epilogue. Since TARGET_ABICALLS forces us to
;; use $25 for this purpose -- and $25 is never clobbered by the
;; epilogue -- we might as well use it for !TARGET_ABICALLS as well.
;; preserved by the epilogue. Since TARGET_USE_PIC_FN_ADDR_REG forces
;; us to use $25 for this purpose -- and $25 is never clobbered by the
;; epilogue -- we might as well use it for !TARGET_USE_PIC_FN_ADDR_REG
;; as well.
(define_expand "sibcall"
[(parallel [(call (match_operand 0 "")