From: Bob Duff <d...@adacore.com>

The Library_Unit field was used for all sorts of different purposes,
which led to confusing code.

This patch splits Library_Unit into much more specific wrapper
subprograms that should be called instead of [Set_]Library_Unit.
Predicates and pragmas Assert are used to catch misuses of these.
We document the semantics, especially "surprising" cases (e.g.
internally-generated with clauses can refer to package bodies).

This change does not fix gigi, codepeer, spark, or llvm
to use the new wrappers; so far, they are used only in
the GNAT front end.

gcc/ada/ChangeLog:

        * sinfo.ads (Library_Unit): Rewrite documentation. Note that
        the "??? not (always) true..." comment was not true;
        the Subunit_Parent never points to the spec.
        (N_Compilation_Unit): Improve documentation. The Aux_ node
        was not created to solve the mentioned problems; it was
        created because the size of nodes was limited.
        Misc doc improvements.
        * sinfo-utils.ads: Add new wrappers for Library_Unit field.
        Use subtypes with predicates for the parameters.
        (First_Real_Statement): Still used in codepeer.
        * sinfo-utils.adb: Add new wrappers for Library_Unit field,
        with suitable assertions.
        * sem_prag.adb: Use new field wrapper names.
        (Matching_Name): New name for Same_Name to avoid
        potential confusion with the other function with the
        same name (Sem_Util.Same_Name), which is also called
        in this same file.
        (Matching_Convention): Change Same_Convention to match
        Matching_Name.
        * sem_util.ads (Same_Name): Improve comments; the old comment
        implied that it works for all names, which was not true.
        * sem_util.adb: Use new field wrapper names.
        * gen_il-gen.adb: Rename N_Unit_Body to be N_Lib_Unit_Body.
        Plain "unit" is ambiguous in Ada (library unit, compilation
        unit, program unit, etc).
        Add new union types N_Lib_Unit_Declaration and
        N_Lib_Unit_Renaming_Declaration.
        * gen_il-gen-gen_nodes.adb (Compute_Ranges): Raise exception
        earlier (it is already raised later, in Verify_Type_Table).
        Add a comment explaining why it might be raised.
        * gen_il-types.ads: Rename N_Unit_Body to be N_Lib_Unit_Body, and add
        new N_Lib_Unit_Declaration and N_Lib_Unit_Renaming_Declaration.
        * einfo.ads: Fix obsolete comment (was left over from before
        the "variable-sized nodes").
        * exp_ch7.adb: Use new field wrapper names.
        * exp_disp.adb: Use new field wrapper names.
        * exp_unst.adb: Use new field wrapper names.
        * exp_util.adb: Use new field wrapper names.
        * fe.h: Add new field wrapper names. These are currently not
        used in gigi, but this change prepares for using them in
        gigi.
        * inline.adb: Use new field wrapper names.
        * lib.adb: Use new field wrapper names.
        Comment improvements.
        * lib-load.adb: Use new field wrapper names.
        Minor cleanup.
        * lib-writ.adb: Use new field wrapper names.
        * live.adb: Use new field wrapper names.
        * par-load.adb: Use new field wrapper names.
        Comment improvements. Minor cleanup.
        * rtsfind.adb: Use new field wrapper names.
        * sem.adb: Use new field wrapper names.
        * sem_ch10.adb: Use new field wrapper names.
        Comment improvements. Minor cleanup.
        * sem_ch12.adb: Use new field wrapper names.
        * sem_ch7.adb: Use new field wrapper names.
        * sem_ch8.adb: Use new field wrapper names.
        * sem_elab.adb: Use new field wrapper names.
        Comment improvements.
        * errout.adb (Output_Source_Line): Fix blowup in some
        obscure cases, where List_Pragmas is not fully set up.

Tested on x86_64-pc-linux-gnu, committed on master.

---
 gcc/ada/einfo.ads                |  15 +--
 gcc/ada/errout.adb               |   3 +-
 gcc/ada/exp_ch7.adb              |   5 +-
 gcc/ada/exp_disp.adb             |   4 +-
 gcc/ada/exp_unst.adb             |   6 +-
 gcc/ada/exp_util.adb             |   2 +-
 gcc/ada/fe.h                     |  10 ++
 gcc/ada/gen_il-gen-gen_nodes.adb |  22 +++-
 gcc/ada/gen_il-gen.adb           |   9 ++
 gcc/ada/gen_il-types.ads         |   4 +-
 gcc/ada/inline.adb               |   8 +-
 gcc/ada/lib-load.adb             |   8 +-
 gcc/ada/lib-writ.adb             |  17 +--
 gcc/ada/lib.adb                  |  22 ++--
 gcc/ada/live.adb                 |  12 +-
 gcc/ada/par-load.adb             |  35 ++++--
 gcc/ada/rtsfind.adb              |  10 +-
 gcc/ada/sem.adb                  |  38 +++---
 gcc/ada/sem_ch10.adb             | 194 ++++++++++++++++---------------
 gcc/ada/sem_ch12.adb             |  48 ++++----
 gcc/ada/sem_ch7.adb              |   4 +-
 gcc/ada/sem_ch8.adb              |   5 +-
 gcc/ada/sem_elab.adb             |  31 ++---
 gcc/ada/sem_prag.adb             |  31 +++--
 gcc/ada/sem_util.adb             |  22 ++--
 gcc/ada/sem_util.ads             |   4 +-
 gcc/ada/sinfo-utils.adb          | 139 ++++++++++++++++++++++
 gcc/ada/sinfo-utils.ads          |  63 +++++++++-
 gcc/ada/sinfo.ads                |  66 ++++-------
 29 files changed, 542 insertions(+), 295 deletions(-)

diff --git a/gcc/ada/einfo.ads b/gcc/ada/einfo.ads
index 2aae60afae5..f0ae45ccb59 100644
--- a/gcc/ada/einfo.ads
+++ b/gcc/ada/einfo.ads
@@ -251,15 +251,12 @@ package Einfo is
 --  kinds of entities. In the latter case the attribute should only be set or
 --  accessed if the Ekind field indicates an appropriate entity.
 
---  There are two kinds of attributes that apply to entities, stored and
---  synthesized. Stored attributes correspond to a field or flag in the entity
---  itself. Such attributes are identified in the table below by giving the
---  field or flag in the attribute that is used to hold the attribute value.
---  Synthesized attributes are not stored directly, but are rather computed as
---  needed from other attributes, or from information in the tree. These are
---  marked "synthesized" in the table below. The stored attributes have both
---  access functions and set procedures to set the corresponding values, while
---  synthesized attributes have only access functions.
+--  Attributes that apply to entities are either "stored" or "synthesized".
+--  Stored attributes are stored as fields in the entity node, and have
+--  automatically-generated access functions and Set_... procedures.
+--  Synthesized attributes are marked "(synthesized)" in the documentation
+--  below, and are computed as needed; these have only (hand-written) access
+--  functions.
 
 --  Note: in the case of Node, Uint, or Elist fields, there are cases where the
 --  same physical field is used for different purposes in different entities,
diff --git a/gcc/ada/errout.adb b/gcc/ada/errout.adb
index 81919a3c523..21c8adf5e4f 100644
--- a/gcc/ada/errout.adb
+++ b/gcc/ada/errout.adb
@@ -3552,7 +3552,8 @@ package body Errout is
          --  Deal with matching entry in List_Pragmas table
 
          if Full_List
-           and then List_Pragmas_Index <= List_Pragmas.Last
+           and then List_Pragmas_Index in
+                    List_Pragmas.First .. List_Pragmas.Last
            and then S = List_Pragmas.Table (List_Pragmas_Index).Ploc
          then
             case List_Pragmas.Table (List_Pragmas_Index).Ptyp is
diff --git a/gcc/ada/exp_ch7.adb b/gcc/ada/exp_ch7.adb
index 640ad5c60b8..f40371347fd 100644
--- a/gcc/ada/exp_ch7.adb
+++ b/gcc/ada/exp_ch7.adb
@@ -2672,9 +2672,10 @@ package body Exp_Ch7 is
                Process_Package_Body (Decl);
 
             elsif Nkind (Decl) = N_Package_Body_Stub
-              and then Present (Library_Unit (Decl))
+              and then Present (Stub_Subunit (Decl))
             then
-               Process_Package_Body (Proper_Body (Unit (Library_Unit (Decl))));
+               Process_Package_Body
+                 (Proper_Body (Unit (Stub_Subunit (Decl))));
             end if;
 
             Decl := Prev;
diff --git a/gcc/ada/exp_disp.adb b/gcc/ada/exp_disp.adb
index c3671810d64..f2501173516 100644
--- a/gcc/ada/exp_disp.adb
+++ b/gcc/ada/exp_disp.adb
@@ -417,10 +417,10 @@ package body Exp_Disp is
                Build_Dispatch_Tables (Declarations (D));
 
             elsif Nkind (D) = N_Package_Body_Stub
-              and then Present (Library_Unit (D))
+              and then Present (Stub_Subunit (D))
             then
                Build_Dispatch_Tables
-                 (Declarations (Proper_Body (Unit (Library_Unit (D)))));
+                 (Declarations (Proper_Body (Unit (Stub_Subunit (D)))));
 
             --  Handle full type declarations and derivations of library level
             --  tagged types
diff --git a/gcc/ada/exp_unst.adb b/gcc/ada/exp_unst.adb
index fb48a64ac86..9b76cba275f 100644
--- a/gcc/ada/exp_unst.adb
+++ b/gcc/ada/exp_unst.adb
@@ -1176,7 +1176,7 @@ package body Exp_Unst is
                --  is a semantic descendant of the stub.
 
                when N_Body_Stub =>
-                  Visit (Library_Unit (N));
+                  Visit (Stub_Subunit (N));
 
                --  A declaration of a wrapper package indicates a subprogram
                --  instance for which there is no explicit body. Enter the
@@ -2354,7 +2354,7 @@ package body Exp_Unst is
          --  recursively in Visit_Node.
 
          elsif Nkind (N) in N_Body_Stub then
-            Do_Search (Library_Unit (N));
+            Do_Search (Stub_Subunit (N));
 
          --  Skip generic packages
 
@@ -2385,7 +2385,7 @@ package body Exp_Unst is
         or else (Nkind (Unit (N)) = N_Subprogram_Body
                   and then not Acts_As_Spec (N))
       then
-         Do_Search (Library_Unit (N));
+         Do_Search (Spec_Lib_Unit (N));
       end if;
 
       Do_Search (N);
diff --git a/gcc/ada/exp_util.adb b/gcc/ada/exp_util.adb
index 4029ea6263c..b400505db7b 100644
--- a/gcc/ada/exp_util.adb
+++ b/gcc/ada/exp_util.adb
@@ -5006,7 +5006,7 @@ package body Exp_Util is
       --  declarations of the package spec.
 
       if Nkind (U) = N_Package_Body then
-         U := Unit (Library_Unit (Cunit (Current_Sem_Unit)));
+         U := Unit (Spec_Lib_Unit (Cunit (Current_Sem_Unit)));
       end if;
 
       if Nkind (U) = N_Package_Declaration then
diff --git a/gcc/ada/fe.h b/gcc/ada/fe.h
index e3e65fe18bd..bb40ca3e5cc 100644
--- a/gcc/ada/fe.h
+++ b/gcc/ada/fe.h
@@ -337,10 +337,20 @@ extern Entity_Id Storage_Model_Copy_To            
(Entity_Id);
 
 /* sinfo: */
 
+#define Spec_Lib_Unit                   sinfo__utils__spec_lib_unit
+#define Body_Lib_Unit                   sinfo__utils__body_lib_unit
+#define Subunit_Parent                  sinfo__utils__subunit_parent
+#define Stub_Subunit                    sinfo__utils__stub_subunit
+#define Withed_Lib_Unit                 sinfo__utils__withed_lib_unit
 #define End_Location                   sinfo__utils__end_location
 #define Set_Has_No_Elaboration_Code    
sinfo__nodes__set_has_no_elaboration_code
 #define Set_Present_Expr               sinfo__nodes__set_present_expr
 
+extern Node_Id Spec_Lib_Unit            (Node_Id);
+extern Node_Id Body_Lib_Unit            (Node_Id);
+extern Node_Id Subunit_Parent           (Node_Id);
+extern Node_Id Stub_Subunit             (Node_Id);
+extern Node_Id Withed_Lib_Unit          (Node_Id);
 extern Source_Ptr End_Location                 (Node_Id);
 extern void Set_Has_No_Elaboration_Code        (Node_Id, Boolean);
 extern void Set_Present_Expr           (Node_Id, Uint);
diff --git a/gcc/ada/gen_il-gen-gen_nodes.adb b/gcc/ada/gen_il-gen-gen_nodes.adb
index a9c0fa42b0d..e0e0538c5f0 100644
--- a/gcc/ada/gen_il-gen-gen_nodes.adb
+++ b/gcc/ada/gen_il-gen-gen_nodes.adb
@@ -835,16 +835,16 @@ begin -- Gen_IL.Gen.Gen_Nodes
        (Sm (Corresponding_Spec, Node_Id),
         Sm (Was_Originally_Stub, Flag)));
 
-   Ab (N_Unit_Body, N_Proper_Body);
+   Ab (N_Lib_Unit_Body, N_Proper_Body);
 
