aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2012-11-29 22:58:23 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2012-11-29 22:58:23 +0000
commit85da11a61f0e8ce7d30f2ce79508c71ec8914f1b (patch)
tree65663b47ff72f52cbcb2aeb91f37bdce44a408c9 /gcc
parent74df1ad0fe925176b64af72f03a25d0beb33f5bc (diff)
downloadgcc-85da11a61f0e8ce7d30f2ce79508c71ec8914f1b.zip
gcc-85da11a61f0e8ce7d30f2ce79508c71ec8914f1b.tar.gz
gcc-85da11a61f0e8ce7d30f2ce79508c71ec8914f1b.tar.bz2
re PR middle-end/55321 (Ada bootstrap failure on armv5tel-linux-gnueabi)
PR middle-end/55321 * calls.c (emit_library_call_value_1): Mark as no-nonlocal if no-throw. From-SVN: r193973
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/calls.c17
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gnat.dg/loop_optimization14.adb29
-rw-r--r--gcc/testsuite/gnat.dg/loop_optimization14.ads13
-rw-r--r--gcc/testsuite/gnat.dg/loop_optimization14_pkg.ads5
6 files changed, 72 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 24d73d5..903a77c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2012-11-29 Eric Botcazou <ebotcazou@adacore.com>
+
+ PR middle-end/55321
+ * calls.c (emit_library_call_value_1): Mark as no-nonlocal if no-throw.
+
2012-11-29 Vladimir Makarov <vmakarov@redhat.com>
PR middle-end/55456
diff --git a/gcc/calls.c b/gcc/calls.c
index f4bed74..574c247 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -4196,13 +4196,11 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
that it should complain if nonvolatile values are live. For
functions that cannot return, inform flow that control does not
fall through. */
-
if (flags & ECF_NORETURN)
{
/* The barrier note must be emitted
immediately after the CALL_INSN. Some ports emit more than
just a CALL_INSN above, so we must search for it here. */
-
rtx last = get_last_insn ();
while (!CALL_P (last))
{
@@ -4214,6 +4212,21 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
emit_barrier_after (last);
}
+ /* Consider that "regular" libcalls, i.e. all of them except for LCT_THROW
+ and LCT_RETURNS_TWICE, cannot perform non-local gotos. */
+ if (flags & ECF_NOTHROW)
+ {
+ rtx last = get_last_insn ();
+ while (!CALL_P (last))
+ {
+ last = PREV_INSN (last);
+ /* There was no CALL_INSN? */
+ gcc_assert (last != before_call);
+ }
+
+ make_reg_eh_region_note_nothrow_nononlocal (last);
+ }
+
/* Now restore inhibit_defer_pop to its actual original value. */
OK_DEFER_POP;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 996347b..54692e1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-11-29 Eric Botcazou <ebotcazou@adacore.com>
+
+ * loop_optimization14.ad[sb]: New test.
+ * loop_optimization14_pkg.ads: New helper.
+
2012-11-29 Richard Earnshaw <rearnsha@arm.com>
PR target/55073
diff --git a/gcc/testsuite/gnat.dg/loop_optimization14.adb b/gcc/testsuite/gnat.dg/loop_optimization14.adb
new file mode 100644
index 0000000..c53c484
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/loop_optimization14.adb
@@ -0,0 +1,29 @@
+-- PR middle-end/55321
+-- { dg-do compile }
+-- { dg-options "-O" }
+
+with Loop_Optimization14_Pkg; use Loop_Optimization14_Pkg;
+
+package body Loop_Optimization14 is
+
+ procedure Finalize_Pool (Pool : in out Rec) is
+ Raised : Boolean := False;
+ begin
+ Pool.A := True;
+
+ while not Pool.B loop
+
+ begin
+ Proc (Pool.B);
+
+ exception
+ when others =>
+ if not Raised then
+ Raised := True;
+ end if;
+ end;
+ end loop;
+
+ end;
+
+end Loop_Optimization14;
diff --git a/gcc/testsuite/gnat.dg/loop_optimization14.ads b/gcc/testsuite/gnat.dg/loop_optimization14.ads
new file mode 100644
index 0000000..ee99405
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/loop_optimization14.ads
@@ -0,0 +1,13 @@
+package Loop_Optimization14 is
+
+ type Rec is record
+ A : Boolean;
+ pragma Atomic (A);
+
+ B : Boolean;
+
+ end record;
+
+ procedure Finalize_Pool (Pool : in out Rec);
+
+end Loop_Optimization14;
diff --git a/gcc/testsuite/gnat.dg/loop_optimization14_pkg.ads b/gcc/testsuite/gnat.dg/loop_optimization14_pkg.ads
new file mode 100644
index 0000000..23b61eb
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/loop_optimization14_pkg.ads
@@ -0,0 +1,5 @@
+package Loop_Optimization14_Pkg is
+
+ procedure Proc (B : in out Boolean);
+
+end Loop_Optimization14_Pkg;