Commit 891aa2ec by Olivier Hainque Committed by Olivier Hainque

sparc.c (sparc_asm_function_epilogue): Don't output an extra nop past a sibling…

sparc.c (sparc_asm_function_epilogue): Don't output an extra nop past a sibling call at the very end.

        * config/sparc/sparc.c (sparc_asm_function_epilogue): Don't output
        an extra nop past a sibling call at the very end.

        testsuite/
        * gcc.target/sparc/sibcall-dslot.c: New testcase.

From-SVN: r163395
parent 07d5b925
2010-08-20 Olivier Hainque <hainque@adacore.com>
* config/sparc/sparc.c (sparc_asm_function_epilogue): Don't output
an extra nop past a sibling call at the very end.
2010-08-19 Bernd Schmidt <bernds@codesourcery.com> 2010-08-19 Bernd Schmidt <bernds@codesourcery.com>
PR bootstrap/45350 PR bootstrap/45350
......
...@@ -4527,11 +4527,11 @@ sparc_can_use_return_insn_p (void) ...@@ -4527,11 +4527,11 @@ sparc_can_use_return_insn_p (void)
static void static void
sparc_asm_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED) sparc_asm_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
{ {
/* If code does not drop into the epilogue, we have to still output /* If the last two instructions of a function are "call foo; dslot;"
a dummy nop for the sake of sane backtraces. Otherwise, if the the return address might point to the first instruction in the next
last two instructions of a function were "call foo; dslot;" this function and we have to output a dummy nop for the sake of sane
can make the return PC of foo (i.e. address of call instruction backtraces in such cases. This is pointless for sibling calls since
plus 8) point to the first instruction in the next function. */ the return address is explicitly adjusted. */
rtx insn, last_real_insn; rtx insn, last_real_insn;
...@@ -4543,7 +4543,9 @@ sparc_asm_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED) ...@@ -4543,7 +4543,9 @@ sparc_asm_function_epilogue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
&& GET_CODE (PATTERN (last_real_insn)) == SEQUENCE) && GET_CODE (PATTERN (last_real_insn)) == SEQUENCE)
last_real_insn = XVECEXP (PATTERN (last_real_insn), 0, 0); last_real_insn = XVECEXP (PATTERN (last_real_insn), 0, 0);
if (last_real_insn && GET_CODE (last_real_insn) == CALL_INSN) if (last_real_insn
&& CALL_P (last_real_insn)
&& !SIBLING_CALL_P (last_real_insn))
fputs("\tnop\n", file); fputs("\tnop\n", file);
sparc_output_deferred_case_vectors (); sparc_output_deferred_case_vectors ();
......
2010-10-19 Olivier Hainque <hainque@adacore.com>
* gcc.target/sparc/sibcall-dslot.c: New testcase.
2010-08-19 Jason Merrill <jason@redhat.com> 2010-08-19 Jason Merrill <jason@redhat.com>
* g++.dg/init/synth3.C: New. * g++.dg/init/synth3.C: New.
......
/* { dg-do compile } */
/* { dg-options "-O2" } */
extern int one ();
int some_n ()
{
return one ();
}
/* { dg-final { scan-assembler-not "nop" } } */
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