* inline.adb (Back_End_Cannot_Inline): Lift restriction on calls to
authorebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 26 Mar 2011 09:34:40 +0000 (09:34 +0000)
committerebotcazou <ebotcazou@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 26 Mar 2011 09:34:40 +0000 (09:34 +0000)
subprograms without a previous spec declared in the same unit.
* gcc-interface/trans.c (Compilation_Unit_to_gnu): Process inlined
subprograms at the end of the unit instead of at the beginning.
* gcc-interface/utils.c (create_subprog_decl): Check that the entity
isn't public for the special handling of non-inline functions nested
inside inline external functions.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@171551 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ada/ChangeLog
gcc/ada/gcc-interface/trans.c
gcc/ada/gcc-interface/utils.c
gcc/ada/inline.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/opt15.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt15_pkg.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/opt15_pkg.ads [new file with mode: 0644]

index 65bb6d0..a1131ce 100644 (file)
@@ -1,6 +1,16 @@
+2011-03-26  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * inline.adb (Back_End_Cannot_Inline): Lift restriction on calls to
+       subprograms without a previous spec declared in the same unit.
+       * gcc-interface/trans.c (Compilation_Unit_to_gnu): Process inlined
+       subprograms at the end of the unit instead of at the beginning.
+       * gcc-interface/utils.c (create_subprog_decl): Check that the entity
+       isn't public for the special handling of non-inline functions nested
+       inside inline external functions.
+
 2011-03-25  Jeff Law  <law@redhat.com>
 
-       * ada/gcc-interface/utils.c (def_fn_type): Add missing va_end.
+       * gcc-interface/utils.c (def_fn_type): Add missing va_end.
 
 2011-03-24  Eric Botcazou  <ebotcazou@adacore.com>
 
index ab0725b..f6d83af 100644 (file)
@@ -3793,6 +3793,20 @@ Compilation_Unit_to_gnu (Node_Id gnat_node)
       finalize_from_with_types ();
     }
 
+  if (type_annotate_only && gnat_node == Cunit (Main_Unit))
+    {
+      elaborate_all_entities (gnat_node);
+
+      if (Nkind (Unit (gnat_node)) == N_Subprogram_Declaration
+         || Nkind (Unit (gnat_node)) == N_Generic_Package_Declaration
+         || Nkind (Unit (gnat_node)) == N_Generic_Subprogram_Declaration)
+       return;
+    }
+
+  process_decls (Declarations (Aux_Decls_Node (gnat_node)), Empty, Empty,
+                true, true);
+  add_stmt (gnat_to_gnu (Unit (gnat_node)));
+
   /* If we can inline, generate code for all the inlined subprograms.  */
   if (optimize)
     {
@@ -3822,20 +3836,6 @@ Compilation_Unit_to_gnu (Node_Id gnat_node)
        }
     }
 
-  if (type_annotate_only && gnat_node == Cunit (Main_Unit))
-    {
-      elaborate_all_entities (gnat_node);
-
-      if (Nkind (Unit (gnat_node)) == N_Subprogram_Declaration
-         || Nkind (Unit (gnat_node)) == N_Generic_Package_Declaration
-         || Nkind (Unit (gnat_node)) == N_Generic_Subprogram_Declaration)
-       return;
-    }
-
-  process_decls (Declarations (Aux_Decls_Node (gnat_node)), Empty, Empty,
-                true, true);
-  add_stmt (gnat_to_gnu (Unit (gnat_node)));
-
   /* Process any pragmas and actions following the unit.  */
   add_stmt_list (Pragmas_After (Aux_Decls_Node (gnat_node)));
   add_stmt_list (Actions (Aux_Decls_Node (gnat_node)));