-   Cc (N_Package_Body, N_Unit_Body,
+   Cc (N_Package_Body, N_Lib_Unit_Body,
        (Sy (Defining_Unit_Name, Node_Id),
         Sy (Declarations, List_Id, Default_No_List),
         Sy (Handled_Statement_Sequence, Node_Id, Default_Empty),
         Sy (At_End_Proc, Node_Id, Default_Empty),
         Sy (Aspect_Specifications, List_Id, Default_No_List)));
 
-   Cc (N_Subprogram_Body, N_Unit_Body,
+   Cc (N_Subprogram_Body, N_Lib_Unit_Body,
        (Sy (Specification, Node_Id),
         Sy (Declarations, List_Id, Default_No_List),
         Sy (Handled_Statement_Sequence, Node_Id, Default_Empty),
@@ -1792,4 +1792,20 @@ begin -- Gen_IL.Gen.Gen_Nodes
              N_Variant));
    --  Nodes that can be alternatives in case contructs
 
+   Union (N_Lib_Unit_Declaration,
+          Children =>
+            (N_Package_Declaration,
+             N_Subprogram_Declaration,
+             N_Generic_Declaration,
+             N_Generic_Instantiation));
+   --  Nodes corresponding to the library_unit_declaration syntactic category
+
+   Union (N_Lib_Unit_Renaming_Declaration,
+          Children =>
+            (N_Package_Renaming_Declaration,
+             N_Subprogram_Renaming_Declaration,
+             N_Generic_Renaming_Declaration));
+   --  Nodes corresponding to the library_unit_renaming_declaration syntactic
+   --  category.
+
 end Gen_IL.Gen.Gen_Nodes;
diff --git a/gcc/ada/gen_il-gen.adb b/gcc/ada/gen_il-gen.adb
index 0f7abe7bf94..da7e96eaf19 100644
--- a/gcc/ada/gen_il-gen.adb
+++ b/gcc/ada/gen_il-gen.adb
@@ -734,6 +734,15 @@ package body Gen_IL.Gen is
                      Type_Table (T).First := Type_Table (Children (1)).First;
                      Type_Table (T).Last  :=
                        Type_Table (Children (Last_Index (Children))).Last;
+
+                     --  We know that each abstract type has at least two
+                     --  children. The concrete types must be ordered so
+                     --  that each abstract type is a contiguous subrange.
+
+                     if Type_Table (T).First >= Type_Table (T).Last then
+                        raise Illegal with
+                          Image (T) & " children out of order";
+                     end if;
                   end;
 
                when Between_Abstract_Entity_And_Concrete_Node_Types =>
diff --git a/gcc/ada/gen_il-types.ads b/gcc/ada/gen_il-types.ads
index f2a65957a09..4a739043faa 100644
--- a/gcc/ada/gen_il-types.ads
+++ b/gcc/ada/gen_il-types.ads
@@ -124,7 +124,9 @@ package Gen_IL.Types is
       N_Subexpr,
       N_Subprogram_Specification,
       N_Unary_Op,
-      N_Unit_Body,
+      N_Lib_Unit_Declaration,
+      N_Lib_Unit_Renaming_Declaration,
+      N_Lib_Unit_Body,
 
       --  End of abstract node types.
 
diff --git a/gcc/ada/inline.adb b/gcc/ada/inline.adb
index 5f310abafda..9fa5642238e 100644
--- a/gcc/ada/inline.adb
+++ b/gcc/ada/inline.adb
@@ -498,7 +498,7 @@ package body Inline is
          --  package of the subprogram to find more calls to be inlined.
 
          if Comp = Cunit (Main_Unit)
-           or else Comp = Library_Unit (Cunit (Main_Unit))
+           or else Comp = Spec_Or_Body_Lib_Unit (Cunit (Main_Unit))
          then
             Add_Call (E);
             return Inline_Package;
@@ -2897,7 +2897,7 @@ package body Inline is
                         then
                            Child_Spec :=
                              Defining_Entity
-                               ((Unit (Library_Unit (Cunit (Main_Unit)))));
+                               ((Unit (Spec_Lib_Unit (Cunit (Main_Unit)))));
 
                            Comp :=
                              Parent (Unit_Declaration_Node (Body_Entity (P)));
@@ -4712,11 +4712,11 @@ package body Inline is
       --  done in Analyze_Inlined_Bodies.
 
       while Nkind (Unit (Comp)) = N_Subunit loop
-         Comp := Library_Unit (Comp);
+         Comp := Subunit_Parent (Comp);
       end loop;
 
       return Comp = Cunit (Main_Unit)
-        or else Comp = Library_Unit (Cunit (Main_Unit));
+        or else Comp = Spec_Or_Body_Lib_Unit (Cunit (Main_Unit));
    end In_Main_Unit_Or_Subunit;
 
    ----------------
diff --git a/gcc/ada/lib-load.adb b/gcc/ada/lib-load.adb
index 06da3691d46..c8850647a4d 100644
--- a/gcc/ada/lib-load.adb
+++ b/gcc/ada/lib-load.adb
@@ -948,7 +948,7 @@ package body Lib.Load is
    --------------------------
 
    procedure Make_Child_Decl_Unit (N : Node_Id) is
-      Unit_Decl : constant Node_Id          := Library_Unit (N);
+      Unit_Decl : constant Node_Id          := Spec_Lib_Unit (N);
       Unit_Num  : constant Unit_Number_Type := Get_Cunit_Unit_Number (N);
 
    begin
@@ -988,14 +988,14 @@ package body Lib.Load is
 
       if In_Main then
          Units.Table (Units.Last)        := Units.Table (Main_Unit);
-         Units.Table (Units.Last).Cunit  := Library_Unit (N);
+         Units.Table (Units.Last).Cunit  := Spec_Lib_Unit (N);
          Init_Unit_Name (Units.Last, Unit_Name (Main_Unit));
 
          Units.Table (Main_Unit).Cunit   := N;
          Units.Table (Main_Unit).Version := Source_Checksum (Sind);
          Init_Unit_Name (Main_Unit,
            Get_Body_Name
-             (Unit_Name (Get_Cunit_Unit_Number (Library_Unit (N)))));
+             (Unit_Name (Get_Cunit_Unit_Number (Spec_Lib_Unit (N)))));
 
       else
          --  Duplicate information from instance unit, for the body. The unit
@@ -1003,7 +1003,7 @@ package body Lib.Load is
          --  units table when first loaded as a declaration.
 
          Units.Table (Units.Last) := Units.Table (Get_Cunit_Unit_Number (N));
-         Units.Table (Units.Last).Cunit := Library_Unit (N);
+         Units.Table (Units.Last).Cunit := Spec_Lib_Unit (N);
       end if;
    end Make_Instance_Unit;
 
diff --git a/gcc/ada/lib-writ.adb b/gcc/ada/lib-writ.adb
index 23de685de0f..e6bfbf1bb37 100644
--- a/gcc/ada/lib-writ.adb
+++ b/gcc/ada/lib-writ.adb
@@ -339,7 +339,7 @@ package body Lib.Writ is
             --  the unit anywhere else.
 
             if Nkind (Item) = N_With_Clause then
-               Unum := Get_Cunit_Unit_Number (Library_Unit (Item));
+               Unum := Get_Cunit_Unit_Number (Withed_Lib_Unit (Item));
                With_Flags (Unum) := True;
 
                if not Limited_Present (Item) then
@@ -594,9 +594,10 @@ package body Lib.Writ is
 
          if Ukind in N_Generic_Declaration
            or else
-             (Present (Library_Unit (Unode))
-                and then
-                  Nkind (Unit (Library_Unit (Unode))) in N_Generic_Declaration)
+             (Ukind in N_Lib_Unit_Body
+                and then Present (Spec_Lib_Unit (Unode))
+                and then Nkind (Unit (Spec_Lib_Unit (Unode)))
+                  in N_Generic_Declaration)
          then
             Write_Info_Str (" GE");
          end if;
@@ -638,7 +639,7 @@ package body Lib.Writ is
          --  it and which have context clauses of their own, since these
          --  with'ed units are part of its own elaboration dependencies.
 
-         if Nkind (Unit (Unode)) in N_Unit_Body then
+         if Nkind (Unit (Unode)) in N_Lib_Unit_Body then
             for S in Units.First .. Last_Unit loop
 
                --  We are only interested in subunits. For preproc. data and
@@ -647,7 +648,7 @@ package body Lib.Writ is
                if Cunit (S) /= Empty
                  and then Nkind (Unit (Cunit (S))) = N_Subunit
                then
-                  Pnode := Library_Unit (Cunit (S));
+                  Pnode := Subunit_Parent (Cunit (S));
 
                   --  In gnatc mode, the errors in the subunits will not have
                   --  been recorded, but the analysis of the subunit may have
@@ -661,7 +662,7 @@ package body Lib.Writ is
                   --  Find ultimate parent of the subunit
 
                   while Nkind (Unit (Pnode)) = N_Subunit loop
-                     Pnode := Library_Unit (Pnode);
+                     Pnode := Subunit_Parent (Pnode);
                   end loop;
 
                   --  See if it belongs to current unit, and if so, include
@@ -1169,7 +1170,7 @@ package body Lib.Writ is
             if Nkind (U) = N_Package_Body then
                U := Parent (Parent (
                    Alias (Related_Instance (Defining_Unit_Name
-                     (Specification (Unit (Library_Unit (Parent (U)))))))));
+                     (Specification (Unit (Spec_Lib_Unit (Parent (U)))))))));
             end if;
 
             S := Specification (U);
diff --git a/gcc/ada/lib.adb b/gcc/ada/lib.adb
index 24255dac16e..9539a47ad35 100644
--- a/gcc/ada/lib.adb
+++ b/gcc/ada/lib.adb
@@ -36,6 +36,7 @@ with Opt;            use Opt;
 with Output;         use Output;
 with Sinfo;          use Sinfo;
 with Sinfo.Nodes;    use Sinfo.Nodes;
+with Sinfo.Utils;    use Sinfo.Utils;
 with Sinput;         use Sinput;
 with Stand;          use Stand;
 with Stringt;        use Stringt;
@@ -481,12 +482,12 @@ package body Lib is
          --  earlier.
 
          if Nkind (Unit1) in N_Subprogram_Body | N_Package_Body then
-            if Library_Unit (Cunit (Unum1)) = Cunit (Unum2) then
+            if Spec_Lib_Unit (Cunit (Unum1)) = Cunit (Unum2) then
                return Yes_After;
             end if;
 
          elsif Nkind (Unit2) in N_Subprogram_Body | N_Package_Body then
-            if Library_Unit (Cunit (Unum2)) = Cunit (Unum1) then
+            if Spec_Lib_Unit (Cunit (Unum2)) = Cunit (Unum1) then
                return Yes_Before;
             end if;
          end if;
@@ -779,10 +780,16 @@ package body Lib is
          end if;
       end loop;
 
-      --  If not in the table, must be a spec created for a main unit that is a
-      --  child subprogram body which we have not inserted into the table yet.
+      --  Not in the table. Empty N is some already-detected error; otherwise,
+      --  it must be a spec created for a main unit that is a child subprogram
+      --  body which we have not inserted into the table yet.
 
-      if N = Library_Unit (Cunit (Main_Unit)) then
+      if No (N) then
+         pragma Assert (Serious_Errors_Detected > 0);
+         return Main_Unit;
+      end if;
+
+      if N = Spec_Lib_Unit (Cunit (Main_Unit)) then
          return Main_Unit;
 
       --  If it is anything else, something is seriously wrong, and we really
@@ -1330,10 +1337,11 @@ package body Lib is
                if Nkind (Context_Item) = N_With_Clause
                  and then not Limited_Present (Context_Item)
                then
-                  pragma Assert (Present (Library_Unit (Context_Item)));
+                  pragma Assert (Present (Withed_Lib_Unit (Context_Item)));
                   Write_Unit_Name
                     (Unit_Name
-                       (Get_Cunit_Unit_Number (Library_Unit (Context_Item))));
+                      (Get_Cunit_Unit_Number
+                        (Withed_Lib_Unit (Context_Item))));
 
                   if Is_Implicit_With (Context_Item) then
                      Write_Str (" -- implicit");
diff --git a/gcc/ada/live.adb b/gcc/ada/live.adb
index 7707220e7f0..1001427c6e7 100644
--- a/gcc/ada/live.adb
+++ b/gcc/ada/live.adb
@@ -156,8 +156,8 @@ package body Live is
                Traverse (Spec_Of (N));
 
             when N_Package_Body_Stub =>
-               if Present (Library_Unit (N)) then
-                  Traverse (Proper_Body (Unit (Library_Unit (N))));
+               if Present (Subunit_Parent (N)) then
+                  Traverse (Proper_Body (Unit (Stub_Subunit (N))));
                end if;
 
             when N_Package_Body =>
@@ -252,8 +252,8 @@ package body Live is
                Traverse (Spec_Of (N));
 
             when N_Package_Body_Stub =>
-               if Present (Library_Unit (N)) then
-                  Traverse (Proper_Body (Unit (Library_Unit (N))));
+               if Present (Stub_Subunit (N)) then
+                  Traverse (Proper_Body (Unit (Stub_Subunit (N))));
                end if;
 
             when N_Package_Body =>
@@ -321,8 +321,8 @@ package body Live is
                end if;
 
             when N_Package_Body_Stub =>
-               if Present (Library_Unit (N)) then
-                  Traverse (Proper_Body (Unit (Library_Unit (N))));
+               if Present (Stub_Subunit (N)) then
+                  Traverse (Proper_Body (Unit (Stub_Subunit (N))));
                end if;
 
             when N_Expanded_Name
diff --git a/gcc/ada/par-load.adb b/gcc/ada/par-load.adb
index 45be02c1c72..dbb123eb7b7 100644
--- a/gcc/ada/par-load.adb
+++ b/gcc/ada/par-load.adb
@@ -258,8 +258,8 @@ begin
       --  have set our Fatal_Error flag to propagate this condition.
 
       if Unum /= No_Unit then
-         Set_Library_Unit (Curunit, Cunit (Unum));
-         Set_Library_Unit (Cunit (Unum), Curunit);
+         Set_Spec_Lib_Unit (Curunit, Cunit (Unum));
+         Set_Body_Lib_Unit (Cunit (Unum), Curunit);
 
          --  If this is a separate spec for the main unit, then we reset
          --  Main_Unit_Entity to point to the entity for this separate spec
@@ -284,7 +284,7 @@ begin
 
       elsif Nkind (Unit (Curunit)) = N_Subprogram_Body then
          Set_Acts_As_Spec (Curunit, True);
-         Set_Library_Unit (Curunit, Curunit);
+         Set_Spec_Lib_Unit (Curunit, Curunit);
 
       --  Otherwise we do have an error, repeat the load request for the spec
       --  with Required set True to generate an appropriate error message.
@@ -341,7 +341,7 @@ begin
            Error_Node => Name (Unit (Curunit)));
 
       if Unum /= No_Unit then
-         Set_Library_Unit (Curunit, Cunit (Unum));
+         Set_Subunit_Parent (Curunit, Cunit (Unum));
       end if;
    end if;
 
@@ -397,7 +397,7 @@ begin
             --  unit gets a fatal error, so we don't need to worry about that.
 
             if Unum /= No_Unit then
-               Set_Library_Unit (With_Node, Cunit (Unum));
+               Set_Withed_Lib_Unit (With_Node, Cunit (Unum));
 
             --  If the spec isn't found, then try finding the corresponding
             --  body, since it is possible that we have a subprogram body
@@ -414,16 +414,29 @@ begin
                     Renamings  => True);
 
                --  If we got a subprogram body, then mark that we are using
-               --  the body as a spec in the file table, and set the spec
-               --  pointer in the N_With_Clause to point to the body entity.
+               --  the body as a spec in the file table, and set
+               --  Withed_Lib_Unit of the N_With_Clause to point to
+               --  the body entity.
 
                if Unum /= No_Unit
                  and then Nkind (Unit (Cunit (Unum))) = N_Subprogram_Body
                then
                   With_Cunit := Cunit (Unum);
-                  Set_Library_Unit (With_Node, With_Cunit);
-                  Set_Acts_As_Spec (With_Cunit, True);
-                  Set_Library_Unit (With_Cunit, With_Cunit);
+                  Set_Withed_Lib_Unit (With_Node, With_Cunit);
+
+                  --  If we have errors, Acts_As_Spec and Spec_Lib_Unit might
+                  --  not be set; set them for better error recovery.
+
+                  if Serious_Errors_Detected > 0 then
+                     Set_Acts_As_Spec (With_Cunit, True);
+                     Set_Spec_Lib_Unit (With_Cunit, With_Cunit);
+
+                  --  Otherwise, these field should already by set
+
+                  else
+                     pragma Assert (Acts_As_Spec (With_Cunit));
+                     pragma Assert (Spec_Lib_Unit (With_Cunit) = With_Cunit);
+                  end if;
 
                --  If we couldn't find the body, or if it wasn't a body spec
                --  then we are in trouble. We make one more call to Load to
@@ -443,7 +456,7 @@ begin
                   --  Here we create a dummy package unit for the missing unit
 
                   Unum := Create_Dummy_Package_Unit (With_Node, Spec_Name);
-                  Set_Library_Unit (With_Node, Cunit (Unum));
+                  Set_Withed_Lib_Unit (With_Node, Cunit (Unum));
                end if;
             end if;
          end if;
diff --git a/gcc/ada/rtsfind.adb b/gcc/ada/rtsfind.adb
index f555b99c15d..01f1be23228 100644
--- a/gcc/ada/rtsfind.adb
+++ b/gcc/ada/rtsfind.adb
@@ -1310,11 +1310,11 @@ package body Rtsfind is
                  (U, Defining_Unit_Name (Specification (LibUnit))));
          Ghost_Mode := Saved_GM;
 
-         Set_Corresponding_Spec (Withn, U.Entity);
-         Set_First_Name         (Withn);
-         Set_Is_Implicit_With   (Withn);
-         Set_Library_Unit       (Withn, Cunit (U.Unum));
-         Set_Next_Implicit_With (Withn, U.First_Implicit_With);
+         Set_Corresponding_Spec  (Withn, U.Entity);
+         Set_First_Name          (Withn);
+         Set_Is_Implicit_With    (Withn);
+         Set_Withed_Lib_Unit     (Withn, Cunit (U.Unum));
+         Set_Next_Implicit_With  (Withn, U.First_Implicit_With);
 
          U.First_Implicit_With := Withn;
 
diff --git a/gcc/ada/sem.adb b/gcc/ada/sem.adb
index 915a1cc13a5..fd52e3aea39 100644
--- a/gcc/ada/sem.adb
+++ b/gcc/ada/sem.adb
@@ -1530,7 +1530,7 @@ package body Sem is
          Curunit = Main_Unit
            or else
              (Nkind (Unit (Cunit (Main_Unit))) = N_Package_Body
-               and then Library_Unit (Cunit (Main_Unit)) = Cunit (Curunit));
+               and then Spec_Lib_Unit (Cunit (Main_Unit)) = Cunit (Curunit));
       --  Configuration flags have special settings when compiling a predefined
       --  file as a main unit. This applies to its spec as well.
 
@@ -1841,8 +1841,8 @@ package body Sem is
 
          while Present (CL) loop
             if Nkind (CL) = N_With_Clause
-              and then Library_Unit (CL) = Main_CU
-              and then not Done (Get_Cunit_Unit_Number (Library_Unit (CL)))
+              and then Withed_Lib_Unit (CL) = Main_CU
+              and then not Done (Get_Cunit_Unit_Number (Withed_Lib_Unit (CL)))
             then
                return True;
             end if;
@@ -2025,9 +2025,9 @@ package body Sem is
 
          if Nkind (Unit (Withed_Unit)) = N_Package_Body
            and then Is_Generic_Instance
-                      (Defining_Entity (Unit (Library_Unit (Withed_Unit))))
+                      (Defining_Entity (Unit (Spec_Lib_Unit (Withed_Unit))))
          then
-            Do_Withed_Unit (Library_Unit (Withed_Unit));
+            Do_Withed_Unit (Spec_Lib_Unit (Withed_Unit));
          end if;
       end Do_Withed_Unit;
 
@@ -2062,7 +2062,7 @@ package body Sem is
                else
                   Seen (Unit_Num) := True;
 
-                  if CU = Library_Unit (Main_CU) then
+                  if CU = Spec_Or_Body_Lib_Unit (Main_CU) then
                      Process_Bodies_In_Context (CU);
 
                      --  If main is a child unit, examine parent unit contexts
@@ -2122,8 +2122,8 @@ package body Sem is
          Clause := First (Context_Items (Comp));
          while Present (Clause) loop
             if Nkind (Clause) = N_With_Clause then
-               Spec := Library_Unit (Clause);
-               Body_CU := Library_Unit (Spec);
+               Spec := Withed_Lib_Unit (Clause);
+               Body_CU := Body_Lib_Unit (Spec);
 
                --  If we are processing the spec of the main unit, load bodies
                --  only if the with_clause indicates that it forced the loading
@@ -2183,7 +2183,7 @@ package body Sem is
               and then Is_Generic_Instance (Defining_Entity (N))
             then
                Append_List
-                 (Context_Items (CU), Context_Items (Library_Unit (CU)));
+                 (Context_Items (CU), Context_Items (Spec_Lib_Unit (CU)));
             end if;
 
             Next_Elmt (Cur);
@@ -2233,11 +2233,11 @@ package body Sem is
                   if CU = Main_CU
                     and then Nkind (Original_Node (Unit (Main_CU))) in
                                                   N_Generic_Instantiation
-                    and then Present (Library_Unit (Main_CU))
+                    and then Present (Spec_Lib_Unit (Main_CU))
                   then
                      Do_Unit_And_Dependents
-                       (Library_Unit (Main_CU),
-                        Unit (Library_Unit (Main_CU)));
+                       (Spec_Lib_Unit (Main_CU),
+                        Unit (Spec_Lib_Unit (Main_CU)));
                   end if;
 
                --  It is a spec, process it, and the units it depends on,
@@ -2257,7 +2257,7 @@ package body Sem is
                   --  after all other specs.
 
                   if Nkind (Unit (CU)) = N_Package_Declaration
-                    and then Library_Unit (CU) = Main_CU
+                    and then Body_Lib_Unit (CU) = Main_CU
                     and then CU /= Main_CU
                   then
                      Spec_CU := CU;
@@ -2316,7 +2316,7 @@ package body Sem is
 
             begin
                if Present (U) and then Nkind (Unit (U)) = N_Subunit then
-                  Lib := Library_Unit (U);
+                  Lib := Subunit_Parent (U);
                   return Lib = Main_CU or else Is_Subunit_Of_Main (Lib);
                else
                   return False;
@@ -2346,7 +2346,7 @@ package body Sem is
                while Is_Child_Unit (Child) loop
                   Parent_CU :=
                     Cunit (Get_Cunit_Entity_Unit_Number (Scope (Child)));
-                  Body_CU := Library_Unit (Parent_CU);
+                  Body_CU := Body_Lib_Unit (Parent_CU);
 
                   if Present (Body_CU)
                     and then not Seen (Get_Cunit_Unit_Number (Body_CU))
@@ -2418,7 +2418,7 @@ package body Sem is
       --  and which have context clauses of their own, since these with'ed
       --  units are part of its own dependencies.
 
-      if Nkind (Unit (CU)) in N_Unit_Body then
+      if Nkind (Unit (CU)) in N_Lib_Unit_Body then
          for S in Main_Unit .. Last_Unit loop
 
             --  We are only interested in subunits. For preproc. data and def.
@@ -2431,7 +2431,7 @@ package body Sem is
                   Pnode : Node_Id;
 
                begin
-                  Pnode := Library_Unit (Cunit (S));
+                  Pnode := Subunit_Parent (Cunit (S));
 
                   --  In -gnatc mode, the errors in the subunits will not have
                   --  been recorded, but the analysis of the subunit may have
@@ -2444,7 +2444,7 @@ package body Sem is
                   --  Find ultimate parent of the subunit
 
                   while Nkind (Unit (Pnode)) = N_Subunit loop
-                     Pnode := Library_Unit (Pnode);
+                     Pnode := Subunit_Parent (Pnode);
                   end loop;
 
                   --  See if it belongs to current unit, and if so, include its
@@ -2476,7 +2476,7 @@ package body Sem is
            and then (Include_Limited
                      or else not Limited_Present (Context_Item))
          then
-            Lib_Unit := Library_Unit (Context_Item);
+            Lib_Unit := Withed_Lib_Unit (Context_Item);
             Action (Lib_Unit);
          end if;
 
diff --git a/gcc/ada/sem_ch10.adb b/gcc/ada/sem_ch10.adb
index 4e582440c40..8499178202b 100644
--- a/gcc/ada/sem_ch10.adb
+++ b/gcc/ada/sem_ch10.adb
@@ -706,12 +706,12 @@ package body Sem_Ch10 is
                Install_Parent_Policy_Pragmas (Parent_Spec (Lib_Unit));
 
             elsif Nkind (Lib_Unit) = N_Package_Body then
-               Install_Parent_Policy_Pragmas (Library_Unit (N));
+               Install_Parent_Policy_Pragmas (Spec_Lib_Unit (N));
 
             elsif Nkind (Lib_Unit) = N_Subprogram_Body
                and then not Acts_As_Spec (N)
             then
-               Install_Parent_Policy_Pragmas (Library_Unit (N));
+               Install_Parent_Policy_Pragmas (Spec_Lib_Unit (N));
             end if;
 
             --  Search for check policy pragmas defined at the start of the
@@ -768,12 +768,12 @@ package body Sem_Ch10 is
             Install_Parent_Policy_Pragmas (Parent_Spec (Lib_Unit));
 
          elsif Nkind (Lib_Unit) = N_Package_Body then
-            Install_Parent_Policy_Pragmas (Library_Unit (Comp_Unit));
+            Install_Parent_Policy_Pragmas (Spec_Lib_Unit (Comp_Unit));
 
          elsif Nkind (Lib_Unit) = N_Subprogram_Body
             and then not Acts_As_Spec (Comp_Unit)
          then
-            Install_Parent_Policy_Pragmas (Library_Unit (Comp_Unit));
+            Install_Parent_Policy_Pragmas (Spec_Lib_Unit (Comp_Unit));
          end if;
 
          return Last_Policy_Pragma;
@@ -823,7 +823,7 @@ package body Sem_Ch10 is
       --  Local variables
 
       Main_Cunit    : constant Node_Id := Cunit (Main_Unit);
