Commit b2416742 by Hans-Peter Nilsson Committed by Hans-Peter Nilsson

re PR target/17377 (cris.md bug in "return" pattern trigged by __builtin_return_address)

	PR target/17377
	* config/cris/cris-protos.h (cris_return_address_on_stack): Declare.
	* config/cris/cris.c (cris_return_address_on_stack): New function.
	* config/cris/cris.md ("return"): For location of return address,
	also check cris_return_address_on_stack.

From-SVN: r87251
parent da3107f3
2004-09-09 Hans-Peter Nilsson <hp@axis.com>
PR target/17377
* config/cris/cris-protos.h (cris_return_address_on_stack): Declare.
* config/cris/cris.c (cris_return_address_on_stack): New function.
* config/cris/cris.md ("return"): For location of return address,
also check cris_return_address_on_stack.
2004-09-09 Diego Novillo <dnovillo@redhat.com> 2004-09-09 Diego Novillo <dnovillo@redhat.com>
* tree-outof-ssa.c (coalesce_abnormal_edges): Fix typo in * tree-outof-ssa.c (coalesce_abnormal_edges): Fix typo in
......
...@@ -47,6 +47,8 @@ extern int cris_cfun_uses_pic_table (void); ...@@ -47,6 +47,8 @@ extern int cris_cfun_uses_pic_table (void);
extern void cris_target_asm_named_section (const char *, unsigned int); extern void cris_target_asm_named_section (const char *, unsigned int);
#endif /* RTX_CODE */ #endif /* RTX_CODE */
extern int cris_return_address_on_stack (void);
extern void cris_pragma_expand_mul (struct cpp_reader *); extern void cris_pragma_expand_mul (struct cpp_reader *);
/* Need one that returns an int; usable in expressions. */ /* Need one that returns an int; usable in expressions. */
......
...@@ -1700,6 +1700,15 @@ cris_return_addr_rtx (int count, rtx frameaddr ATTRIBUTE_UNUSED) ...@@ -1700,6 +1700,15 @@ cris_return_addr_rtx (int count, rtx frameaddr ATTRIBUTE_UNUSED)
: NULL_RTX; : NULL_RTX;
} }
/* Accessor used in cris.md:return because cfun->machine isn't available
there. */
int
cris_return_address_on_stack ()
{
return cfun->machine->needs_return_address_on_stack;
}
/* This used to be the INITIAL_FRAME_POINTER_OFFSET worker; now only /* This used to be the INITIAL_FRAME_POINTER_OFFSET worker; now only
handles FP -> SP elimination offset. */ handles FP -> SP elimination offset. */
......
...@@ -3415,7 +3415,8 @@ ...@@ -3415,7 +3415,8 @@
if (i >= 0) if (i >= 0)
sprintf (rd, \"movem [$sp+],$%s\", reg_names [i]); sprintf (rd, \"movem [$sp+],$%s\", reg_names [i]);
if (regs_ever_live[CRIS_SRP_REGNUM]) if (regs_ever_live[CRIS_SRP_REGNUM]
|| cris_return_address_on_stack ())
{ {
if (*rd) if (*rd)
output_asm_insn (rd, operands); output_asm_insn (rd, operands);
...@@ -3433,7 +3434,10 @@ ...@@ -3433,7 +3434,10 @@
}" }"
[(set (attr "slottable") [(set (attr "slottable")
(if_then_else (if_then_else
(ne (symbol_ref "regs_ever_live[CRIS_SRP_REGNUM]") (const_int 0)) (ne (symbol_ref
"(regs_ever_live[CRIS_SRP_REGNUM]
|| cris_return_address_on_stack ())")
(const_int 0))
(const_string "no") ; If jump then not slottable. (const_string "no") ; If jump then not slottable.
(if_then_else (if_then_else
(ne (symbol_ref (ne (symbol_ref
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment