trans.c (Call_to_gnu): Set DECL_DISREGARD_INLINE_LIMITS to 0 on the callee if the...
authorEric Botcazou <ebotcazou@adacore.com>
Thu, 14 Dec 2017 17:13:03 +0000 (17:13 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 14 Dec 2017 17:13:03 +0000 (17:13 +0000)
* gcc-interface/trans.c (Call_to_gnu): Set DECL_DISREGARD_INLINE_LIMITS
to 0 on the callee if the call is recursive.

From-SVN: r255648

gcc/ada/ChangeLog
gcc/ada/gcc-interface/trans.c

index c87f4a226921114c068526c42a2ee9c3e830ade3..350ac1f8d2555201b7803e596106a08070c3a256 100644 (file)
@@ -1,3 +1,8 @@
+2017-12-14  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/trans.c (Call_to_gnu): Set DECL_DISREGARD_INLINE_LIMITS
+       to 0 on the callee if the call is recursive.
+
 2017-12-14  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/decl.c (gnat_to_gnu_field): Do not set the alignment
index cae156fa8c6e398f1761fa3f81762d92abbafcce..55638a10c23060a5deee29d37674483d99c0f5ea 100644 (file)
@@ -4306,10 +4306,16 @@ Call_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, tree gnu_target,
       return call_expr;
     }
 
-  /* For a call to a nested function, check the inlining status.  */
-  if (TREE_CODE (gnu_subprog) == FUNCTION_DECL
-      && decl_function_context (gnu_subprog))
-    check_inlining_for_nested_subprog (gnu_subprog);
+  if (TREE_CODE (gnu_subprog) == FUNCTION_DECL)
+    {
+      /* For a call to a nested function, check the inlining status.  */
+      if (decl_function_context (gnu_subprog))
+       check_inlining_for_nested_subprog (gnu_subprog);
+
+      /* For a recursive call, avoid explosion due to recursive inlining.  */
+      if (gnu_subprog == current_function_decl)
+       DECL_DISREGARD_INLINE_LIMITS (gnu_subprog) = 0;
+    }
 
   /* The only way we can be making a call via an access type is if Name is an
      explicit dereference.  In that case, get the list of formal args from the