-      Lib_Unit      : Node_Id          := Library_Unit (N);
+      Lib_Unit      : Node_Id          := Other_Comp_Unit (N);
       Par_Spec_Name : Unit_Name_Type;
       Spec_Id       : Entity_Id;
       Unum          : Unit_Number_Type;
@@ -979,7 +979,7 @@ package body Sem_Ch10 is
 
             --  If the subprogram body is a child unit, we must create a
             --  declaration for it, in order to properly load the parent(s).
-            --  After this, the original unit does not acts as a spec, because
+            --  After this, the original unit does not act as a spec, because
             --  there is an explicit one. If this unit appears in a context
             --  clause, then an implicit with on the parent will be added when
             --  installing the context. If this is the main unit, there is no
@@ -1040,7 +1040,7 @@ package body Sem_Ch10 is
                            Make_Compilation_Unit_Aux (Loc));
 
                      Set_Context_Items (N, Empty_List);
-                     Set_Library_Unit (N, Lib_Unit);
+                     Set_Spec_Lib_Unit (N, Lib_Unit);
                      Set_Parent_Spec (Unit (Lib_Unit), Cunit (Unum));
                      Make_Child_Decl_Unit (N);
 
@@ -1685,14 +1685,14 @@ package body Sem_Ch10 is
             --  Skip analyzing with clause if no unit; this happens for a with
             --  that references a non-existent unit.
 
-            if Present (Library_Unit (Item)) then
+            if Present (Withed_Lib_Unit (Item)) then
                Analyze (Item);
             end if;
 
             --  Do version update (skipped for implicit with)
 
             if not Is_Implicit_With (Item) then
-               Version_Update (N, Library_Unit (Item));
+               Version_Update (N, Withed_Lib_Unit (Item));
             end if;
 
          --  Skip pragmas. Configuration pragmas at the start were handled in
@@ -1742,7 +1742,7 @@ package body Sem_Ch10 is
                --      limited with P.Q;
                --      package P.Q is ...
 
-               elsif Unit (Library_Unit (Item)) = Unit (N) then
+               elsif Unit (Withed_Lib_Unit (Item)) = Unit (N) then
                   Error_Msg_N ("wrong use of limited-with clause", Item);
 
                --  Check wrong use of limited-with clause applied to some
@@ -1750,8 +1750,9 @@ package body Sem_Ch10 is
 
                elsif Is_Child_Spec (Unit (N)) then
                   declare
-                     Lib_U : constant Entity_Id := Unit (Library_Unit (Item));
-                     P     : Node_Id;
+                     Lib_U : constant Entity_Id :=
+                       Unit (Withed_Lib_Unit (Item));
+                     P : Node_Id;
 
                   begin
                      P := Parent_Spec (Unit (N));
@@ -1787,16 +1788,16 @@ package body Sem_Ch10 is
                         if Item /= It
                           and then Nkind (It) = N_With_Clause
                           and then not Limited_Present (It)
-                          and then Nkind (Unit (Library_Unit (It))) in
+                          and then Nkind (Unit (Withed_Lib_Unit (It))) in
                                      N_Package_Declaration |
                                      N_Package_Renaming_Declaration
                         then
-                           if Nkind (Unit (Library_Unit (It))) =
+                           if Nkind (Unit (Withed_Lib_Unit (It))) =
                                                       N_Package_Declaration
                            then
                               Unit_Name := Name (It);
                            else
-                              Unit_Name := Name (Unit (Library_Unit (It)));
+                              Unit_Name := Name (Unit (Withed_Lib_Unit (It)));
                            end if;
 
                            --  Check if the named package (or some ancestor)
@@ -1836,7 +1837,7 @@ package body Sem_Ch10 is
 
             --  Skip analyzing with clause if no unit, see above
 
-            if Present (Library_Unit (Item)) then
+            if Present (Withed_Lib_Unit (Item)) then
                Analyze (Item);
             end if;
 
@@ -1844,7 +1845,7 @@ package body Sem_Ch10 is
             --  is a semantic dependency for recompilation purposes.
 
             if not Is_Implicit_With (Item) then
-               Version_Update (N, Library_Unit (Item));
+               Version_Update (N, Withed_Lib_Unit (Item));
             end if;
 
          --  Pragmas and use clauses and with clauses other than limited with's
@@ -1972,7 +1973,7 @@ package body Sem_Ch10 is
             else
                Set_Corresponding_Stub (Unit (Comp_Unit), N);
                Analyze_Subunit (Comp_Unit);
-               Set_Library_Unit (N, Comp_Unit);
+               Set_Stub_Subunit (N, Comp_Unit);
                Set_Corresponding_Body (N, Defining_Entity (Unit (Comp_Unit)));
             end if;
 
@@ -2007,14 +2008,14 @@ package body Sem_Ch10 is
          --  If the proper body is already linked to the stub node, the stub is
          --  in a generic unit and just needs analyzing.
 
-         if Present (Library_Unit (N)) then
-            Set_Corresponding_Stub (Unit (Library_Unit (N)), N);
+         if Present (Stub_Subunit (N)) then
+            Set_Corresponding_Stub (Unit (Stub_Subunit (N)), N);
 
-            --  If the subunit has severe errors, the spec of the enclosing
-            --  body may not be available, in which case do not try analysis.
+            --  If the subunit has errors, the spec of the enclosing body might
+            --  not be available, in which case do not try analysis.
 
             if Serious_Errors_Detected > 0
-              and then No (Library_Unit (Library_Unit (N)))
+              and then No (Subunit_Parent (Stub_Subunit (N)))
             then
                return;
             end if;
@@ -2026,10 +2027,10 @@ package body Sem_Ch10 is
               and then In_Extended_Main_Source_Unit
                          (Cunit_Entity (Current_Sem_Unit))
             then
-               SCO_Record_Raw (Get_Cunit_Unit_Number (Library_Unit (N)));
+               SCO_Record_Raw (Get_Cunit_Unit_Number (Stub_Subunit (N)));
             end if;
 
-            Analyze_Subunit (Library_Unit (N));
+            Analyze_Subunit (Stub_Subunit (N));
 
          --  Otherwise we must load the subunit and link to it
 
@@ -2064,7 +2065,7 @@ package body Sem_Ch10 is
 
                Set_Corresponding_Stub (Unit (Cunit (Unum)), N);
                Analyze_Subunit (Cunit (Unum));
-               Set_Library_Unit (N, Cunit (Unum));
+               Set_Stub_Subunit (N, Cunit (Unum));
             end if;
          end if;
 
@@ -2106,10 +2107,10 @@ package body Sem_Ch10 is
          --  substitution of subunits, it makes sense to include it in the
          --  version identification.
 
-         if Present (Library_Unit (N)) then
-            Set_Corresponding_Stub (Unit (Library_Unit (N)), N);
-            Analyze_Subunit (Library_Unit (N));
-            Version_Update (Cunit (Main_Unit), Library_Unit (N));
+         if Present (Stub_Subunit (N)) then
+            Set_Corresponding_Stub (Unit (Stub_Subunit (N)), N);
+            Analyze_Subunit (Stub_Subunit (N));
+            Version_Update (Cunit (Main_Unit), Stub_Subunit (N));
 
          --  Otherwise we must load the subunit and link to it
 
@@ -2163,7 +2164,7 @@ package body Sem_Ch10 is
 
                else
                   Set_Corresponding_Stub (Unit (Comp_Unit), N);
-                  Set_Library_Unit (N, Comp_Unit);
+                  Set_Stub_Subunit (N, Comp_Unit);
 
                   --  We update the version. Although we are not technically
                   --  semantically dependent on the subunit, given our approach
@@ -2382,7 +2383,7 @@ package body Sem_Ch10 is
            and then Limited_Present (Item)
            and then not Is_Implicit_With (Item)
          then
-            Semantics (Library_Unit (Item));
+            Semantics (Withed_Lib_Unit (Item));
          end if;
 
          Next (Item);
@@ -2463,10 +2464,10 @@ package body Sem_Ch10 is
    --  SPARK mode.
 
    procedure Analyze_Subunit (N : Node_Id) is
-      Lib_Unit : constant Node_Id   := Library_Unit (N);
+      Lib_Unit : constant Node_Id   := Subunit_Parent (N);
       Par_Unit : constant Entity_Id := Current_Scope;
 
-      Lib_Spec        : Node_Id := Library_Unit (Lib_Unit);
+      Lib_Spec        : Node_Id := Other_Comp_Unit (Lib_Unit);
       Num_Scopes      : Nat := 0;
       Use_Clauses     : array (1 .. Scope_Stack.Last) of Node_Id;
       Enclosing_Child : Entity_Id := Empty;
@@ -2606,7 +2607,7 @@ package body Sem_Ch10 is
 
       begin
          if Nkind (Unit (L)) = N_Subunit then
-            Re_Install_Parents (Library_Unit (L), Scope (Scop));
+            Re_Install_Parents (Subunit_Parent (L), Scope (Scop));
          end if;
 
          Install_Context (L, False);
@@ -2739,7 +2740,7 @@ package body Sem_Ch10 is
             Remove_Context (Lib_Spec);
 
             while Nkind (Unit (Lib_Spec)) = N_Subunit loop
-               Lib_Spec := Library_Unit (Lib_Spec);
+               Lib_Spec := Subunit_Parent (Lib_Spec);
                Remove_Scope;
                Remove_Context (Lib_Spec);
             end loop;
@@ -2750,7 +2751,7 @@ package body Sem_Ch10 is
 
             if Nkind (Unit (Lib_Spec)) in N_Package_Body | N_Subprogram_Body
             then
-               Remove_Context (Library_Unit (Lib_Spec));
+               Remove_Context (Spec_Lib_Unit (Lib_Spec));
             end if;
          end if;
 
@@ -2935,13 +2936,12 @@ package body Sem_Ch10 is
       --  instantiation appears indirectly elsewhere in the context, it will
       --  have been analyzed already.
 
-      Unit_Kind : constant Node_Kind :=
-                    Nkind (Original_Node (Unit (Library_Unit (N))));
+      U         : constant Node_Id := Unit (Withed_Lib_Unit (N));
+      Unit_Kind : constant Node_Kind := Nkind (Original_Node (U));
       Nam       : constant Node_Id := Name (N);
       E_Name    : Entity_Id;
       Par_Name  : Entity_Id;
       Pref      : Node_Id;
-      U         : constant Node_Id := Unit (Library_Unit (N));
 
       Intunit : Boolean;
       --  Set True if the unit currently being compiled is an internal unit
@@ -3034,7 +3034,8 @@ package body Sem_Ch10 is
       --  legality of subsequent (also useless) use clauses depend on the
       --  presence of the with clause.
 
-      if Library_Unit (N) = Library_Unit (Cunit (Current_Sem_Unit)) then
+      if Withed_Lib_Unit (N) = Spec_Or_Body_Lib_Unit (Cunit (Current_Sem_Unit))
+      then
          Set_Is_Implicit_With (N);
 
          --  Self-referential withs are always useless, so warn
@@ -3068,7 +3069,7 @@ package body Sem_Ch10 is
       --  Normal (non-self-referential) case
 
       else
-         Semantics (Library_Unit (N));
+         Semantics (Withed_Lib_Unit (N));
       end if;
 
       Intunit := Is_Internal_Unit (Current_Sem_Unit);
@@ -3164,8 +3165,8 @@ package body Sem_Ch10 is
       --  visibility purposes we need the entity of its spec.
 
       elsif (Unit_Kind = N_Package_Instantiation
-              or else Nkind (Original_Node (Unit (Library_Unit (N)))) =
-                                                  N_Package_Instantiation)
+              or else Nkind (Original_Node (Unit (Withed_Lib_Unit (N)))) =
+                      N_Package_Instantiation)
         and then Nkind (U) = N_Package_Body
       then
          E_Name := Corresponding_Spec (U);
@@ -3203,7 +3204,7 @@ package body Sem_Ch10 is
 
       elsif Unit_Kind = N_Subprogram_Body
         and then Nkind (Name (N)) = N_Selected_Component
-        and then not Acts_As_Spec (Library_Unit (N))
+        and then not Acts_As_Spec (Withed_Lib_Unit (N))
       then
          --  For a child unit that has no spec, one has been created and
          --  analyzed. The entity required is that of the spec.
@@ -3228,10 +3229,11 @@ package body Sem_Ch10 is
          --  with_clause for the child unit (e.g. in separate subunits).
 
          if Unit_Kind = N_Subprogram_Declaration
-           and then Analyzed (Library_Unit (N))
-           and then not Comes_From_Source (Library_Unit (N))
+           and then Analyzed (Withed_Lib_Unit (N))
+           and then not Comes_From_Source (Withed_Lib_Unit (N))
          then
