[Ada] Elaboration order v4.0 and linker switches
authorHristian Kirtchev <kirtchev@adacore.com>
Wed, 10 Jul 2019 08:59:46 +0000 (08:59 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 10 Jul 2019 08:59:46 +0000 (08:59 +0000)
This patch adds a missing functionality with respect to elaboration
order v3.0.  Units carry an attribute called Elab_Position which among
other things controls the sorting of linker switches by gnatbind.
Setting the proper position ensures the gnatbind will output the linker
switches in an order compatible with what gnatlink expects.

No simple test available as this requires a Windows cross-compiler.

2019-07-10  Hristian Kirtchev  <kirtchev@adacore.com>

gcc/ada/

* bindo-elaborators.adb (Elaborate_Units): Set attribute
Elab_Position of all elaborated units.
(Set_Unit_Elaboration_Positions): New routine.

From-SVN: r273326

gcc/ada/ChangeLog
gcc/ada/bindo-elaborators.adb

index 4aa59b67f31154516207c59eab36a2ea41818c3e..097359309a34cd63b2b1c3a4fbb4470ceb9494ec 100644 (file)
@@ -1,3 +1,9 @@
+2019-07-10  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * bindo-elaborators.adb (Elaborate_Units): Set attribute
+       Elab_Position of all elaborated units.
+       (Set_Unit_Elaboration_Positions): New routine.
+
 2019-07-10  Gary Dismukes  <dismukes@adacore.com>
 
        * exp_util.adb: Reformatting and a typo fix.
index 6d3a1e242cda98bece8e6d0a04c22e433307b105..0d9f207be3cd6087fd103a310fcc471ac75d8a38 100644 (file)
@@ -274,6 +274,10 @@ package body Bindo.Elaborators is
       --  Determine whether vertex Vertex of library graph G is suitable for
       --  weak elaboration.
 
+      procedure Set_Unit_Elaboration_Positions (Order : Unit_Id_Table);
+      pragma Inline (Set_Unit_Elaboration_Positions);
+      --  Set the ALI.Units positions of all elaboration units in order Order
+
       procedure Trace_Component
         (G    : Library_Graph;
          Comp : Component_Id;
@@ -750,6 +754,11 @@ package body Bindo.Elaborators is
          if Status = Order_OK then
             Validate_Elaboration_Order (Order);
 
+            --  Set attribute Elab_Position of table ALI.Units for all units in
+            --  the elaboration order.
+
+            Set_Unit_Elaboration_Positions (Order);
+
             --  Output the dependencies among units when switch -e (output
             --  complete list of elaboration order dependencies) is active.
 
@@ -1304,6 +1313,23 @@ package body Bindo.Elaborators is
              and then Is_Weakly_Elaborable_Vertex (G, Vertex);
       end Is_Suitable_Weakly_Elaborable_Vertex;
 
+      ------------------------------------
+      -- Set_Unit_Elaboration_Positions --
+      ------------------------------------
+
+      procedure Set_Unit_Elaboration_Positions (Order : Unit_Id_Table) is
+         U_Id : Unit_Id;
+
+      begin
+         for Position in Unit_Id_Tables.First ..
+                         Unit_Id_Tables.Last (Order)
+         loop
+            U_Id := Order.Table (Position);
+
+            ALI.Units.Table (U_Id).Elab_Position := Position;
+         end loop;
+      end Set_Unit_Elaboration_Positions;
+
       ---------------------
       -- Trace_Component --
       ---------------------