diff options
author | Nathan Sidwell <nathan@acm.org> | 2015-12-07 16:08:42 +0000 |
---|---|---|
committer | Nathan Sidwell <nathan@gcc.gnu.org> | 2015-12-07 16:08:42 +0000 |
commit | 51baf85ab604958aa93d7f9c18c335bf080aaf70 (patch) | |
tree | 98fef089b3f840adae625184631a383115201687 | |
parent | f79520bb110d31c9d2e06d463e7d8a3eb437225e (diff) | |
download | gcc-51baf85ab604958aa93d7f9c18c335bf080aaf70.zip gcc-51baf85ab604958aa93d7f9c18c335bf080aaf70.tar.gz gcc-51baf85ab604958aa93d7f9c18c335bf080aaf70.tar.bz2 |
nvptx.c (nvptx_output_call_insn): Emit trap after no return call.
gcc/
* config/nvptx/nvptx.c (nvptx_output_call_insn): Emit trap after no
return call.
gcc/testsuite/
* gcc.target/nvptx/abort.c: New.
From-SVN: r231368
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/nvptx/nvptx.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/nvptx/abort.c | 13 |
4 files changed, 29 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 80e8481..2b92119 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2015-12-07 Nathan Sidwell <nathan@acm.org> + + * config/nvptx/nvptx.c (nvptx_output_call_insn): Emit trap after no + return call. + 2015-12-07 David Malcolm <dmalcolm@redhat.com> * pretty-print.c (text_info::set_range): Rename to... diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c index 2dec846..6ce8d4b 100644 --- a/gcc/config/nvptx/nvptx.c +++ b/gcc/config/nvptx/nvptx.c @@ -1890,6 +1890,13 @@ nvptx_output_call_insn (rtx_insn *insn, rtx result, rtx callee) } fprintf (asm_out_file, ";\n"); + if (find_reg_note (insn, REG_NORETURN, NULL)) + /* No return functions confuse the PTX JIT, as it doesn't realize + the flow control barrier they imply. It can seg fault if it + encounters what looks like an unexitable loop. Emit a trailing + trap, which it does grok. */ + fprintf (asm_out_file, "\t\ttrap; // (noreturn)\n"); + return result != NULL_RTX ? "\tld.param%t0\t%0, [%%retval_in];\n\t}" : "}"; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 93f3af2..2a8fce8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2015-12-07 Nathan Sidwell <nathan@acm.org> + + * gcc.target/nvptx/abort.c: New. + 2015-12-07 David Malcolm <dmalcolm@redhat.com> * gcc.dg/diagnostic-ranges-1.c: New test file. diff --git a/gcc/testsuite/gcc.target/nvptx/abort.c b/gcc/testsuite/gcc.target/nvptx/abort.c new file mode 100644 index 0000000..d322068 --- /dev/null +++ b/gcc/testsuite/gcc.target/nvptx/abort.c @@ -0,0 +1,13 @@ +/* { dg-do compile} */ +/* Annotate no return functions with a trailing 'trap'. */ + +extern void abort (); + +int main (int argc, char **argv) +{ + if (argc > 2) + abort (); + return 0; +} + +/* { dg-final { scan-assembler "call abort;\[\r\n\t \]+trap;" } } */ |