-            Set_Library_Unit (N,
+            Set_Library_Unit (N, Empty); -- overwritten by Set_Withed_Lib_Unit
+            Set_Withed_Lib_Unit (N,
                Cunit (Get_Source_Unit (Corresponding_Body (U))));
          end if;
       end if;
@@ -3349,7 +3351,7 @@ package body Sem_Ch10 is
 
       --  Propagate Fatal_Error setting from with'ed unit to current unit
 
-      case Fatal_Error (Get_Source_Unit (Library_Unit (N))) is
+      case Fatal_Error (Get_Source_Unit (Withed_Lib_Unit (N))) is
 
          --  Nothing to do if with'ed unit had no error
 
@@ -3386,7 +3388,7 @@ package body Sem_Ch10 is
 
    begin
       if Nkind (Lib_Unit) in N_Package_Body | N_Subprogram_Body then
-         Curr_Unit := Defining_Entity (Unit (Library_Unit (N)));
+         Curr_Unit := Defining_Entity (Unit (Spec_Lib_Unit (N)));
          Par_Lib   := Curr_Unit;
 
       elsif Nkind (Lib_Unit) = N_Subunit then
@@ -3394,8 +3396,8 @@ package body Sem_Ch10 is
          --  The parent is itself a body. The parent entity is to be found in
          --  the corresponding spec.
 
-         Sub_Parent := Library_Unit (N);
-         Curr_Unit  := Defining_Entity (Unit (Library_Unit (Sub_Parent)));
+         Sub_Parent := Subunit_Parent (N);
+         Curr_Unit  := Defining_Entity (Unit (Other_Comp_Unit (Sub_Parent)));
 
          --  If the parent itself is a subunit, Curr_Unit is the entity of the
          --  enclosing body, retrieve the spec entity which is the proper
@@ -3675,7 +3677,7 @@ package body Sem_Ch10 is
    begin
       Set_Corresponding_Spec (Withn, Ent);
       Set_Is_Implicit_With   (Withn);
-      Set_Library_Unit       (Withn, Parent (Unit_Declaration_Node (Ent)));
+      Set_Withed_Lib_Unit    (Withn, Parent (Unit_Declaration_Node (Ent)));
       Set_Parent_With        (Withn);
 
       --  If the unit is a [generic] package or subprogram declaration
@@ -3900,7 +3902,7 @@ package body Sem_Ch10 is
       begin
          Set_Corresponding_Spec (Withn, P_Name);
          Set_Is_Implicit_With   (Withn);
-         Set_Library_Unit       (Withn, P);
+         Set_Withed_Lib_Unit    (Withn, P);
          Set_Parent_With        (Withn);
 
          --  Node is placed at the beginning of the context items, so that
@@ -4041,18 +4043,19 @@ package body Sem_Ch10 is
 
             elsif Nkind (Decl_Node) = N_Subprogram_Body
               and then not Acts_As_Spec (Parent (Decl_Node))
-              and then Is_Child_Spec (Unit (Library_Unit (Parent (Decl_Node))))
+              and then
+                Is_Child_Spec (Unit (Subunit_Parent (Parent (Decl_Node))))
             then
                Implicit_With_On_Parent
-                 (Unit (Library_Unit (Parent (Decl_Node))), N);
+                 (Unit (Subunit_Parent (Parent (Decl_Node))), N);
             end if;
 
             --  Check license conditions unless this is a dummy unit
 
-            if Sloc (Library_Unit (Item)) /= No_Location then
+            if Sloc (Withed_Lib_Unit (Item)) /= No_Location then
                License_Check : declare
                   Withu : constant Unit_Number_Type :=
-                            Get_Source_Unit (Library_Unit (Item));
+                            Get_Source_Unit (Withed_Lib_Unit (Item));
                   Withl : constant License_Type :=
                             License (Source_Index (Withu));
                   Unitl : constant License_Type :=
@@ -4147,18 +4150,18 @@ package body Sem_Ch10 is
         or else (Nkind (Lib_Unit) = N_Subprogram_Body
                   and then not Acts_As_Spec (N))
       then
-         Install_Context (Library_Unit (N), Chain);
+         Install_Context (Spec_Lib_Unit (N), Chain);
 
          --  Only install private with-clauses of a spec that comes from
          --  source, excluding specs created for a subprogram body that is
          --  a child unit.
 
-         if Comes_From_Source (Library_Unit (N)) then
+         if Comes_From_Source (Spec_Lib_Unit (N)) then
             Install_Private_With_Clauses
-              (Defining_Entity (Unit (Library_Unit (N))));
+              (Defining_Entity (Unit (Spec_Lib_Unit (N))));
          end if;
 
-         if Is_Child_Spec (Unit (Library_Unit (N))) then
+         if Is_Child_Spec (Unit (Spec_Lib_Unit (N))) then
 
             --  If the unit is the body of a public child unit, the private
             --  declarations of the parent must be made visible. If the child
@@ -4174,7 +4177,7 @@ package body Sem_Ch10 is
                P_Name   : Entity_Id;
 
             begin
-               Lib_Spec := Unit (Library_Unit (N));
+               Lib_Spec := Unit (Spec_Lib_Unit (N));
                while Is_Child_Spec (Lib_Spec) loop
                   P      := Unit (Parent_Spec (Lib_Spec));
                   P_Name := Defining_Entity (P);
@@ -4194,7 +4197,7 @@ package body Sem_Ch10 is
 
          --  For a package body, children in context are immediately visible
 
-         Install_Siblings (Defining_Entity (Unit (Library_Unit (N))), N);
+         Install_Siblings (Defining_Entity (Unit (Spec_Lib_Unit (N))), N);
       end if;
 
       if Nkind (Lib_Unit) in N_Generic_Package_Declaration
@@ -4269,7 +4272,7 @@ package body Sem_Ch10 is
 
          --  Protect the frontend against previous critical errors
 
-         case Nkind (Unit (Library_Unit (W))) is
+         case Nkind (Unit (Withed_Lib_Unit (W))) is
             when N_Generic_Package_Declaration
                | N_Generic_Subprogram_Declaration
                | N_Package_Declaration
@@ -4283,7 +4286,8 @@ package body Sem_Ch10 is
 
          --  Check "use + renamings"
 
-         WEnt := Defining_Unit_Name (Specification (Unit (Library_Unit (W))));
+         WEnt :=
+           Defining_Unit_Name (Specification (Unit (Withed_Lib_Unit (W))));
          Spec := Specification (Unit (P));
 
          Item := First (Visible_Declarations (Spec));
@@ -4347,13 +4351,13 @@ package body Sem_Ch10 is
       begin
          --  Compilation unit of the parent of the withed library unit
 
-         Child_Parent := Library_Unit (Item);
+         Child_Parent := Withed_Lib_Unit (Item);
 
          --  If the child unit is a public child, then locate its nearest
          --  private ancestor, if any, then Child_Parent will then be set to
          --  the parent of that ancestor.
 
-         if not Private_Present (Library_Unit (Item)) then
+         if not Private_Present (Withed_Lib_Unit (Item)) then
             while Present (Child_Parent)
               and then not Private_Present (Child_Parent)
             loop
@@ -4433,12 +4437,13 @@ package body Sem_Ch10 is
 
          begin
             --  A limited with_clause cannot appear in the same context_clause
-            --  as a nonlimited with_clause which mentions the same library.
+            --  as a nonlimited with_clause which mentions the same library
+            --  unit.
 
             Item := First (Context_Items (Comp_Unit));
             while Present (Item) loop
                if Nkind (Item) = N_With_Clause
-                 and then Library_Unit (Item) = Library_Unit (W)
+                 and then Withed_Lib_Unit (Item) = Withed_Lib_Unit (W)
                then
                   return True;
                end if;
@@ -4488,7 +4493,7 @@ package body Sem_Ch10 is
             return;
          end if;
 
-         Set_Library_Unit (Withn, Cunit (Unum));
+         Set_Withed_Lib_Unit (Withn, Cunit (Unum));
          Set_Corresponding_Spec
            (Withn, Specification (Unit (Cunit (Unum))));
 
@@ -4542,11 +4547,11 @@ package body Sem_Ch10 is
             --  the private clause is installed before analyzing the private
             --  part of the current unit.
 
-            if Library_Unit (Item) /= Cunit (Current_Sem_Unit)
+            if Withed_Lib_Unit (Item) /= Cunit (Current_Sem_Unit)
               and then not Limited_View_Installed (Item)
               and then
                 not Is_Ancestor_Unit
-                      (Library_Unit (Item), Cunit (Current_Sem_Unit))
+                      (Withed_Lib_Unit (Item), Cunit (Current_Sem_Unit))
             then
                if not Private_Present (Item)
                  or else Private_Present (N)
@@ -4785,7 +4790,7 @@ package body Sem_Ch10 is
                if Limited_Present (Item) then
                   if not Limited_View_Installed (Item)
                     and then
-                      not Is_Ancestor_Unit (Library_Unit (Item),
+                      not Is_Ancestor_Unit (Withed_Lib_Unit (Item),
                                             Cunit (Current_Sem_Unit))
                   then
                      Install_Limited_With_Clause (Item);
@@ -4960,7 +4965,7 @@ package body Sem_Ch10 is
    ---------------------------------
 
    procedure Install_Limited_With_Clause (N : Node_Id) is
-      P_Unit           : constant Entity_Id := Unit (Library_Unit (N));
+      P_Unit           : constant Entity_Id := Unit (Withed_Lib_Unit (N));
       E                : Entity_Id;
       P                : Entity_Id;
       Is_Child_Package : Boolean := False;
@@ -5100,7 +5105,7 @@ package body Sem_Ch10 is
               and then Nkind (Decl) = N_Pragma
             loop
                if Get_Pragma_Id (Decl) = Pragma_Elaborate_Body then
-                  Set_Body_Required (Library_Unit (N));
+                  Set_Body_Required (Withed_Lib_Unit (N));
                   return;
                end if;
 
@@ -5196,7 +5201,7 @@ package body Sem_Ch10 is
                   --  If no completion, this is a TAT, and a body is needed
 
                   if No (Decl) then
-                     Set_Body_Required (Library_Unit (N));
+                     Set_Body_Required (Withed_Lib_Unit (N));
                      return;
                   end if;
 
@@ -5228,7 +5233,7 @@ package body Sem_Ch10 is
                         null;
 
                      else
-                        Set_Body_Required (Library_Unit (N));
+                        Set_Body_Required (Withed_Lib_Unit (N));
                         return;
                      end if;
 
@@ -5452,7 +5457,7 @@ package body Sem_Ch10 is
 
             if Is_Child_Unit
               (Defining_Entity
-                 (Unit (Library_Unit (Cunit (Current_Sem_Unit)))))
+                 (Unit (Spec_Lib_Unit (Cunit (Current_Sem_Unit)))))
             then
                return;
             end if;
@@ -5822,7 +5827,7 @@ package body Sem_Ch10 is
 
                Set_Is_Visible_Lib_Unit
                  (Related_Instance
-                   (Defining_Entity (Unit (Library_Unit (With_Clause)))));
+                   (Defining_Entity (Unit (Withed_Lib_Unit (With_Clause)))));
             end if;
 
             --  The parent unit may have been installed already, and may have
@@ -5973,7 +5978,7 @@ package body Sem_Ch10 is
       E2 : Entity_Id;
    begin
       if Nkind (Unit (U2)) in N_Package_Body | N_Subprogram_Body then
-         E2 := Defining_Entity (Unit (Library_Unit (U2)));
+         E2 := Defining_Entity (Unit (Spec_Lib_Unit (U2)));
          return Is_Ancestor_Package (E1, E2);
       else
          return False;
@@ -6051,17 +6056,17 @@ package body Sem_Ch10 is
          while Present (Item) loop
             if Nkind (Item) = N_With_Clause
               and then not Limited_Present (Item)
-              and then Nkind (Unit (Library_Unit (Item))) =
+              and then Nkind (Unit (Withed_Lib_Unit (Item))) =
                                                N_Package_Declaration
             then
                Decl :=
                  First (Visible_Declarations
-                         (Specification (Unit (Library_Unit (Item)))));
+                         (Specification (Unit (Withed_Lib_Unit (Item)))));
                while Present (Decl) loop
                   if Nkind (Decl) = N_Package_Renaming_Declaration
                     and then Entity (Name (Decl)) = P
                     and then not Is_Limited_Withed_Unit
