OSDN Git Service

* stor-layout.c (initialize_sizetypes): Set SIZETYPE earlier,
[pf3gnuchains/gcc-fork.git] / gcc / ada / binde.adb
index c17d718..d90c75e 100644 (file)
@@ -6,8 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---                                                                          --
---          Copyright (C) 1992-2001 Free Software Foundation, Inc.          --
+--          Copyright (C) 1992-2003 Free Software Foundation, Inc.          --
 --                                                                          --
 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
 -- terms of the  GNU General Public License as published  by the Free Soft- --
@@ -21,7 +20,7 @@
 -- MA 02111-1307, USA.                                                      --
 --                                                                          --
 -- GNAT was originally developed  by the GNAT team at  New York University. --
--- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). --
+-- Extensive contributions were provided by Ada Core Technologies Inc.      --
 --                                                                          --
 ------------------------------------------------------------------------------
 
@@ -29,6 +28,7 @@ with Binderr; use Binderr;
 with Butil;   use Butil;
 with Debug;   use Debug;
 with Fname;   use Fname;
+with Lib;     use Lib;
 with Namet;   use Namet;
 with Opt;     use Opt;
 with Output;  use Output;
@@ -766,11 +766,14 @@ package body Binde is
       for W in
         Units.Table (Before).First_With .. Units.Table (Before).Last_With
       loop
-         --  Skip if no ALI file for this with, happens with certain
+         --  Skip if this with is an interface to a stand-alone library.
+         --  Skip also if no ALI file for this with, happens with certain
          --  specialized generic files that do not get compiled.
 
