aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2015-12-07 16:08:42 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2015-12-07 16:08:42 +0000
commit51baf85ab604958aa93d7f9c18c335bf080aaf70 (patch)
tree98fef089b3f840adae625184631a383115201687 /gcc
parentf79520bb110d31c9d2e06d463e7d8a3eb437225e (diff)
downloadgcc-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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/nvptx/nvptx.c7
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/nvptx/abort.c13
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;" } } */