-                                   (Lib_Unit => Library_Unit (Item),
+                                   (Lib_Unit => Withed_Lib_Unit (Item),
                                     Pkg_Ent  => Entity (Name (Decl)))
                   then
                      --  Generate the error message only if the current unit
@@ -6097,11 +6102,10 @@ package body Sem_Ch10 is
          --  If it is a body not acting as spec, follow pointer to the
          --  corresponding spec, otherwise follow pointer to parent spec.
 
-         if Present (Library_Unit (Aux_Unit))
-           and then Nkind (Unit (Aux_Unit)) in
-                      N_Package_Body | N_Subprogram_Body
+         if Nkind (Unit (Aux_Unit)) in N_Package_Body | N_Subprogram_Body
+           and then Present (Spec_Lib_Unit (Aux_Unit))
          then
-            if Aux_Unit = Library_Unit (Aux_Unit) then
+            if Aux_Unit = Spec_Lib_Unit (Aux_Unit) then
 
                --  Aux_Unit is a body that acts as a spec. Clause has
                --  already been flagged as illegal.
@@ -6109,7 +6113,7 @@ package body Sem_Ch10 is
                return False;
 
             else
-               Aux_Unit := Library_Unit (Aux_Unit);
+               Aux_Unit := Spec_Lib_Unit (Aux_Unit);
             end if;
 
          else
@@ -6186,7 +6190,7 @@ package body Sem_Ch10 is
 
    procedure Build_Limited_Views (N : Node_Id) is
       Unum        : constant Unit_Number_Type :=
-                      Get_Source_Unit (Library_Unit (N));
+                      Get_Source_Unit (Withed_Lib_Unit (N));
       Is_Analyzed : constant Boolean := Analyzed (Cunit (Unum));
 
       Shadow_Pack : Entity_Id;
@@ -6647,7 +6651,7 @@ package body Sem_Ch10 is
       --  declaration, not a subprogram declaration, generic declaration,
       --  generic instantiation, or package renaming declaration.
 
-      case Nkind (Unit (Library_Unit (N))) is
+      case Nkind (Unit (Withed_Lib_Unit (N))) is
          when N_Package_Declaration =>
             null;
 
@@ -6702,7 +6706,7 @@ package body Sem_Ch10 is
 
       --  Check if the chain is already built
 
-      Spec := Specification (Unit (Library_Unit (N)));
+      Spec := Specification (Unit (Withed_Lib_Unit (N)));
 
       if Limited_View_Installed (Spec) then
          return;
@@ -6766,7 +6770,7 @@ package body Sem_Ch10 is
             while Present (CI) loop
                if Nkind (CI) = N_With_Clause
                  and then not
-                   No_Elab_Code_All (Get_Source_Unit (Library_Unit (CI)))
+                   No_Elab_Code_All (Get_Source_Unit (Withed_Lib_Unit (CI)))
 
                  --  In GNATprove mode, some runtime units are implicitly
                  --  loaded to make their entities available for analysis. In
@@ -6947,7 +6951,7 @@ package body Sem_Ch10 is
               and then not Is_Implicit_With (Item)
             then
                Set_Is_Immediately_Visible
-                 (Defining_Entity (Unit (Library_Unit (Item))), False);
+                 (Defining_Entity (Unit (Withed_Lib_Unit (Item))), False);
             end if;
          end if;
 
@@ -6994,7 +6998,7 @@ package body Sem_Ch10 is
    --------------------------------
 
    procedure Remove_Limited_With_Clause (N : Node_Id) is
-      Pack_Decl : constant Entity_Id := Unit (Library_Unit (N));
+      Pack_Decl : constant Entity_Id := Unit (Withed_Lib_Unit (N));
 
    begin
       pragma Assert (Limited_View_Installed (N));
diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb
index 3ef4e698e81..f0c55aff6f4 100644
--- a/gcc/ada/sem_ch12.adb
+++ b/gcc/ada/sem_ch12.adb
@@ -5786,7 +5786,7 @@ package body Sem_Ch12 is
                end if;
 
                if Ekind (Curr_Unit) = E_Package_Body then
-                  Remove_Context (Library_Unit (Curr_Comp));
+                  Remove_Context (Spec_Lib_Unit (Curr_Comp));
                end if;
             end if;
 
@@ -6992,10 +6992,10 @@ package body Sem_Ch12 is
 
       Body_Cunit := Parent (N);
 
-      --  The two compilation unit nodes are linked by the Library_Unit field
+      --  Set spec/body links for the two compilation units
 
-      Set_Library_Unit (Decl_Cunit, Body_Cunit);
-      Set_Library_Unit (Body_Cunit, Decl_Cunit);
+      Set_Body_Lib_Unit (Decl_Cunit, Body_Cunit);
+      Set_Spec_Lib_Unit (Body_Cunit, Decl_Cunit);
 
       --  Preserve the private nature of the package if needed
 
@@ -9175,11 +9175,11 @@ package body Sem_Ch12 is
                --  stub in the original generic unit with the subunit, in order
                --  to preserve non-local references within.
 
-               --  Only the proper body needs to be copied. Library_Unit and
-               --  context clause are simply inherited by the generic copy.
-               --  Note that the copy (which may be recursive if there are
-               --  nested subunits) must be done first, before attaching it to
-               --  the enclosing generic.
+               --  Only the proper body needs to be copied. The context clause
+               --  and Spec_Or_Body_Lib_Unit are simply inherited by the
+               --  generic copy. Note that the copy (which may be recursive
+               --  if there are nested subunits) must be done first, before
+               --  attaching it to the enclosing generic.
 
                New_Body :=
                  Copy_Generic_Node
@@ -9198,7 +9198,7 @@ package body Sem_Ch12 is
                --  copy, which does not have stubs any longer.
 
                Set_Proper_Body (Unit (Subunit), New_Body);
-               Set_Library_Unit (New_N, Subunit);
+               Set_Stub_Subunit (New_N, Subunit);
                Inherit_Context (Unit (Subunit), N);
             end;
 
@@ -9213,17 +9213,17 @@ package body Sem_Ch12 is
 
          <<Subunit_Not_Found>> null;
 
-      --  If the node is a compilation unit, it is the subunit of a stub, which
-      --  has been loaded already (see code below). In this case, the library
-      --  unit field of N points to the parent unit (which is a compilation
-      --  unit) and need not (and cannot) be copied.
+      --  If the node is a compilation unit, it is the subunit of a stub that
+      --  has already been loaded. The parent unit is a compilation unit and
+      --  need not (and cannot) be copied.
 
-      --  When the proper body of the stub is analyzed, the library_unit link
-      --  is used to establish the proper context (see sem_ch10).
+      --  When the proper body of the stub is analyzed, the Subunit_Parent
+      --  field is used to establish the proper context (see Sem_Ch10).
 
       --  The other fields of a compilation unit are copied as usual
 
       elsif Nkind (N) = N_Compilation_Unit then
+         pragma Assert (Unit (N) in N_Subunit_Id);
 
          --  This code can only be executed when not instantiating, because in
          --  the copy made for an instantiation, the compilation unit node has
@@ -10155,7 +10155,7 @@ package body Sem_Ch12 is
          if Nkind (B) = N_Package_Body then
             Id := Corresponding_Spec (B);
          else pragma Assert (Nkind (B) = N_Package_Body_Stub);
-            Id := Corresponding_Spec (Proper_Body (Unit (Library_Unit (B))));
+            Id := Corresponding_Spec (Proper_Body (Unit (Stub_Subunit (B))));
          end if;
 
          Ensure_Freeze_Node (Id);
@@ -10265,7 +10265,7 @@ package body Sem_Ch12 is
 
          begin
             if Nkind (Enc_N) = N_Package_Body_Stub then
-               Enclosing_Body := Proper_Body (Unit (Library_Unit (Enc_N)));
+               Enclosing_Body := Proper_Body (Unit (Stub_Subunit (Enc_N)));
             else
                Enclosing_Body := Enc_N;
             end if;
@@ -10648,7 +10648,7 @@ package body Sem_Ch12 is
          Item := First (Context_Items (Parent (Gen_Decl)));
          while Present (Item) loop
             if Nkind (Item) = N_With_Clause then
-               Lib_Unit := Library_Unit (Item);
+               Lib_Unit := Withed_Lib_Unit (Item);
 
                --  Take care to prevent direct cyclic with's
 
@@ -10660,7 +10660,7 @@ package body Sem_Ch12 is
                   OK := True;
                   while Present (Clause) loop
                      if Nkind (Clause) = N_With_Clause
-                       and then Library_Unit (Clause) = Lib_Unit
+                       and then Withed_Lib_Unit (Clause) = Lib_Unit
                      then
                         OK := False;
                         exit;
@@ -10892,7 +10892,7 @@ package body Sem_Ch12 is
                 not In_Same_Source_Unit (Generic_Parent (Par_Inst), Inst)
             then
                while Present (Decl) loop
-                  if ((Nkind (Decl) in N_Unit_Body
+                  if ((Nkind (Decl) in N_Lib_Unit_Body
                         or else
                        Nkind (Decl) in N_Body_Stub)
                       and then Comes_From_Source (Decl))
@@ -15360,10 +15360,10 @@ package body Sem_Ch12 is
 
       return
         Current_Unit = Cunit (Main_Unit)
-          or else Current_Unit = Library_Unit (Cunit (Main_Unit))
+          or else Current_Unit = Other_Comp_Unit (Cunit (Main_Unit))
           or else (Present (Current_Unit)
-                    and then Present (Library_Unit (Current_Unit))
-                    and then Is_In_Main_Unit (Library_Unit (Current_Unit)));
+                    and then Present (Other_Comp_Unit (Current_Unit))
+                    and then Is_In_Main_Unit (Other_Comp_Unit (Current_Unit)));
    end Is_In_Main_Unit;
 
    ----------------------------
diff --git a/gcc/ada/sem_ch7.adb b/gcc/ada/sem_ch7.adb
index 07a88fee0ec..ff64744727a 100644
--- a/gcc/ada/sem_ch7.adb
+++ b/gcc/ada/sem_ch7.adb
@@ -1406,7 +1406,7 @@ package body Sem_Ch7 is
 
       begin
          if Id = Cunit_Entity (Main_Unit)
-           or else Parent (Decl) = Library_Unit (Cunit (Main_Unit))
+           or else Parent (Decl) = Other_Comp_Unit (Cunit (Main_Unit))
          then
             Generate_Reference (Id, Scope (Id), 'k', False);
 
@@ -1422,7 +1422,7 @@ package body Sem_Ch7 is
 
             begin
                if Nkind (Main_Spec) = N_Package_Body then
-                  Main_Spec := Unit (Library_Unit (Cunit (Main_Unit)));
+                  Main_Spec := Unit (Other_Comp_Unit (Cunit (Main_Unit)));
                end if;
 
                U := Parent_Spec (Main_Spec);
diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb
index 0c25c95c80e..2007db368ed 100644
--- a/gcc/ada/sem_ch8.adb
+++ b/gcc/ada/sem_ch8.adb
@@ -9998,7 +9998,8 @@ package body Sem_Ch8 is
                or else (Nkind (The_Unit) = N_Subprogram_Body
                          and then not Acts_As_Spec (Cunit (Current_Sem_Unit))))
          then
-            With_Sys := Find_System (Library_Unit (Cunit (Current_Sem_Unit)));
+            With_Sys :=
+              Find_System (Spec_Or_Body_Lib_Unit (Cunit (Current_Sem_Unit)));
          end if;
 
          if No (With_Sys) and then Present (N) then
@@ -10055,7 +10056,7 @@ package body Sem_Ch8 is
             Set_Corresponding_Spec (Withn, System_Aux_Id);
             Set_First_Name         (Withn);
             Set_Is_Implicit_With   (Withn);
-            Set_Library_Unit       (Withn, Cunit (Unum));
+            Set_Withed_Lib_Unit    (Withn, Cunit (Unum));
 
             Insert_After (With_Sys, Withn);
             Mark_Rewrite_Insertion (Withn);
diff --git a/gcc/ada/sem_elab.adb b/gcc/ada/sem_elab.adb
index 23cbe1ac50d..a0431a2cc44 100644
--- a/gcc/ada/sem_elab.adb
+++ b/gcc/ada/sem_elab.adb
@@ -8461,9 +8461,9 @@ package body Sem_Elab is
             Set_Context_Items (Main_Cunit, Items);
          end if;
 
-         --  Locate the with clause for the unit. Note that there may not be a
-         --  clause if the unit is visible through a subunit-body, body-spec,
-         --  or spec-parent relationship.
+         --  Locate the with clause for the unit. Note that there might not be
+         --  a with clause if the unit is visible through a subunit-body,
+         --  body-spec, or spec-parent relationship.
 
          Clause :=
            Find_With_Clause
@@ -8475,16 +8475,16 @@ package body Sem_Elab is
 
          --  Note that adding implicit with clauses is safe because analysis,
          --  resolution, and expansion have already taken place and it is not
-         --  possible to interfere with visibility.
+         --  possible to interfere with visibility. Note that this implicit
+         --  with clause can point at (for example) a package body, which
+         --  is not the case for normal with clauses.
 
          if No (Clause) then
             Clause :=
               Make_With_Clause (Loc,
                 Name => New_Occurrence_Of (Unit_Id, Loc));
-
             Set_Is_Implicit_With (Clause);
-            Set_Library_Unit (Clause, Unit_Cunit);
-
+            Set_Withed_Lib_Unit (Clause, Unit_Cunit);
             Append_To (Items, Clause);
          end if;
 
@@ -9887,7 +9887,7 @@ package body Sem_Elab is
             elsif Nkind (Item) = N_Package_Body_Stub
               and then Chars (Defining_Entity (Item)) = Spec_Nam
             then
-               Lib_Unit := Library_Unit (Item);
+               Lib_Unit := Stub_Subunit (Item);
 
                --  The corresponding subunit was previously loaded
 
@@ -16374,6 +16374,8 @@ package body Sem_Elab is
       --  This procedure is called when the elaborate indication must be
       --  applied to a unit not in the context of the referencing unit. The
       --  unit gets added to the context as an implicit with.
+      --  Note that we can be with-ing (for example) a package body, which
+      --  is not the case for normal with clauses.
 
       function In_Withs_Of (UEs : Entity_Id) return Boolean;
       --  UEs is the spec entity of a unit. If the unit to be marked is
@@ -16394,7 +16396,7 @@ package body Sem_Elab is
 
       begin
          Set_Is_Implicit_With (CW);
-         Set_Library_Unit (CW, Library_Unit (Itm));
+         Set_Withed_Lib_Unit (CW, Withed_Lib_Unit (Itm));
 
          --  Set elaborate all desirable on copy and then append the copy to
          --  the list of body with's and we are done.
@@ -16417,7 +16419,7 @@ package body Sem_Elab is
          while Present (Itm) loop
             if Nkind (Itm) = N_With_Clause then
                Ent :=
-                 Cunit_Entity (Get_Cunit_Unit_Number (Library_Unit (Itm)));
+                 Cunit_Entity (Get_Cunit_Unit_Number (Withed_Lib_Unit (Itm)));
 
                if U = Ent then
                   return True;
@@ -16465,7 +16467,8 @@ package body Sem_Elab is
       Itm := First (CI);
       while Present (Itm) loop
          if Nkind (Itm) = N_With_Clause then
-            Ent := Cunit_Entity (Get_Cunit_Unit_Number (Library_Unit (Itm)));
+            Ent :=
+              Cunit_Entity (Get_Cunit_Unit_Number (Withed_Lib_Unit (Itm)));
 
             --  If we find it, then mark elaborate all desirable and return
 
@@ -19055,8 +19058,8 @@ package body Sem_Elab is
             elsif Nkind (Nod) = N_Package_Body_Stub
               and then Chars (Defining_Identifier (Nod)) = Chars (E)
             then
-               if Present (Library_Unit (Nod)) then
-                  return Unit (Library_Unit (Nod));
+               if Present (Stub_Subunit (Nod)) then
+                  return Unit (Stub_Subunit (Nod));
 
                else
                   return Load_Package_Body (Get_Unit_Name (Nod));
@@ -19756,7 +19759,7 @@ package body Sem_Elab is
                   --  in each N_Compilation_Unit node, but that would involve
                   --  rearranging N_Compilation_Unit_Aux to make room.
 
-                  Helper (Get_Cunit_Unit_Number (Library_Unit (Item)));
+                  Helper (Get_Cunit_Unit_Number (Withed_Lib_Unit (Item)));
 
                   if Result then
                      return;
diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb
index eb11ceb7044..d877251110e 100644
--- a/gcc/ada/sem_prag.adb
+++ b/gcc/ada/sem_prag.adb
@@ -5651,8 +5651,7 @@ package body Sem_Prag is
                   then
                      Set_Has_Pragma_Unreferenced
                        (Cunit_Entity
-                         (Get_Source_Unit
-                           (Library_Unit (Citem))));
+                         (Get_Source_Unit (Withed_Lib_Unit (Citem))));
                      Set_Elab_Unit_Name (Arg_Expr, Name (Citem));
                      exit;
                   end if;
