aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorVincent Celier <celier@adacore.com>2008-05-27 11:20:12 +0200
committerArnaud Charlet <charlet@gcc.gnu.org>2008-05-27 11:20:12 +0200
commitc7867d82ac3846aea168a9e9ea7e92be2b3fd71c (patch)
tree611af309898a82b8bd657bf502d53a5034c91e34 /gcc
parentdd383eebef22066c2eff724d9d0c964975b72d79 (diff)
downloadgcc-c7867d82ac3846aea168a9e9ea7e92be2b3fd71c.zip
gcc-c7867d82ac3846aea168a9e9ea7e92be2b3fd71c.tar.gz
gcc-c7867d82ac3846aea168a9e9ea7e92be2b3fd71c.tar.bz2
2008-05-27 Vincent Celier <celier@adacore.com>
* prj-nmsc.adb: (Process_Sources_In_Multi_Language_Mode): Check that there are not two sources of the same project that have the same object file name. (Find_Explicit_Sources): Always remove a source exception that was not found. From-SVN: r135990
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/prj-nmsc.adb124
1 files changed, 113 insertions, 11 deletions
diff --git a/gcc/ada/prj-nmsc.adb b/gcc/ada/prj-nmsc.adb
index ed81d61..bbb0ec8 100644
--- a/gcc/ada/prj-nmsc.adb
+++ b/gcc/ada/prj-nmsc.adb
@@ -162,6 +162,16 @@ package body Prj.Nmsc is
-- A hash table to store naming exceptions for Ada. For each file name
-- there is one or several unit in table Ada_Naming_Exception_Table.
+ package Object_File_Names is new GNAT.HTable.Simple_HTable
+ (Header_Num => Header_Num,
+ Element => File_Name_Type,
+ No_Element => No_File,
+ Key => File_Name_Type,
+ Hash => Hash,
+ Equal => "=");
+ -- A hash table to store the object file names for a project, to check that
+ -- two different sources have different object file names.
+
type File_Found is record
File : File_Name_Type := No_File;
Found : Boolean := False;
@@ -678,7 +688,7 @@ package body Prj.Nmsc is
(Lang_Id).Config.Dependency_Kind;
Src_Data.Naming_Exception := Naming_Exception;
- if Src_Data.Compiled then
+ if Src_Data.Compiled and then Src_Data.Object_Exists then
Src_Data.Object := Object_Name (File_Name);
Src_Data.Dep_Name :=
Dependency_Name (File_Name, Src_Data.Dependency);
@@ -7830,7 +7840,7 @@ package body Prj.Nmsc is
-- Check if all exceptions have been found.
-- For Ada, it is an error if an exception is not found.
- -- For other language, the source is removed.
+ -- For other language, the source is simply removed.
declare
Source : Source_Id;
@@ -7851,11 +7861,9 @@ package body Prj.Nmsc is
(Project, In_Tree,
"source file %% for unit %% not found",
No_Location);
-
- else
- Remove_Source
- (Source, No_Source, Project, Data, In_Tree);
end if;
+
+ Remove_Source (Source, No_Source, Project, Data, In_Tree);
end if;
Source := Src_Data.Next_In_Project;
@@ -9070,6 +9078,8 @@ package body Prj.Nmsc is
Find_Explicit_Sources
(Ada_Language_Index, Current_Dir, Project, In_Tree, Data);
+ -- Mark as such the sources that are declared as excluded
+
FF := Excluded_Sources_Htable.Get_First;
while FF /= No_File_Found loop
OK := False;
@@ -9105,6 +9115,98 @@ package body Prj.Nmsc is
FF := Excluded_Sources_Htable.Get_Next;
end loop;
+
+ -- Check that two sources of this project do not have the same object
+ -- file name.
+
+ Check_Object_File_Names : declare
+ Src_Id : Source_Id;
+ Src_Data : Source_Data;
+ Source_Name : File_Name_Type;
+
+ procedure Check_Object;
+ -- Check if object file name of the current source is already in
+ -- hash table Object_File_Names. If it is, report an error. If it
+ -- is not, put it there with the file name of the current source.
+
+ ------------------
+ -- Check_Object --
+ ------------------
+
+ procedure Check_Object is
+ begin
+ Source_Name := Object_File_Names.Get (Src_Data.Object);
+
+ if Source_Name /= No_File then
+ Error_Msg_File_1 := Src_Data.File;
+ Error_Msg_File_2 := Source_Name;
+ Error_Msg
+ (Project,
+ In_Tree,
+ "{ and { have the same object file name",
+ No_Location);
+
+ else
+ Object_File_Names.Set (Src_Data.Object, Src_Data.File);
+ end if;
+ end Check_Object;
+
+ -- Start of processing for Check_Object_File_Names
+
+ begin
+ Object_File_Names.Reset;
+ Src_Id := In_Tree.First_Source;
+ while Src_Id /= No_Source loop
+ Src_Data := In_Tree.Sources.Table (Src_Id);
+
+ if Src_Data.Compiled and then Src_Data.Object_Exists
+ and then Project_Extends (Project, Src_Data.Project, In_Tree)
+ then
+ if Src_Data.Unit = No_Name then
+ if Src_Data.Kind = Impl then
+ Check_Object;
+ end if;
+
+ else
+ case Src_Data.Kind is
+ when Spec =>
+ if Src_Data.Other_Part = No_Source then
+ Check_Object;
+ end if;
+
+ when Sep =>
+ null;
+
+ when Impl =>
+ if Src_Data.Other_Part /= No_Source then
+ Check_Object;
+
+ else
+ -- Check if it is a subunit
+
+ declare
+ Src_Ind : constant Source_File_Index :=
+ Sinput.P.Load_Project_File
+ (Get_Name_String
+ (Src_Data.Path));
+
+ begin
+ if Sinput.P.Source_File_Is_Subunit
+ (Src_Ind)
+ then
+ In_Tree.Sources.Table (Src_Id).Kind := Sep;
+ else
+ Check_Object;
+ end if;
+ end;
+ end if;
+ end case;
+ end if;
+ end if;
+
+ Src_Id := Src_Data.Next_In_Sources;
+ end loop;
+ end Check_Object_File_Names;
end Process_Sources_In_Multi_Language_Mode;
-- Start of processing for Look_For_Sources
@@ -9140,15 +9242,15 @@ package body Prj.Nmsc is
(File_Name : File_Name_Type;
Directory : Path_Name_Type) return String
is
- Result : String_Access;
-
+ Result : String_Access;
The_Directory : constant String := Get_Name_String (Directory);
begin
Get_Name_String (File_Name);
- Result := Locate_Regular_File
- (File_Name => Name_Buffer (1 .. Name_Len),
- Path => The_Directory);
+ Result :=
+ Locate_Regular_File
+ (File_Name => Name_Buffer (1 .. Name_Len),
+ Path => The_Directory);
if Result = null then
return "";