Commit a31505a3 by H.J. Lu Committed by H.J. Lu

x86: Always update EH return address in word_mode

On x86, return address is always popped in word_mode.  eh_return needs
to put EH return address in word_mode on stack.

gcc/

	PR target/87014
	* config/i386/i386.md (eh_return): Always update EH return
	address in word_mode.

gcc/testsuite/

	PR target/87014
	* g++.dg/torture/pr87014.C: New file.

From-SVN: r263672
parent 846d943b
2018-08-20 H.J. Lu <hongjiu.lu@intel.com>
PR target/87014
* config/i386/i386.md (eh_return): Always update EH return
address in word_mode.
2018-08-20 Chung-Lin Tang <cltang@codesourcery.com> 2018-08-20 Chung-Lin Tang <cltang@codesourcery.com>
* targhooks.c (std_gimplify_va_arg_expr): Properly handle case of when * targhooks.c (std_gimplify_va_arg_expr): Properly handle case of when
......
...@@ -13612,7 +13612,10 @@ ...@@ -13612,7 +13612,10 @@
stack address we wish to restore. */ stack address we wish to restore. */
tmp = gen_rtx_PLUS (Pmode, arg_pointer_rtx, sa); tmp = gen_rtx_PLUS (Pmode, arg_pointer_rtx, sa);
tmp = plus_constant (Pmode, tmp, -UNITS_PER_WORD); tmp = plus_constant (Pmode, tmp, -UNITS_PER_WORD);
tmp = gen_rtx_MEM (Pmode, tmp); /* Return address is always in word_mode. */
tmp = gen_rtx_MEM (word_mode, tmp);
if (GET_MODE (ra) != word_mode)
ra = convert_to_mode (word_mode, ra, 1);
emit_move_insn (tmp, ra); emit_move_insn (tmp, ra);
emit_jump_insn (gen_eh_return_internal ()); emit_jump_insn (gen_eh_return_internal ());
......
2018-08-20 H.J. Lu <hongjiu.lu@intel.com>
PR target/87014
* g++.dg/torture/pr87014.C: New file.
2018-08-20 Bernd Edlinger <bernd.edlinger@hotmail.de> 2018-08-20 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR target/86984 PR target/86984
......
// { dg-do run }
void
fillstack ()
{
long long foo[] =
{
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
};
}
void
f (long long=-1,long long=-1,long long=-1,long long=-1,
long long=-1,long long=-1,long long arg7_on_stack=-1)
{
throw 0;
}
void
g()
{
try
{
f ();
}
catch (int)
{
}
}
int
main()
{
fillstack ();
g ();
return 0;
}
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