[Ada] Lift obsolete limitations for pragma Inline

Arnaud Charlet charlet@adacore.com
Fri Oct 31 11:05:00 GMT 2014


This change lifts obsolete limitations for pragma Inline that have already
been lifted for pragma Inline_Always, since they use the same machinery.

Tested on x86_64-pc-linux-gnu, committed on trunk

2014-10-31  Eric Botcazou  <ebotcazou@adacore.com>

	* inline.adb (Back_End_Cannot_Inline): Delete.
	(Add_Inlined_Subprogram): Do not call it.

-------------- next part --------------
Index: inline.adb
===================================================================
--- inline.adb	(revision 216925)
+++ inline.adb	(working copy)
@@ -445,20 +445,6 @@
       E    : constant Entity_Id := Inlined.Table (Index).Name;
       Pack : constant Entity_Id := Get_Code_Unit_Entity (E);
 
-      function Back_End_Cannot_Inline (Subp : Entity_Id) return Boolean;
-      --  There are various conditions under which back-end inlining cannot
-      --  be done reliably:
-      --
-      --    a) If a body has handlers, it must not be inlined, because this
-      --    may violate program semantics, and because in zero-cost exception
-      --    mode it will lead to undefined symbols at link time.
-      --
-      --    b) If a body contains inlined function instances, it cannot be
-      --    inlined under ZCX because the numeric suffix generated by gigi
-      --    will be different in the body and the place of the inlined call.
-      --
-      --  This procedure must be carefully coordinated with the back end.
-
       procedure Register_Backend_Inlined_Subprogram (Subp : Entity_Id);
       --  Append Subp to the list of subprograms inlined by the backend
 
@@ -466,52 +452,6 @@
       --  Append Subp to the list of subprograms that cannot be inlined by
       --  the backend.
 
-      ----------------------------
-      -- Back_End_Cannot_Inline --
-      ----------------------------
-
-      function Back_End_Cannot_Inline (Subp : Entity_Id) return Boolean is
-         Decl     : constant Node_Id := Unit_Declaration_Node (Subp);
-         Body_Ent : Entity_Id;
-         Ent      : Entity_Id;
-
-      begin
-         if Nkind (Decl) = N_Subprogram_Declaration
-           and then Present (Corresponding_Body (Decl))
-         then
-            Body_Ent := Corresponding_Body (Decl);
-         else
-            return False;
-         end if;
-
-         --  If subprogram is marked Inline_Always, inlining is mandatory
-
-         if Has_Pragma_Inline_Always (Subp) then
-            return False;
-         end if;
-
-         if Present
-              (Exception_Handlers
-                 (Handled_Statement_Sequence
-                    (Unit_Declaration_Node (Corresponding_Body (Decl)))))
-         then
-            return True;
-         end if;
-
-         Ent := First_Entity (Body_Ent);
-         while Present (Ent) loop
-            if Is_Subprogram (Ent)
-              and then Is_Generic_Instance (Ent)
-            then
-               return True;
-            end if;
-
-            Next_Entity (Ent);
-         end loop;
-
-         return False;
-      end Back_End_Cannot_Inline;
-
       -----------------------------------------
       -- Register_Backend_Inlined_Subprogram --
       -----------------------------------------
@@ -547,21 +487,15 @@
         and then not Is_Nested (E)
         and then not Has_Initialized_Type (E)
       then
-         if Back_End_Cannot_Inline (E) then
-            Set_Is_Inlined (E, False);
-            Register_Backend_Not_Inlined_Subprogram (E);
+         Register_Backend_Inlined_Subprogram (E);
 
+         if No (Last_Inlined) then
+            Set_First_Inlined_Subprogram (Cunit (Main_Unit), E);
          else
-            Register_Backend_Inlined_Subprogram (E);
-
-            if No (Last_Inlined) then
-               Set_First_Inlined_Subprogram (Cunit (Main_Unit), E);
-            else
-               Set_Next_Inlined_Subprogram (Last_Inlined, E);
-            end if;
-
-            Last_Inlined := E;
+            Set_Next_Inlined_Subprogram (Last_Inlined, E);
          end if;
+
+         Last_Inlined := E;
       else
          Register_Backend_Not_Inlined_Subprogram (E);
       end if;


More information about the Gcc-patches mailing list