-         if Withs.Table (W).Afile /= No_File then
-
+         if not Withs.Table (W).Interface
+           and then Withs.Table (W).Afile /= No_File
+           and then Generic_Separately_Compiled (Withs.Table (W).Sfile)
+         then
             Elab_All_Links
               (Unit_Id_Of (Withs.Table (W).Uname),
                After,
@@ -841,7 +844,7 @@ package body Binde is
 
          when Elab_Desirable =>
             Error_Msg_Output
-              ("     reason: Elaborate_All probably needed in unit &",
+              ("     reason: implicit Elaborate_All in unit &",
                Info => True);
 
             Error_Msg_Output
@@ -1004,100 +1007,113 @@ package body Binde is
       for U in Units.First .. Units.Last loop
          Cur_Unit := U;
 
-         --  If there is a body and a spec, then spec must be elaborated first
+         --  If this is not an interface to a stand-alone library and
+         --  there is a body and a spec, then spec must be elaborated first
          --  Note that the corresponding spec immediately follows the body
 
-         if Units.Table (U).Utype = Is_Body then
+         if not Units.Table (U).Interface
+           and then Units.Table (U).Utype = Is_Body
+         then
             Build_Link (Corresponding_Spec (U), U, Spec_First);
          end if;
 
-         --  Process WITH references for this unit ignoring generic units
+         --  If this unit is not an interface to a stand-alone library,
+         --  process WITH references for this unit ignoring generic units and
+         --  interfaces to stand-alone libraries.
 
-         for W in Units.Table (U).First_With .. Units.Table (U).Last_With loop
-            if Withs.Table (W).Sfile /= No_File then
+         if not Units.Table (U).Interface then
+            for
+              W in Units.Table (U).First_With .. Units.Table (U).Last_With
+            loop
+               if Withs.Table (W).Sfile /= No_File
+                 and then (not Withs.Table (W).Interface)
+               then
+                  --  Check for special case of withing a unit that does not
+                  --  exist any more. If the unit was completely missing we
+                  --  would already have detected this, but a nasty case arises
+                  --  when we have a subprogram body with no spec, and some
+                  --  obsolete unit with's a previous (now disappeared) spec.
+
+                  if Get_Name_Table_Info (Withs.Table (W).Uname) = 0 then
+                     Error_Msg_Name_1 := Units.Table (U).Sfile;
+                     Error_Msg_Name_2 := Withs.Table (W).Uname;
+                     Error_Msg ("% depends on & which no longer exists");
+                     goto Next_With;
+                  end if;
 
-               --  Check for special case of withing a unit that does not
-               --  exist any more. If the unit was completely missing we would
-               --  already have detected this, but a nasty case arises when we
-               --  have a subprogram body with no spec, and some obsolete unit
-               --  with's a previous (now disappeared) spec.
+                  Withed_Unit :=
+                    Unit_Id (Unit_Id_Of (Withs.Table (W).Uname));
 
-               if Get_Name_Table_Info (Withs.Table (W).Uname) = 0 then
-                  Error_Msg_Name_1 := Units.Table (U).Sfile;
-                  Error_Msg_Name_2 := Withs.Table (W).Uname;
-                  Error_Msg ("% depends on & which no longer exists");
-                  goto Next_With;
-               end if;
+                  --  Pragma Elaborate_All case, for this we use the recursive
+                  --  Elab_All_Links procedure to establish the links.
 
-               Withed_Unit :=
-                 Unit_Id (Unit_Id_Of (Withs.Table (W).Uname));
+                  if Withs.Table (W).Elaborate_All then
 
-               --  Pragma Elaborate_All case, for this we use the recursive
-               --  Elab_All_Links procedure to establish the links.
+                     --  Reset flags used to stop multiple visits to a given
+                     --  node.
 
-               if Withs.Table (W).Elaborate_All then
+                     for Uref in UNR.First .. UNR.Last loop
+                        UNR.Table (Uref).Visited := False;
+                     end loop;
 
-                  --  Reset flags used to stop multiple visits to a given node
+                     --  Now establish all the links we need
 
-                  for Uref in UNR.First .. UNR.Last loop
-                     UNR.Table (Uref).Visited := False;
-                  end loop;
+                     Elab_All_Links
+                       (Withed_Unit, U, Elab_All,
+                        Make_Elab_Entry
+                          (Withs.Table (W).Uname, No_Elab_All_Link));
 
-                  --  Now establish all the links we need
+                     --  Elaborate_All_Desirable case, for this we establish
+                     --  the same links as above, but with a different reason.
 
-                  Elab_All_Links
-                    (Withed_Unit, U, Elab_All,
-                     Make_Elab_Entry
-                       (Withs.Table (W).Uname, No_Elab_All_Link));
+                  elsif Withs.Table (W).Elab_All_Desirable then
 
-               --  Elaborate_All_Desirable case, for this we establish the
-               --  same links as above, but with a different reason.
+                     --  Reset flags used to stop multiple visits to a given
+                     --  node.
 
-               elsif Withs.Table (W).Elab_All_Desirable then
+                     for Uref in UNR.First .. UNR.Last loop
+                        UNR.Table (Uref).Visited := False;
+                     end loop;
 
-                  --  Reset flags used to stop multiple visits to a given node
+                     --  Now establish all the links we need
 
-                  for Uref in UNR.First .. UNR.Last loop
-                     UNR.Table (Uref).Visited := False;
-                  end loop;
+                     Elab_All_Links
+                       (Withed_Unit, U, Elab_Desirable,
+                        Make_Elab_Entry
+                          (Withs.Table (W).Uname, No_Elab_All_Link));
 
-                  --  Now establish all the links we need
+                     --  Pragma Elaborate case. We must build a link for the
+                     --  withed unit itself, and also the corresponding body
+                     --  if there is one.
 
-                  Elab_All_Links
-                    (Withed_Unit, U, Elab_Desirable,
-                     Make_Elab_Entry
-                       (Withs.Table (W).Uname, No_Elab_All_Link));
+                     --  However, skip this processing if there is no ALI file
+                     --  for the WITH entry, because this means it is a
+                     --  generic (even when we fix the generics so that an ALI
+                     --  file is present, we probably still will have no ALI
+                     --  file for unchecked and other special cases).
 
-               --  Pragma Elaborate case. We must build a link for the withed
-               --  unit itself, and also the corresponding body if there is one
+                  elsif Withs.Table (W).Elaborate
+                    and then Withs.Table (W).Afile /= No_File
+                  then
+                     Build_Link (Withed_Unit, U, Withed);
 
-               --  However, skip this processing if there is no ALI file for
-               --  the WITH entry, because this means it is a generic (even
-               --  when we fix the generics so that an ALI file is present,
-               --  we probably still will have no ALI file for unchecked
-               --  and other special cases).
+                     if Units.Table (Withed_Unit).Utype = Is_Spec then
+                        Build_Link
+                          (Corresponding_Body (Withed_Unit), U, Elab);
+                     end if;
 
-               elsif Withs.Table (W).Elaborate
-                 and then Withs.Table (W).Afile /= No_File
-               then
-                  Build_Link (Withed_Unit, U, Withed);
+                     --  Case of normal WITH with no elaboration pragmas, just
+                     --  build the single link to the directly referenced unit
 
-                  if Units.Table (Withed_Unit).Utype = Is_Spec then
-                     Build_Link
-                      (Corresponding_Body (Withed_Unit), U, Elab);
+                  else
+                     Build_Link (Withed_Unit, U, Withed);
                   end if;
-
-               --  Case of normal WITH with no elaboration pragmas, just
-               --  build the single link to the directly referenced unit
-
-               else
-                  Build_Link (Withed_Unit, U, Withed);
                end if;
-            end if;
 
-            <<Next_With>>
+               <<Next_With>>
                null;
-         end loop;
+            end loop;
+         end if;
       end loop;
    end Gather_Dependencies;