[Ada] Unnesting: do not generate push/pop for exceptions
authorEd Schonberg <schonberg@adacore.com>
Tue, 29 May 2018 09:42:11 +0000 (09:42 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 29 May 2018 09:42:11 +0000 (09:42 +0000)
2018-05-29  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* exp_ch6.adb (Expand_N_Subprogram_Body): Do not generate push/pop for
exceptions if subprogram unnesting is in effect, because these branch
nodes are relevant only in the presence of nested subprograms.

From-SVN: r260883

gcc/ada/ChangeLog
gcc/ada/exp_ch6.adb

index 9c529da0d295b9eab9f206da0541220e6d6c0e87..fecd0f16b48c564ed6694e1ed27564cc5e6412c0 100644 (file)
@@ -1,3 +1,9 @@
+2018-05-29  Ed Schonberg  <schonberg@adacore.com>
+
+       * exp_ch6.adb (Expand_N_Subprogram_Body): Do not generate push/pop for
+       exceptions if subprogram unnesting is in effect, because these branch
+       nodes are relevant only in the presence of nested subprograms.
+
 2018-05-29  Ed Schonberg  <schonberg@adacore.com>
 
        * libgnat/s-fatgen.adb (Succ, Pred):  Raise Constraint_Error
index 7c8ce026a5d1fad5fa3a89c67b0f5f042c3c58c2..2895ed973b2942b805f0edec3d4e352a4819c8af 100644 (file)
@@ -5664,12 +5664,16 @@ package body Exp_Ch6 is
       --  If local-exception-to-goto optimization active, insert dummy push
       --  statements at start, and dummy pop statements at end, but inhibit
       --  this if we have No_Exception_Handlers, since they are useless and
-      --  intefere with analysis, e.g. by codepeer.
+      --  interfere with analysis, e.g. by CodePeer. We also don't need these
+      --  if we're unnesting subprograms because the only purpose of these
+      --  nodes is to ensure we don't set a label in one subprogram and branch
+      --  to it in another.
 
       if (Debug_Flag_Dot_G
            or else Restriction_Active (No_Exception_Propagation))
         and then not Restriction_Active (No_Exception_Handlers)
         and then not CodePeer_Mode
+        and then not Unnest_Subprogram_Mode
         and then Is_Non_Empty_List (L)
       then
          declare