diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 8596df4fb290..0c292b9e5d10 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,18 @@ +2010-10-04 Vincent Celier + + * frontend.adb: Set Lib.Parsing_Main_Extended_Source to True before + loading the main source, so that if it is preprocessed and -gnateG is + used, the preprocessed file is written. + * lib.ads (Analysing_Subunit_Of_Main): New global variable to indicate + if a subunit is from the main unit when it is loaded. + * sem_ch10.adb (Analyze_Proper_Body): Set Lib.Analysing_Subunit_Of_Main + to True before loading a subunit. + * sem_ch12.adb (Copy_Generic_Node): Set Lib.Analysing_Subunit_Of_Main + to True when the main is a generic unit before loading one of its + subunits. + * sinput-l.adb (Load_File): If -gnateG is used, write the preprocessed + file only for the main unit (spec, body and subunits). + 2010-10-04 Vincent Celier * sinput-l.adb (Load_File): Do not fail when switch -gnateG is diff --git a/gcc/ada/frontend.adb b/gcc/ada/frontend.adb index 31c8feaa9c16..fd83b5d5b5c8 100644 --- a/gcc/ada/frontend.adb +++ b/gcc/ada/frontend.adb @@ -116,6 +116,11 @@ begin Prepcomp.Check_Symbols; end if; + -- We set Parsing_Main_Extended_Source true here to cover processing of all + -- the configuration pragma files, as well as the main source unit itself. + + Parsing_Main_Extended_Source := True; + -- Now that the preprocessing situation is established, we are able to -- load the main source (this is no longer done by Lib.Load.Initialize). @@ -127,11 +132,6 @@ begin return; end if; - -- We set Parsing_Main_Extended_Source true here to cover processing of all - -- the configuration pragma files, as well as the main source unit itself. - - Parsing_Main_Extended_Source := True; - -- Read and process configuration pragma files if present declare diff --git a/gcc/ada/lib.ads b/gcc/ada/lib.ads index 0aac6f04da40..28e2ec064cdc 100644 --- a/gcc/ada/lib.ads +++ b/gcc/ada/lib.ads @@ -49,6 +49,11 @@ package Lib is -- extended source (the main unit, its spec, or one of its subunits). This -- flag to implement In_Extended_Main_Source_Unit. + Analysing_Subunit_Of_Main : Boolean := False; + -- Set to True when analyzing a subunit of the main source. When True, if + -- the subunit is preprocessed and -gnateG is specified, then the + -- preprocessed file (.prep) is written. + -------------------------------------------- -- General Approach to Library Management -- -------------------------------------------- diff --git a/gcc/ada/sem_ch10.adb b/gcc/ada/sem_ch10.adb index 7623b8231eaf..f38503d00dac 100644 --- a/gcc/ada/sem_ch10.adb +++ b/gcc/ada/sem_ch10.adb @@ -1739,12 +1739,17 @@ package body Sem_Ch10 is -- Otherwise we must load the subunit and link to it else + -- Make sure that, if the subunit is preprocessed and -gnateG is + -- specified, the preprocessed file will be written. + + Lib.Analysing_Subunit_Of_Main := True; Unum := Load_Unit (Load_Name => Subunit_Name, Required => False, Subunit => True, Error_Node => N); + Lib.Analysing_Subunit_Of_Main := False; -- Give message if we did not get the unit Emit warning even if -- missing subunit is not within main unit, to simplify debugging. @@ -1822,11 +1827,11 @@ package body Sem_Ch10 is end if; end if; - -- The remaining case is when the subunit is not already loaded and - -- we are not generating code. In this case we are just performing - -- semantic analysis on the parent, and we are not interested in - -- the subunit. For subprograms, analyze the stub as a body. For - -- other entities the stub has already been marked as completed. + -- The remaining case is when the subunit is not already loaded and we + -- are not generating code. In this case we are just performing semantic + -- analysis on the parent, and we are not interested in the subunit. For + -- subprograms, analyze the stub as a body. For other entities the stub + -- has already been marked as completed. else Optional_Subunit; diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb index b325ccbe89c7..5f258f23d681 100644 --- a/gcc/ada/sem_ch12.adb +++ b/gcc/ada/sem_ch12.adb @@ -5906,12 +5906,19 @@ package body Sem_Ch12 is New_Body : Node_Id; begin + -- Make sure that, if it is a subunit of the main unit that is + -- preprocessed and if -gnateG is specified, the preprocessed + -- file will be written. + + Lib.Analysing_Subunit_Of_Main := + Lib.In_Extended_Main_Source_Unit (N); Unum := Load_Unit (Load_Name => Subunit_Name, Required => False, Subunit => True, Error_Node => N); + Lib.Analysing_Subunit_Of_Main := False; -- If the proper body is not found, a warning message will be -- emitted when analyzing the stub, or later at the point diff --git a/gcc/ada/sinput-l.adb b/gcc/ada/sinput-l.adb index 98ad104d020e..8d952b2cd042 100644 --- a/gcc/ada/sinput-l.adb +++ b/gcc/ada/sinput-l.adb @@ -30,6 +30,7 @@ with Einfo; use Einfo; with Errout; use Errout; with Fname; use Fname; with Hostparm; +with Lib; use Lib; with Opt; use Opt; with Osint; use Osint; with Output; use Output; @@ -552,9 +553,17 @@ package body Sinput.L is else -- Output the result of the preprocessing, if requested and - -- the source has been modified by the preprocessing. + -- the source has been modified by the preprocessing. Only + -- do that for the main unit (spec, body and subunits). - if Generate_Processed_File and then Modified then + if Generate_Processed_File and then + Modified and then + ((Compiler_State = Parsing + and then Parsing_Main_Extended_Source) + or else + (Compiler_State = Analyzing + and then Analysing_Subunit_Of_Main)) + then declare FD : File_Descriptor; NB : Integer;