@@ -8308,21 +8307,21 @@ package body Sem_Prag is
             Decl : Node_Id;
             Err  : Boolean;
 
-            function Same_Convention (Decl : Node_Id) return Boolean;
+            function Matching_Convention (Decl : Node_Id) return Boolean;
             --  Decl is a pragma node. This function returns True if this
             --  pragma has a first argument that is an identifier with a
             --  Chars field corresponding to the Convention_Id C.
 
-            function Same_Name (Decl : Node_Id) return Boolean;
+            function Matching_Name (Decl : Node_Id) return Boolean;
             --  Decl is a pragma node. This function returns True if this
             --  pragma has a second argument that is an identifier with a
             --  Chars field that matches the Chars of the current subprogram.
 
-            ---------------------
-            -- Same_Convention --
-            ---------------------
+            -------------------------
+            -- Matching_Convention --
+            -------------------------
 
-            function Same_Convention (Decl : Node_Id) return Boolean is
+            function Matching_Convention (Decl : Node_Id) return Boolean is
                Arg1 : constant Node_Id :=
                         First (Pragma_Argument_Associations (Decl));
 
@@ -8341,13 +8340,13 @@ package body Sem_Prag is
                end if;
 
                return False;
-            end Same_Convention;
+            end Matching_Convention;
 
-            ---------------
-            -- Same_Name --
-            ---------------
+            -------------------
+            -- Matching_Name --
+            -------------------
 
-            function Same_Name (Decl : Node_Id) return Boolean is
+            function Matching_Name (Decl : Node_Id) return Boolean is
                Arg1 : constant Node_Id :=
                         First (Pragma_Argument_Associations (Decl));
                Arg2 : Node_Id;
@@ -8374,7 +8373,7 @@ package body Sem_Prag is
                end;
 
                return False;
-            end Same_Name;
+            end Matching_Name;
 
          --  Start of processing for Diagnose_Multiple_Pragmas
 
@@ -8400,7 +8399,7 @@ package body Sem_Prag is
                   --  Look for pragma with same name as us
 
                   if Nkind (Decl) = N_Pragma
-                    and then Same_Name (Decl)
+                    and then Matching_Name (Decl)
                   then
                      --  Give error if same as our pragma or Export/Convention
 
@@ -8421,7 +8420,7 @@ package body Sem_Prag is
                         --  they specify the same convention. If so, all OK,
                         --  and set special flags to stop other messages
 
-                        if Same_Convention (Decl) then
+                        if Matching_Convention (Decl) then
                            Set_Import_Interface_Present (N);
                            Set_Import_Interface_Present (Decl);
                            Err := False;
diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
index 1a512219e59..794bdedc490 100644
--- a/gcc/ada/sem_util.adb
+++ b/gcc/ada/sem_util.adb
@@ -7506,7 +7506,7 @@ package body Sem_Util is
       while Present (Encl_Unit)
         and then Nkind (Unit (Encl_Unit)) = N_Subunit
       loop
-         Encl_Unit := Library_Unit (Encl_Unit);
+         Encl_Unit := Subunit_Parent (Encl_Unit);
       end loop;
 
       pragma Assert (Nkind (Encl_Unit) = N_Compilation_Unit);
@@ -10059,7 +10059,7 @@ package body Sem_Util is
 
    function Get_Body_From_Stub (N : Node_Id) return Node_Id is
    begin
-      return Proper_Body (Unit (Library_Unit (N)));
+      return Proper_Body (Unit (Stub_Subunit (N)));
    end Get_Body_From_Stub;
 
    ---------------------
@@ -20170,7 +20170,7 @@ package body Sem_Util is
       return Is_RCI_Pkg_Decl_Cunit (Cunit)
         or else
          (Nkind (Unit (Cunit)) = N_Package_Body
-           and then Is_RCI_Pkg_Decl_Cunit (Library_Unit (Cunit)));
+           and then Is_RCI_Pkg_Decl_Cunit (Spec_Lib_Unit (Cunit)));
    end Is_RCI_Pkg_Spec_Or_Body;
 
    -----------------------------------------
@@ -27020,13 +27020,13 @@ package body Sem_Util is
       K2 : constant Node_Kind := Nkind (N2);
 
    begin
-      if (K1 = N_Identifier or else K1 = N_Defining_Identifier)
-        and then (K2 = N_Identifier or else K2 = N_Defining_Identifier)
+      if K1 in N_Identifier | N_Defining_Identifier
+        and then K2 in N_Identifier | N_Defining_Identifier
       then
          return Chars (N1) = Chars (N2);
 
-      elsif (K1 = N_Selected_Component or else K1 = N_Expanded_Name)
-        and then (K2 = N_Selected_Component or else K2 = N_Expanded_Name)
+      elsif K1 in N_Selected_Component | N_Expanded_Name
+        and then K2 in N_Selected_Component | N_Expanded_Name
       then
          return Same_Name (Selector_Name (N1), Selector_Name (N2))
            and then Same_Name (Prefix (N1), Prefix (N2));
@@ -29046,7 +29046,7 @@ package body Sem_Util is
          Clause := First (Context_Items (Comp_Unit));
          while Present (Clause) loop
             if Nkind (Clause) = N_With_Clause then
-               if Library_Unit (Clause) = U then
+               if Withed_Lib_Unit (Clause) = U then
                   return True;
 
                --  The with_clause may denote a renaming of the unit we are
@@ -29084,7 +29084,7 @@ package body Sem_Util is
           (Nkind (Unit (Curr)) = N_Subprogram_Body
             and then not Acts_As_Spec (Unit (Curr)))
       then
-         if Unit_In_Context (Library_Unit (Curr)) then
+         if Unit_In_Context (Spec_Lib_Unit (Curr)) then
             return True;
          end if;
       end if;
@@ -29092,10 +29092,10 @@ package body Sem_Util is
       --  If the spec is a child unit, examine the parents
 
       if Is_Child_Unit (Curr_Entity) then
-         if Nkind (Unit (Curr)) in N_Unit_Body then
+         if Nkind (Unit (Curr)) in N_Lib_Unit_Body then
             return
               Unit_In_Parent_Context
-                (Parent_Spec (Unit (Library_Unit (Curr))));
+                (Parent_Spec (Unit (Spec_Lib_Unit (Curr))));
          else
             return Unit_In_Parent_Context (Parent_Spec (Unit (Curr)));
          end if;
diff --git a/gcc/ada/sem_util.ads b/gcc/ada/sem_util.ads
index 289d601ec88..2f1d2574d37 100644
--- a/gcc/ada/sem_util.ads
+++ b/gcc/ada/sem_util.ads
@@ -3065,8 +3065,8 @@ package Sem_Util is
    --  capture actual value information, but we can capture conditional tests.
 
    function Same_Name (N1, N2 : Node_Id) return Boolean;
-   --  Determine if two (possibly expanded) names are the same name. This is
-   --  a purely syntactic test, and N1 and N2 need not be analyzed.
+   --  True if two identifiers or expanded names are the same name. This
+   --  is a purely syntactic test, and N1 and N2 need not be analyzed.
 
    function Same_Object (Node1, Node2 : Node_Id) return Boolean;
    --  Determine if Node1 and Node2 are known to designate the same object.
diff --git a/gcc/ada/sinfo-utils.adb b/gcc/ada/sinfo-utils.adb
index 23485aa2877..666024284ba 100644
--- a/gcc/ada/sinfo-utils.adb
+++ b/gcc/ada/sinfo-utils.adb
@@ -31,6 +31,145 @@ with Sinput; use Sinput;
 
 package body Sinfo.Utils is
 
+   function Spec_Lib_Unit
+     (N : N_Compilation_Unit_Id) return Opt_N_Compilation_Unit_Id
+   is
+      pragma Assert (Unit (N) in N_Lib_Unit_Body_Id);
+   begin
+      return Val : constant Opt_N_Compilation_Unit_Id :=
+        Spec_Or_Body_Lib_Unit (N)
+      do
+         pragma Assert
+           (if Present (Val) then
+             Unit (Val) in N_Lib_Unit_Declaration_Id
+              | N_Lib_Unit_Renaming_Declaration_Id -- only in case of error
+             or else (N = Val
+                      and then Unit (N) in N_Subprogram_Body_Id
+                      and then Acts_As_Spec (N)));
+      end return;
+   end Spec_Lib_Unit;
+
+   procedure Set_Spec_Lib_Unit (N, Val : N_Compilation_Unit_Id) is
+      pragma Assert (Unit (N) in N_Lib_Unit_Body_Id);
+      pragma Assert
+        (Unit (Val) in N_Lib_Unit_Declaration_Id
+          | N_Lib_Unit_Renaming_Declaration_Id -- only in case of error
+         or else (N = Val
+                  and then Unit (N) in N_Subprogram_Body_Id
+                  and then Acts_As_Spec (N)));
+   begin
+      Set_Library_Unit (N, Val);
+   end Set_Spec_Lib_Unit;
+
+   function Body_Lib_Unit
+     (N : N_Compilation_Unit_Id) return Opt_N_Compilation_Unit_Id
+   is
+      pragma Assert
+        (Unit (N) in N_Lib_Unit_Declaration_Id
+          | N_Lib_Unit_Renaming_Declaration_Id); -- only in case of error
+   begin
+      return Val : constant Opt_N_Compilation_Unit_Id :=
+        Spec_Or_Body_Lib_Unit (N)
+      do
+         pragma Assert
+           (if Present (Val) then Unit (Val) in N_Lib_Unit_Body_Id);
+      end return;
+   end Body_Lib_Unit;
+
+   procedure Set_Body_Lib_Unit (N, Val : N_Compilation_Unit_Id) is
+      pragma Assert
+        (Unit (N) in N_Lib_Unit_Declaration_Id
+          | N_Lib_Unit_Renaming_Declaration_Id); -- only in case of error
+      pragma Assert (Unit (Val) in N_Lib_Unit_Body_Id);
+   begin
+      Set_Library_Unit (N, Val);
+   end Set_Body_Lib_Unit;
+
+   function Spec_Or_Body_Lib_Unit
+     (N : N_Compilation_Unit_Id) return Opt_N_Compilation_Unit_Id
+   is
+      pragma Assert
+        (Unit (N) in
+          N_Lib_Unit_Declaration_Id | N_Lib_Unit_Body_Id
+          | N_Lib_Unit_Renaming_Declaration_Id);
+   begin
+      return Other_Comp_Unit (N);
+   end Spec_Or_Body_Lib_Unit;
+
+   function Subunit_Parent
+     (N : N_Compilation_Unit_Id) return Opt_N_Compilation_Unit_Id
+   is
+      pragma Assert (Unit (N) in N_Subunit_Id);
+   begin
+      return Val : constant Opt_N_Compilation_Unit_Id := Other_Comp_Unit (N) do
+         pragma Assert
+           (if Present (Val) then
+             Unit (Val) in N_Lib_Unit_Body_Id | N_Subunit_Id);
+      end return;
+   end Subunit_Parent;
+
+   procedure Set_Subunit_Parent (N, Val : N_Compilation_Unit_Id) is
+      pragma Assert (Unit (N) in N_Subunit_Id);
+      pragma Assert (Unit (Val) in N_Lib_Unit_Body_Id | N_Subunit_Id);
+   begin
+      Set_Library_Unit (N, Val);
+   end Set_Subunit_Parent;
+
+   function Other_Comp_Unit
+     (N : N_Compilation_Unit_Id) return Opt_N_Compilation_Unit_Id
+   is
+      pragma Assert (N in N_Compilation_Unit_Id);
+      Val : constant Opt_N_Compilation_Unit_Id := Library_Unit (N);
+   begin
+      if Unit (N) in N_Subunit_Id then
+         pragma Assert
+           (if Present (Val) then
+             Unit (Val) in N_Lib_Unit_Body_Id | N_Subunit_Id);
+      end if;
+
+      return Library_Unit (N);
+   end Other_Comp_Unit;
+
+   function Stub_Subunit
+     (N : N_Body_Stub_Id) return Opt_N_Compilation_Unit_Id is
+   begin
+      return Val : constant Opt_N_Compilation_Unit_Id := Library_Unit (N) do
+         pragma Assert (if Present (Val) then Unit (Val) in N_Subunit_Id);
+      end return;
+   end Stub_Subunit;
+
+   procedure Set_Stub_Subunit
+     (N : N_Body_Stub_Id; Val : N_Compilation_Unit_Id)
+   is
+      pragma Assert (Unit (Val) in N_Subunit_Id);
+   begin
+      Set_Library_Unit (N, Val);
+   end Set_Stub_Subunit;
+
+   function Withed_Lib_Unit
+     (N : N_With_Clause_Id) return Opt_N_Compilation_Unit_Id is
+   begin
+      return Val : constant Opt_N_Compilation_Unit_Id := Library_Unit (N) do
+         pragma Assert
+           (if Present (Val) then
+             Unit (Val) in N_Lib_Unit_Declaration_Id
+             | N_Lib_Unit_Renaming_Declaration_Id
+             | N_Package_Body_Id | N_Subprogram_Body_Id
+             | N_Null_Statement_Id); -- for ignored ghost code
+      end return;
+   end Withed_Lib_Unit;
+
+   procedure Set_Withed_Lib_Unit
+     (N : N_With_Clause_Id; Val : N_Compilation_Unit_Id)
+   is
+      pragma Assert
+        (Unit (Val) in N_Lib_Unit_Declaration_Id
+         | N_Lib_Unit_Renaming_Declaration_Id
+         | N_Package_Body_Id | N_Subprogram_Body_Id);
+   begin
+      Set_Library_Unit (N, Val);
+   end Set_Withed_Lib_Unit;
+
    ---------------
    -- Debugging --
    ---------------
