aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/gimple-low.c13
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/noreturn1.adb15
-rw-r--r--gcc/testsuite/gnat.dg/noreturn1.ads8
5 files changed, 47 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2aedb05..c05cc6d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,10 +1,15 @@
+2009-10-17 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gimple-low.c (lower_stmt) <GIMPLE_CALL>: If the call is noreturn,
+ remove a subsequent GOTO or RETURN statement.
+
2009-10-17 Andy Hutchinson <hutchinsonandy@aim.com>
* config/avr.md (*movqi): Add zero as equally preferable constraint
as general register.
- (*movhi): Ditto.
+ (*movhi): Ditto.
- 2009-10-17 Eric Botcazou <ebotcazou@adacore.com>
+2009-10-17 Eric Botcazou <ebotcazou@adacore.com>
* print-tree.c (print_node): Fix string for DECL_STRUCT_FUNCTION.
diff --git a/gcc/gimple-low.c b/gcc/gimple-low.c
index b58fd7b..39c7351 100644
--- a/gcc/gimple-low.c
+++ b/gcc/gimple-low.c
@@ -387,6 +387,19 @@ lower_stmt (gimple_stmt_iterator *gsi, struct lower_data *data)
lower_builtin_setjmp (gsi);
return;
}
+
+ /* After a noreturn call, remove a subsequent GOTO or RETURN that might
+ have been mechanically added; this will prevent the EH lowering pass
+ from adding useless edges and thus complicating the initial CFG. */
+ if (decl && (flags_from_decl_or_type (decl) & ECF_NORETURN))
+ {
+ gsi_next (gsi);
+ if (!gsi_end_p (*gsi)
+ && (gimple_code (gsi_stmt (*gsi)) == GIMPLE_GOTO
+ || gimple_code (gsi_stmt (*gsi)) == GIMPLE_RETURN))
+ gsi_remove (gsi, false);
+ return;
+ }
}
break;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 14900619..62f8075 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2009-10-17 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/noreturn1.ad[sb]: New test.
+
2009-10-17 Janus Weil <janus@gcc.gnu.org>
Paul Thomas <pault@gcc.gnu.org>
diff --git a/gcc/testsuite/gnat.dg/noreturn1.adb b/gcc/testsuite/gnat.dg/noreturn1.adb
new file mode 100644
index 0000000..83eafe7
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/noreturn1.adb
@@ -0,0 +1,15 @@
+-- { dg-compile }
+
+package body Noreturn1 is
+
+ procedure Error (E : in Exception_Occurrence) is
+ Occurrence_Message : constant String := Exception_Message (E);
+ begin
+ if Occurrence_Message = "$" then
+ raise Program_Error;
+ else
+ raise Constraint_Error;
+ end if;
+ end;
+
+end Noreturn1;
diff --git a/gcc/testsuite/gnat.dg/noreturn1.ads b/gcc/testsuite/gnat.dg/noreturn1.ads
new file mode 100644
index 0000000..c63e439
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/noreturn1.ads
@@ -0,0 +1,8 @@
+with Ada.Exceptions; use Ada.Exceptions;
+
+package Noreturn1 is
+
+ procedure Error (E : in Exception_Occurrence);
+ pragma No_Return (Error);
+
+end Noreturn1;