index 181e22a..2cfd1ce 100644 (file)
@@ -1790,6 +1790,7 @@ create_subprog_decl (tree subprog_name, tree asm_name,
      We could inline the nested function as well but it's probably better
      to err on the side of too little inlining.  */
   if (!inline_flag
+      && !public_flag
       && current_function_decl
       && DECL_DECLARED_INLINE_P (current_function_decl)
       && DECL_EXTERNAL (current_function_decl))
index f40edd9..ddb4715 100644 (file)
@@ -368,12 +368,6 @@ package body Inline is
       --    inlined under ZCX because the numeric suffix generated by gigi
       --    will be different in the body and the place of the inlined call.
       --
-      --  If the body to be inlined contains calls to subprograms declared
-      --  in the same body that have no previous spec, the back-end cannot
-      --  inline either because the bodies to be inlined are processed before
-      --  the rest of the enclosing package body, and gigi will then find
-      --  references to entities that have not been elaborated yet.
-      --
       --  This procedure must be carefully coordinated with the back end.
 
       ----------------------------
@@ -384,41 +378,6 @@ package body Inline is
          Decl     : constant Node_Id := Unit_Declaration_Node (Subp);
          Body_Ent : Entity_Id;
          Ent      : Entity_Id;
-         Bad_Call : Node_Id;
-
-         function Process (N : Node_Id) return Traverse_Result;
-         --  Look for calls to subprograms with no previous spec, declared
-         --  in the same enclosing package body.
-
-         -------------
-         -- Process --
-         -------------
-
-         function Process (N : Node_Id) return Traverse_Result is
-         begin
-            if Nkind (N) = N_Procedure_Call_Statement
-              or else Nkind (N) = N_Function_Call
-            then
-               if Is_Entity_Name (Name (N))
-                 and then Comes_From_Source (Entity (Name (N)))
-                 and then
-                    Nkind (Unit_Declaration_Node (Entity (Name (N))))
-                      = N_Subprogram_Body
-                 and then In_Same_Extended_Unit (Subp, Entity (Name (N)))
-               then
-                  Bad_Call := N;
-                  return Abandon;
-               else
-                  return OK;
-               end if;
-            else
-               return OK;
-            end if;
-         end Process;
-
-         function Has_Exposed_Call is new Traverse_Func (Process);
-
-      --  Start of processing for Back_End_Cannot_Inline
 
       begin
          if Nkind (Decl) = N_Subprogram_Declaration
@@ -454,19 +413,7 @@ package body Inline is
             Next_Entity (Ent);
          end loop;
 
-         if Has_Exposed_Call
-              (Unit_Declaration_Node (Corresponding_Body (Decl))) = Abandon
-         then
-            if Ineffective_Inline_Warnings then
-               Error_Msg_N
-                 ("?call to subprogram with no separate spec"
-                  & " prevents inlining!!", Bad_Call);
-            end if;
-
-            return True;
-         else
-            return False;
-         end if;
+         return False;
       end Back_End_Cannot_Inline;
 
    --  Start of processing for Add_Inlined_Subprogram
index d2a1762..6b2fede 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-26  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/opt15.adb: New test.
+       * gnat.dg/opt15_pkg.ad[sb]: New helper.
+
 2011-03-25  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/48174
diff --git a/gcc/testsuite/gnat.dg/opt15.adb b/gcc/testsuite/gnat.dg/opt15.adb
new file mode 100644 (file)
index 0000000..eadc25d
--- /dev/null
@@ -0,0 +1,12 @@
+-- { dg-do compile }
+-- { dg-options "-O -gnatn -fdump-tree-optimized" }
+
+with Opt15_Pkg; use Opt15_Pkg;
+
+procedure Opt15 is
+begin
+  Trace_Inlined;
+end;
+
+-- { dg-final { scan-tree-dump-not "trace_inlined" "optimized" } }
+-- { dg-final { cleanup-tree-dump "optimized" } }
diff --git a/gcc/testsuite/gnat.dg/opt15_pkg.adb b/gcc/testsuite/gnat.dg/opt15_pkg.adb
new file mode 100644 (file)
index 0000000..ebb1d26
--- /dev/null
@@ -0,0 +1,13 @@
+package body Opt15_Pkg is
+
+  procedure Trace_Non_Inlined is
+  begin
+    raise Program_Error;
+  end;
+
+  procedure Trace_Inlined is
+  begin
+    Trace_Non_Inlined;
+  end;
+
+end Opt15_Pkg;
diff --git a/gcc/testsuite/gnat.dg/opt15_pkg.ads b/gcc/testsuite/gnat.dg/opt15_pkg.ads
new file mode 100644 (file)
index 0000000..f1d0302
--- /dev/null
@@ -0,0 +1,6 @@
+package Opt15_Pkg is
+
+  procedure Trace_Inlined;
+  pragma Inline (Trace_Inlined);
+
+end Opt15_Pkg;