diff --git a/gcc/ada/sinfo-utils.ads b/gcc/ada/sinfo-utils.ads
index 9acb620848c..ebb96992802 100644
--- a/gcc/ada/sinfo-utils.ads
+++ b/gcc/ada/sinfo-utils.ads
@@ -27,6 +27,65 @@ with Sinfo.Nodes; use Sinfo.Nodes;
 
 package Sinfo.Utils is
 
+   --  We would like to get rid of the Library_Unit field, and replace it with
+   --  Other_Comp_Unit (on N_Compilation_Unit), Withed_Lib_Unit (on
+   --  N_With_Clause), and Subunit (on N_Body_Stub). Or we could split
+   --  Other_Comp_Unit into Spec_Lib_Unit, Body_Lib_Unit, Subunit_Parent.
+   --  However, gnat-llvm, codepeer, and spark are still using Library_Unit.
+   --  Therefore, we use the wrappers below.
+   --
+   --  The call site should always know whether it has an N_Compilation_Unit,
+   --  N_Body_Stub, or N_With_Clause. In the N_Compilation_Unit case, it should
+   --  also know whether it's looking for the spec of a body, the body of a
+   --  spec, or the parent of a subunit. Spec_Or_Body_Lib_Unit and
+   --  Other_Comp_Unit should be avoided when possible; these are for the
+   --  N_Compilation_Unit cases where the call site does NOT know what it's
+   --  looking for.
+
+   function Spec_Lib_Unit
+     (N : N_Compilation_Unit_Id) return Opt_N_Compilation_Unit_Id;
+   procedure Set_Spec_Lib_Unit (N, Val : N_Compilation_Unit_Id);
+   --  The spec compilation unit of a body compilation unit.
+   --  It can be an acts-as-spec subprogram body; in that case
+   --  Spec_Lib_Unit points to itself.
+
+   function Body_Lib_Unit
+     (N : N_Compilation_Unit_Id) return Opt_N_Compilation_Unit_Id;
+   procedure Set_Body_Lib_Unit (N, Val : N_Compilation_Unit_Id);
+   --  The body compilation unit of a spec compilation unit.
+   --  Empty if not present.
+
+   function Spec_Or_Body_Lib_Unit
+     (N : N_Compilation_Unit_Id) return Opt_N_Compilation_Unit_Id;
+   --  Same as Spec_Lib_Unit or Body_Lib_Unit, depending on whether
+   --  N is a body or spec. Used when we know N is a library unit
+   --  (not a subunit), but we don't know whether it's the spec
+   --  or the body.
+
+   function Subunit_Parent
+     (N : N_Compilation_Unit_Id) return Opt_N_Compilation_Unit_Id;
+   procedure Set_Subunit_Parent (N, Val : N_Compilation_Unit_Id);
+   --  The parent body of a subunit
+
+   function Other_Comp_Unit
+     (N : N_Compilation_Unit_Id) return Opt_N_Compilation_Unit_Id;
+   --  Same as Spec_Lib_Unit, Body_Lib_Unit, or Subunit_Parent,
+   --  as appropriate. Used when we don't know whether N is a
+   --  a library unit spec, library unit body, or subunit.
+
+   function Stub_Subunit (N : N_Body_Stub_Id) return Opt_N_Compilation_Unit_Id;
+   procedure Set_Stub_Subunit
+     (N : N_Body_Stub_Id; Val : N_Compilation_Unit_Id);
+   --  Subunit corresponding to a stub
+
+   function Withed_Lib_Unit
+     (N : N_With_Clause_Id) return Opt_N_Compilation_Unit_Id;
+   procedure Set_Withed_Lib_Unit
+     (N : N_With_Clause_Id; Val : N_Compilation_Unit_Id);
+   --  The compilation unit that a with clause refers to.
+   --  Note that the Sem_Elab creates with clauses that point to bodies
+   --  (including non-Acts_As_Spec bodies).
+
    -------------------------------
    -- Parent-related operations --
    -------------------------------
@@ -54,9 +113,9 @@ package Sinfo.Utils is
    -- Miscellaneous Tree Access Subprograms --
    -------------------------------------------
 
-   function First_Real_Statement -- ????
+   function First_Real_Statement -- ???
      (Ignored : N_Handled_Sequence_Of_Statements_Id) return Node_Id is (Empty);
-   --  The First_Real_Statement field is going away, but it is referenced in
+   --  The First_Real_Statement field has been removed, but it is referenced in
    --  codepeer and gnat-llvm. This is a temporary version, always returning
    --  Empty, to ease the transition.
 
diff --git a/gcc/ada/sinfo.ads b/gcc/ada/sinfo.ads
index 8b4c2e31959..47fd73a599a 100644
--- a/gcc/ada/sinfo.ads
+++ b/gcc/ada/sinfo.ads
@@ -1923,34 +1923,18 @@ package Sinfo is
    --    handler.
 
    --  Library_Unit
-   --    In a stub node, Library_Unit points to the compilation unit node of
-   --    the corresponding subunit.
+   --    Direct use of this field should be avoided; use the wrappers in
+   --    Sinfo.Utils instead.
    --
-   --    In a with clause node, Library_Unit points to the spec of the with'ed
-   --    unit.
+   --    This field is used to store the following:
    --
-   --    In a compilation unit node, the usage depends on the unit type:
+   --    In N_Compilation_Unit: Spec_Lib_Unit, Body_Lib_Unit, Subunit_Parent.
    --
-   --     For a library unit body, Library_Unit points to the compilation unit
-   --     node of the corresponding spec, unless it's a subprogram body with
-   --     Acts_As_Spec set, in which case it points to itself.
+   --    In N_Body_Stub: Stub_Subunit.
    --
-   --     For a spec, Library_Unit points to the compilation unit node of the
-   --     corresponding body, if present. The body will be present if the spec
-   --     is or contains generics that we needed to instantiate. Similarly, the
-   --     body will be present if we needed it for inlining purposes. Thus, if
-   --     we have a spec/body pair, both of which are present, they point to
-   --     each other via Library_Unit.
+   --    In N_With_Clause: Withed_Lib_Unit
    --
-   --     For a subunit, Library_Unit points to the compilation unit node of
-   --     the parent body.
-   --     ??? not (always) true, in (at least some, maybe all?) cases it points
-   --     to the corresponding spec for the parent body.
-   --
-   --    Note that this field is not used to hold the parent pointer for child
-   --    unit (which might in any case need to use it for some other purpose as
-   --    described above). Instead for a child unit, implicit with's are
-   --    generated for all parents.
+   --    See Sinfo.Utils for details.
 
    --  Local_Raise_Statements
    --    This field is present in exception handler nodes. It is set to
@@ -6553,7 +6537,7 @@ package Sinfo is
       --  | CONTEXT_CLAUSE SUBUNIT
 
       --  The N_Compilation_Unit node itself represents the above syntax.
-      --  However, there are two additional items not reflected in the above
+      --  However, there are additional items not reflected in the above
       --  syntax. First we have the global declarations that are added by the
       --  code generator. These are outer level declarations (so they cannot
       --  be represented as being inside the units). An example is the wrapper
@@ -6566,19 +6550,15 @@ package Sinfo is
       --  of elaboration of the library unit (notably the statement that sets
       --  the Boolean flag indicating that elaboration is complete).
 
-      --  The third item not reflected in the syntax is pragmas that appear
-      --  after the compilation unit. As always pragmas are a problem since
-      --  they are not part of the formal syntax, but can be stuck into the
-      --  source following a set of ad hoc rules, and we have to find an ad
-      --  hoc way of sticking them into the tree. For pragmas that appear
-      --  before the library unit, we just consider them to be part of the
-      --  context clause, and pragmas can appear in the Context_Items list
-      --  of the compilation unit. However, pragmas can also appear after
-      --  the library item.
+      --  Pragmas that appear after the compilation unit are not reflected
+      --  in the syntax. (Pragmas that appear before the library unit, are
+      --  considered part of the context clause. Pragmas can also appear in
+      --  the Context_Items list of the compilation unit.)
 
-      --  To deal with all these problems, we create an auxiliary node for
-      --  a compilation unit, referenced from the N_Compilation_Unit node,
-      --  that contains these items.
+      --  ???For historical reasons, the above information is stored in a
+      --  separate N_Compilation_Unit_Aux node associated with each
+      --  N_Compilation_Unit node. This information could be moved into
+      --  N_Compilation_Unit at this point.
 
       --  N_Compilation_Unit
       --  Sloc points to first token of defining unit name
@@ -6595,6 +6575,10 @@ package Sinfo is
       --  Context_Pending
       --  Has_No_Elaboration_Code
 
+      --  Note: The Unit field can be any of N_Lib_Unit_Declaration,
+      --  N_Lib_Unit_Body, N_Lib_Unit_Renaming_Declaration, N_Subunit,
+      --  or (in the case of ignored ghost code) N_Null_Statement.
+
       --  N_Compilation_Unit_Aux
       --  Sloc is a copy of the Sloc from the N_Compilation_Unit node
       --  Declarations (set to No_List if no global declarations)
@@ -6689,7 +6673,7 @@ package Sinfo is
       --  Private_Present set if with_clause has private keyword
       --  Limited_Present set if LIMITED is present
       --  Next_Implicit_With
-      --  Library_Unit
+      --  Library_Unit (i.e. Withed_Lib_Unit)
       --  Corresponding_Spec
       --  First_Name (set to True if first name or only one name)
       --  Last_Name (set to True if last name or only one name)
@@ -6748,7 +6732,7 @@ package Sinfo is
       --  Sloc points to FUNCTION or PROCEDURE
       --  Specification
       --  Corresponding_Spec_Of_Stub
-      --  Library_Unit points to the subunit
+      --  Library_Unit (i.e. Stub_Subunit)
       --  Corresponding_Body
 
       -------------------------------
@@ -6763,7 +6747,7 @@ package Sinfo is
       --  Sloc points to PACKAGE
       --  Defining_Identifier
       --  Corresponding_Spec_Of_Stub
-      --  Library_Unit points to the subunit
+      --  Library_Unit (i.e. Stub_Subunit)
       --  Corresponding_Body
 
       ----------------------------
@@ -6778,7 +6762,7 @@ package Sinfo is
       --  Sloc points to TASK
       --  Defining_Identifier
       --  Corresponding_Spec_Of_Stub
-      --  Library_Unit points to the subunit
+      --  Library_Unit (i.e. Stub_Subunit)
       --  Corresponding_Body
       --  At_End_Proc (set to Empty if no clean up procedure)
 
@@ -6796,7 +6780,7 @@ package Sinfo is
       --  Sloc points to PROTECTED
       --  Defining_Identifier
       --  Corresponding_Spec_Of_Stub
-      --  Library_Unit points to the subunit
+      --  Library_Unit (i.e. Stub_Subunit)
       --  Corresponding_Body
 
       ---------------------
-- 
2.43.0

Reply via email to