The verification back-end may need to work in a mode in which not all ALI files
are available. Update Read_Withed_ALIs to work in that mode. This does not
impact the compiler.

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

2011-09-01  Yannick Moy  <m...@adacore.com>

        * ali-util.adb, ali-util.ads (Read_Withed_ALIs): Add parameter
        Ignore_Errors to ignore failures to read ALI files when True.

Index: ali-util.adb
===================================================================
--- ali-util.adb        (revision 178381)
+++ ali-util.adb        (working copy)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2010, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2011, 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- --
@@ -212,7 +212,10 @@
    -- Read_Withed_ALIs --
    ----------------------
 
-   procedure Read_Withed_ALIs (Id : ALI_Id) is
+   procedure Read_Withed_ALIs
+     (Id            : ALI_Id;
+      Ignore_Errors : Boolean := False)
+   is
       Afile  : File_Name_Type;
       Text   : Text_Buffer_Ptr;
       Idread : ALI_Id;
@@ -234,59 +237,67 @@
             then
                Text := Read_Library_Info (Afile);
 
-               --  Return with an error if source cannot be found. We used to
-               --  skip this check when we did not compile library generics
-               --  separately, but we now always do, so there is no special
-               --  case here anymore.
+               --  Unless Ignore_Errors is true, return with an error if source
+               --  cannot be found. We used to skip this check when we did not
+               --  compile library generics separately, but we now always do,
+               --  so there is no special case here anymore.
 
                if Text = null then
-                  Error_Msg_File_1 := Afile;
-                  Error_Msg_File_2 := Withs.Table (W).Sfile;
-                  Error_Msg ("{ not found, { must be compiled");
-                  Set_Name_Table_Info (Afile, Int (No_Unit_Id));
-                  return;
-               end if;
 
-               --  Enter in ALIs table
+                  if not Ignore_Errors then
+                     Error_Msg_File_1 := Afile;
+                     Error_Msg_File_2 := Withs.Table (W).Sfile;
+                     Error_Msg ("{ not found, { must be compiled");
+                     Set_Name_Table_Info (Afile, Int (No_Unit_Id));
+                     return;
+                  end if;
 
-               Idread :=
-                 Scan_ALI
-                   (F         => Afile,
-                    T         => Text,
-                    Ignore_ED => False,
-                    Err       => False);
+               else
+                  --  Enter in ALIs table
 
-               Free (Text);
+                  Idread :=
+                    Scan_ALI
+                      (F         => Afile,
+                       T         => Text,
+                       Ignore_ED => False,
+                       Err       => False);
 
-               if ALIs.Table (Idread).Compile_Errors then
-                  Error_Msg_File_1 := Withs.Table (W).Sfile;
-                  Error_Msg ("{ had errors, must be fixed, and recompiled");
-                  Set_Name_Table_Info (Afile, Int (No_Unit_Id));
+                  Free (Text);
 
-               elsif ALIs.Table (Idread).No_Object then
-                  Error_Msg_File_1 := Withs.Table (W).Sfile;
-                  Error_Msg ("{ must be recompiled");
-                  Set_Name_Table_Info (Afile, Int (No_Unit_Id));
-               end if;
+                  if ALIs.Table (Idread).Compile_Errors
+                    and then not Ignore_Errors
+                  then
+                     Error_Msg_File_1 := Withs.Table (W).Sfile;
+                     Error_Msg ("{ had errors, must be fixed, and recompiled");
+                     Set_Name_Table_Info (Afile, Int (No_Unit_Id));
 
-               --  If the Unit is an Interface to a Stand-Alone Library,
-               --  set the Interface flag in the Withs table, so that its
-               --  dependant are not considered for elaboration order.
+                  elsif ALIs.Table (Idread).No_Object
+                    and then not Ignore_Errors
+                  then
+                     Error_Msg_File_1 := Withs.Table (W).Sfile;
+                     Error_Msg ("{ must be recompiled");
+                     Set_Name_Table_Info (Afile, Int (No_Unit_Id));
+                  end if;
 
-               if ALIs.Table (Idread).SAL_Interface then
-                  Withs.Table (W).SAL_Interface  := True;
-                  Interface_Library_Unit := True;
+                  --  If the Unit is an Interface to a Stand-Alone Library,
+                  --  set the Interface flag in the Withs table, so that its
+                  --  dependant are not considered for elaboration order.
 
-                  --  Set the entry in the Interfaces hash table, so that other
-                  --  units that import this unit will set the flag in their
-                  --  entry in the Withs table.
+                  if ALIs.Table (Idread).SAL_Interface then
+                     Withs.Table (W).SAL_Interface := True;
+                     Interface_Library_Unit := True;
 
-                  Interfaces.Set (Afile, True);
+                     --  Set the entry in the Interfaces hash table, so that
+                     --  other units that import this unit will set the flag
+                     --  in their entry in the Withs table.
 
-               else
-                  --  Otherwise, recurse to get new dependents
+                     Interfaces.Set (Afile, True);
 
-                  Read_Withed_ALIs (Idread);
+                  else
+                     --  Otherwise, recurse to get new dependents
+
+                     Read_Withed_ALIs (Idread);
+                  end if;
                end if;
 
             --  If the ALI file has already been processed and is an interface,
Index: ali-util.ads
===================================================================
--- ali-util.ads        (revision 178381)
+++ ali-util.ads        (working copy)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 S p e c                                  --
 --                                                                          --
---          Copyright (C) 1992-2010, Free Software Foundation, Inc.         --
+--          Copyright (C) 1992-2011, 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- --
@@ -100,11 +100,15 @@
    -- Subprograms for Manipulating ALI Information --
    --------------------------------------------------
 
-   procedure Read_Withed_ALIs (Id : ALI_Id);
+   procedure Read_Withed_ALIs
+     (Id            : ALI_Id;
+      Ignore_Errors : Boolean := False);
    --  Process an ALI file which has been read and scanned by looping through
    --  all withed units in the ALI file, checking if they have been processed.
    --  Each unit that has not yet been processed will be read, scanned, and
-   --  processed recursively.
+   --  processed recursively. If Ignore_Errors is True, then failure to read an
+   --  ALI file is not reported as an error, and scanning continues with other
+   --  ALI files.
 
    procedure Set_Source_Table (A : ALI_Id);
    --  Build source table entry corresponding to the ALI file whose id is A

Reply via email to