[Ada] Elaboration order v4.0 and output of dependencies
authorHristian Kirtchev <kirtchev@adacore.com>
Thu, 11 Jul 2019 08:02:30 +0000 (08:02 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Thu, 11 Jul 2019 08:02:30 +0000 (08:02 +0000)
This patch adds a missing case to the mechanism that outputs the
elaboration order dependencies of units.

------------
-- Source --
------------

--  pack.ads

package Pack is
   procedure Force_Body;
end Pack;

--  pack.adb

package body Pack is
   procedure Force_Body is null;
end Pack;

--  main.adb

with Pack;

procedure Main is begin null; end Main;

----------------------------
-- Compilation and output --
----------------------------

$ gnatmake -q main.adb -bargs -e

ELABORATION ORDER DEPENDENCIES

   unit "pack (spec)" must be elaborated before unit "main (body)"
     reason: unit "main (body)" has with clause for unit "pack (spec)"
   unit "pack (spec)" must be elaborated before unit "pack (body)"
     reason: spec must be elaborated before body

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

gcc/ada/

* bindo.adb: Remove the documentation of switch -d_N because it
is no longer in use.
* bindo-graphs.ads, bindo-graphs.adb (Is_Spec_Before_Body_Edge):
New routine.
* bindo-writers.adb (Write_Dependency_Edge): Add the missing
case of a spec-before-body edge.

From-SVN: r273394

gcc/ada/ChangeLog
gcc/ada/bindo-graphs.adb
gcc/ada/bindo-graphs.ads
gcc/ada/bindo-writers.adb
gcc/ada/bindo.adb

index e20d10cb525446edc9f91c68ce38ed540e179cdb..accc3eea9592db5c84c828cfba87bda4e58eabd0 100644 (file)
@@ -1,3 +1,12 @@
+2019-07-11  Hristian Kirtchev  <kirtchev@adacore.com>
+
+       * bindo.adb: Remove the documentation of switch -d_N because it
+       is no longer in use.
+       * bindo-graphs.ads, bindo-graphs.adb (Is_Spec_Before_Body_Edge):
+       New routine.
+       * bindo-writers.adb (Write_Dependency_Edge): Add the missing
+       case of a spec-before-body edge.
+
 2019-07-11  Dmitriy Anisimkov  <anisimko@adacore.com>
 
        * libgnat/g-socket.ads (Mode_Type): Add a Socket_Raw enumerator.
index 9621bb4b4883043b4971f9a30a209d10184ba490..c2f9d6cac5cee978ded83e2cf63d73bc44ff6596 100644 (file)
@@ -4183,6 +4183,21 @@ package body Bindo.Graphs is
          return U_Rec.Utype = Is_Spec or else U_Rec.Utype = Is_Spec_Only;
       end Is_Spec;
 
+      ------------------------------
+      -- Is_Spec_Before_Body_Edge --
+      ------------------------------
+
+      function Is_Spec_Before_Body_Edge
+        (G    : Library_Graph;
+         Edge : Library_Graph_Edge_Id) return Boolean
+      is
+      begin
+         pragma Assert (Present (G));
+         pragma Assert (Present (Edge));
+
+         return Kind (G, Edge) = Spec_Before_Body_Edge;
+      end Is_Spec_Before_Body_Edge;
+
       -----------------------
       -- Is_Spec_With_Body --
       -----------------------
index 8323784481805b4ea1122047bd5cf43058dd135b..f376801cb3c0f0c5b4cd90ee08517539722df71f 100644 (file)
@@ -1166,6 +1166,13 @@ package Bindo.Graphs is
       pragma Inline (Is_Spec);
       --  Determine whether vertex Vertex of library graph G denotes a spec
 
+      function Is_Spec_Before_Body_Edge
+        (G    : Library_Graph;
+         Edge : Library_Graph_Edge_Id) return Boolean;
+      pragma Inline (Is_Spec_Before_Body_Edge);
+      --  Determine whether edge Edge of library graph G links a predecessor
+      --  spec and a successor body belonging to the same unit.
+
       function Is_Spec_With_Body
         (G      : Library_Graph;
          Vertex : Library_Graph_Vertex_Id) return Boolean;
index 021d50f31d3094e0a6dc3332721313b9e1559455..1fcfb11becb0dca502460864e34f3f160fa23221 100644 (file)
@@ -610,6 +610,11 @@ package body Bindo.Writers is
                  & "elaboration time",
                Info => True);
 
+         elsif Is_Spec_Before_Body_Edge (G, Edge) then
+            Error_Msg_Output
+              (Msg  => "     reason: spec must be elaborated before body",
+               Info => True);
+
          else
             pragma Assert (Is_With_Edge (G, Edge));
 
index d5830cab098d263cb9ffc69c46ee5dbeba01a800..249ce972f075467389a87f7fc65765ebfeaf03dc 100644 (file)
@@ -347,13 +347,9 @@ package body Bindo is
    --        GNATbind outputs the library graph in textual format to standard
    --        output.
    --
-   --  -d_N  New bindo order
-   --
-   --        GNATbind utilizes the new bindo elaboration order
-   --
    --  -d_P  Output cycle paths
    --
-   --        GNATbind output the cycle paths in text format to standard output
+   --        GNATbind outputs the cycle paths in text format to standard output
    --
    --  -d_S  Output elaboration-order status information
    --