diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/ChangeLog | 42 | ||||
-rw-r--r-- | gcc/ada/bindo-augmentors.adb | 8 | ||||
-rw-r--r-- | gcc/ada/bindo-builders.adb | 10 | ||||
-rw-r--r-- | gcc/ada/bindo-diagnostics.adb | 5 | ||||
-rw-r--r-- | gcc/ada/bindo-elaborators.adb | 4 | ||||
-rw-r--r-- | gcc/ada/bindo-graphs.adb | 8 | ||||
-rw-r--r-- | gcc/ada/bindo-units.adb | 8 | ||||
-rw-r--r-- | gcc/ada/bindo-validators.adb | 27 | ||||
-rw-r--r-- | gcc/ada/bindo-writers.adb | 88 | ||||
-rw-r--r-- | gcc/ada/bindo-writers.ads | 17 | ||||
-rw-r--r-- | gcc/ada/bindo.adb | 10 | ||||
-rw-r--r-- | gcc/ada/bindo.ads | 18 | ||||
-rw-r--r-- | gcc/ada/debug.adb | 7 |
13 files changed, 246 insertions, 6 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index a2316ea..fa580d2 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,45 @@ +2019-07-11 Hristian Kirtchev <kirtchev@adacore.com> + + * bindo.adb: Update the section of switches and debugging + elaboration issues. + * bindo.ads: Add type Elaboration_Phase. + * bindo-augmentors.adb: Add use clause for + Bindo.Writers.Phase_Writers. + (Augment_Library_Graph): Signal the start and end of the + aubmentation phase. + * bindo-builders.adb: Add with and use clause for Bindo.Writers. + Add use clause for Bindo.Writers.Phase_Writers. + (Build_Invocation_Graph): Signal the start and end of the + invocation graph construction phase. + (Build_Library_Graph): Signal the start and end of the library + graph construction phase. + * bindo-diagnostics.adb: Add use clause for + Bindo.Writers.Phase_Writers. + (Diagnose_Cycle): Signal the start and end of the cycle + diagnostic phase. + * bindo-elaborators.adb: Add use clause for + Bindo.Writers.Phase_Writers. + (Elaborate_Units): Signal the start and end of the unit + elaboration phase. + * bindo-graphs.adb: Add use clause for + Bindo.Writers.Phase_Writers. + (Find_Components): Signal the start and end of the component + discovery phase. + (Find_Cycles): Signal the start and end of the cycle discovery + phase. + * bindo-units.adb: Add with and use clause for Bindo.Writers. + Add use clause for Bindo.Writers.Phase_Writers. + (Collect_Elaborable_Units): Signal the start and end of the unit + collection phase. + * bindo-validators.adb: Add with and use clause for + Bindo.Writers. Add use clause for Bindo.Writers.Phase_Writers. + (Validate_Cycles, Validate_Elaboration_Order, + Validate_Invocation_Graph, Validate_Library_Graph): Signal the + start and end of the libray graph validation phase. + * bindo-writers.ads, bindo-writers.adb: Add new nested package + Phase_Writers. + * debug.adb: Update the documentation of switch d_S. + 2019-07-11 Yannick Moy <moy@adacore.com> * sem_res.adb (Check_Argument_Order): Special case calls to diff --git a/gcc/ada/bindo-augmentors.adb b/gcc/ada/bindo-augmentors.adb index e0e2338..57fb541 100644 --- a/gcc/ada/bindo-augmentors.adb +++ b/gcc/ada/bindo-augmentors.adb @@ -27,7 +27,9 @@ with Debug; use Debug; with Output; use Output; with Types; use Types; -with Bindo.Writers; use Bindo.Writers; +with Bindo.Writers; +use Bindo.Writers; +use Bindo.Writers.Phase_Writers; package body Bindo.Augmentors is @@ -124,6 +126,8 @@ package body Bindo.Augmentors is return; end if; + Start_Phase (Library_Graph_Augmentation); + -- Prepare the statistics data Longest_Path := 0; @@ -131,6 +135,8 @@ package body Bindo.Augmentors is Visit_Elaboration_Roots (Inv_Graph, Lib_Graph); Write_Statistics; + + End_Phase (Library_Graph_Augmentation); end Augment_Library_Graph; ---------------------------- diff --git a/gcc/ada/bindo-builders.adb b/gcc/ada/bindo-builders.adb index 351b10d..9919007 100644 --- a/gcc/ada/bindo-builders.adb +++ b/gcc/ada/bindo-builders.adb @@ -37,6 +37,10 @@ use Bindo.Validators; use Bindo.Validators.Invocation_Graph_Validators; use Bindo.Validators.Library_Graph_Validators; +with Bindo.Writers; +use Bindo.Writers; +use Bindo.Writers.Phase_Writers; + with GNAT; use GNAT; with GNAT.Dynamic_HTables; use GNAT.Dynamic_HTables; @@ -99,6 +103,8 @@ package body Bindo.Builders is begin pragma Assert (Present (Lib_G)); + Start_Phase (Invocation_Graph_Construction); + -- Prepare the global data Inv_Graph := @@ -111,6 +117,7 @@ package body Bindo.Builders is For_Each_Elaborable_Unit (Create_Edges'Access); Validate_Invocation_Graph (Inv_Graph); + End_Phase (Invocation_Graph_Construction); return Inv_Graph; end Build_Invocation_Graph; @@ -375,6 +382,8 @@ package body Bindo.Builders is function Build_Library_Graph return Library_Graph is begin + Start_Phase (Library_Graph_Construction); + -- Prepare the global data Lib_Graph := @@ -388,6 +397,7 @@ package body Bindo.Builders is Create_Forced_Edges; Validate_Library_Graph (Lib_Graph); + End_Phase (Library_Graph_Construction); return Lib_Graph; end Build_Library_Graph; diff --git a/gcc/ada/bindo-diagnostics.adb b/gcc/ada/bindo-diagnostics.adb index 9dbdfc0..6f19ac0 100644 --- a/gcc/ada/bindo-diagnostics.adb +++ b/gcc/ada/bindo-diagnostics.adb @@ -36,6 +36,7 @@ use Bindo.Validators.Cycle_Validators; with Bindo.Writers; use Bindo.Writers; use Bindo.Writers.Cycle_Writers; +use Bindo.Writers.Phase_Writers; package body Bindo.Diagnostics is @@ -348,6 +349,8 @@ package body Bindo.Diagnostics is Next_Edge : Library_Graph_Edge_Id; begin + Start_Phase (Cycle_Diagnostics); + First_Edge := No_Library_Graph_Edge; -- Inspect the edges of the cycle in pairs, emitting diagnostics based @@ -402,6 +405,8 @@ package body Bindo.Diagnostics is (G => Lib_Graph, Cycle => Cycle, First_Edge => First_Edge); + + End_Phase (Cycle_Diagnostics); end Diagnose_Cycle; -------------------------------------- diff --git a/gcc/ada/bindo-elaborators.adb b/gcc/ada/bindo-elaborators.adb index 0d9f207..9e207e1 100644 --- a/gcc/ada/bindo-elaborators.adb +++ b/gcc/ada/bindo-elaborators.adb @@ -54,6 +54,7 @@ use Bindo.Writers.Dependency_Writers; use Bindo.Writers.Elaboration_Order_Writers; use Bindo.Writers.Invocation_Graph_Writers; use Bindo.Writers.Library_Graph_Writers; +use Bindo.Writers.Phase_Writers; use Bindo.Writers.Unit_Closure_Writers; with GNAT; use GNAT; @@ -711,6 +712,8 @@ package body Bindo.Elaborators is Status : Elaboration_Order_Status; begin + Start_Phase (Unit_Elaboration); + -- Initialize all unit-related data structures and gather all units -- that need elaboration. @@ -786,6 +789,7 @@ package body Bindo.Elaborators is -- Destroy all unit-related data structures Finalize_Units; + End_Phase (Unit_Elaboration); -- Halt the bind when there is no satisfactory elaboration order diff --git a/gcc/ada/bindo-graphs.adb b/gcc/ada/bindo-graphs.adb index d254b1c..9621bb4 100644 --- a/gcc/ada/bindo-graphs.adb +++ b/gcc/ada/bindo-graphs.adb @@ -31,6 +31,7 @@ with Output; use Output; with Bindo.Writers; use Bindo.Writers; +use Bindo.Writers.Phase_Writers; package body Bindo.Graphs is @@ -2636,6 +2637,8 @@ package body Bindo.Graphs is begin pragma Assert (Present (G)); + Start_Phase (Component_Discovery); + -- Initialize or reinitialize the components of the graph Initialize_Components (G); @@ -2660,6 +2663,7 @@ package body Bindo.Graphs is -- before they can be elaborated. Update_Pending_Predecessors_Of_Components (G); + End_Phase (Component_Discovery); end Find_Components; ----------------- @@ -2683,6 +2687,8 @@ package body Bindo.Graphs is begin pragma Assert (Present (G)); + Start_Phase (Cycle_Discovery); + -- The cycles of graph G are discovered using Tarjan's enumeration -- of the elementary circuits of a directed-graph algorithm. Do not -- modify this code unless you intimately understand the algorithm. @@ -2721,6 +2727,8 @@ package body Bindo.Graphs is Cycle_Count => Cycle_Count, Cycle_Limit => All_Cycle_Limit); end loop; + + End_Phase (Cycle_Discovery); end Find_Cycles; -------------------------------- diff --git a/gcc/ada/bindo-units.adb b/gcc/ada/bindo-units.adb index 8b8fc28..284aa62 100644 --- a/gcc/ada/bindo-units.adb +++ b/gcc/ada/bindo-units.adb @@ -23,6 +23,10 @@ -- -- ------------------------------------------------------------------------------ +with Bindo.Writers; +use Bindo.Writers; +use Bindo.Writers.Phase_Writers; + package body Bindo.Units is ------------------- @@ -79,9 +83,13 @@ package body Bindo.Units is procedure Collect_Elaborable_Units is begin + Start_Phase (Unit_Collection); + for U_Id in ALI.Units.First .. ALI.Units.Last loop Process_Unit (U_Id); end loop; + + End_Phase (Unit_Collection); end Collect_Elaborable_Units; ------------------------ diff --git a/gcc/ada/bindo-validators.adb b/gcc/ada/bindo-validators.adb index b711a91..584d33f 100644 --- a/gcc/ada/bindo-validators.adb +++ b/gcc/ada/bindo-validators.adb @@ -27,7 +27,12 @@ with Debug; use Debug; with Output; use Output; with Types; use Types; -with Bindo.Units; use Bindo.Units; +with Bindo.Units; +use Bindo.Units; + +with Bindo.Writers; +use Bindo.Writers; +use Bindo.Writers.Phase_Writers; package body Bindo.Validators is @@ -188,6 +193,8 @@ package body Bindo.Validators is return; end if; + Start_Phase (Cycle_Validation); + Iter := Iterate_All_Cycles (G); while Has_Next (Iter) loop Next (Iter, Cycle); @@ -195,6 +202,8 @@ package body Bindo.Validators is Validate_Cycle (G, Cycle); end loop; + End_Phase (Cycle_Validation); + if Has_Invalid_Cycle then raise Invalid_Cycle; end if; @@ -330,8 +339,12 @@ package body Bindo.Validators is return; end if; + Start_Phase (Elaboration_Order_Validation); + Validate_Units (Order); + End_Phase (Elaboration_Order_Validation); + if Has_Invalid_Data then raise Invalid_Elaboration_Order; end if; @@ -444,8 +457,12 @@ package body Bindo.Validators is return; end if; + Start_Phase (Invocation_Graph_Validation); + Validate_Invocation_Graph_Vertices (G); - Validate_Invocation_Graph_Edges (G); + Validate_Invocation_Graph_Edges (G); + + End_Phase (Invocation_Graph_Validation); if Has_Invalid_Data then raise Invalid_Invocation_Graph; @@ -638,8 +655,12 @@ package body Bindo.Validators is return; end if; + Start_Phase (Library_Graph_Validation); + Validate_Library_Graph_Vertices (G); - Validate_Library_Graph_Edges (G); + Validate_Library_Graph_Edges (G); + + End_Phase (Library_Graph_Validation); if Has_Invalid_Data then raise Invalid_Library_Graph; diff --git a/gcc/ada/bindo-writers.adb b/gcc/ada/bindo-writers.adb index c4784d4..021d50f 100644 --- a/gcc/ada/bindo-writers.adb +++ b/gcc/ada/bindo-writers.adb @@ -1404,6 +1404,94 @@ package body Bindo.Writers is end Write_Statistics; end Library_Graph_Writers; + ------------------- + -- Phase_Writers -- + ------------------- + + package body Phase_Writers is + + subtype Phase_Message is String (1 .. 32); + + -- The following table contains the phase-specific messages for phase + -- completion. + + End_Messages : constant array (Elaboration_Phase) of Phase_Message := + (Component_Discovery => "components discovered. ", + Cycle_Diagnostics => "cycle diagnosed. ", + Cycle_Discovery => "cycles discovered. ", + Cycle_Validation => "cycles validated. ", + Elaboration_Order_Validation => "elaboration order validated. ", + Invocation_Graph_Construction => "invocation graph constructed. ", + Invocation_Graph_Validation => "invocation graph validated. ", + Library_Graph_Augmentation => "library graph augmented. ", + Library_Graph_Construction => "library graph constructed. ", + Library_Graph_Elaboration => "library graph elaborated. ", + Library_Graph_Validation => "library graph validated. ", + Unit_Collection => "units collected. ", + Unit_Elaboration => "units elaborated. "); + + -- The following table contains the phase-specific messages for phase + -- commencement. + + Start_Messages : constant array (Elaboration_Phase) of Phase_Message := + (Component_Discovery => "discovering components... ", + Cycle_Diagnostics => "diagnosing cycle... ", + Cycle_Discovery => "discovering cycles... ", + Cycle_Validation => "validating cycles... ", + Elaboration_Order_Validation => "validating elaboration order... ", + Invocation_Graph_Construction => "constructing invocation graph...", + Invocation_Graph_Validation => "validating invocation graph... ", + Library_Graph_Augmentation => "augmenting library graph... ", + Library_Graph_Construction => "constructing library graph... ", + Library_Graph_Elaboration => "elaborating library graph... ", + Library_Graph_Validation => "validating library graph... ", + Unit_Collection => "collecting units... ", + Unit_Elaboration => "elaborating units... "); + + ----------------------- + -- Local subprograms -- + ----------------------- + + procedure Write_Phase_Message (Msg : Phase_Message); + pragma Inline (Write_Phase_Message); + -- Write elaboration phase-related message Msg to standard output + + --------------- + -- End_Phase -- + --------------- + + procedure End_Phase (Phase : Elaboration_Phase) is + begin + Write_Phase_Message (End_Messages (Phase)); + end End_Phase; + + ----------------- + -- Start_Phase -- + ----------------- + + procedure Start_Phase (Phase : Elaboration_Phase) is + begin + Write_Phase_Message (Start_Messages (Phase)); + end Start_Phase; + + ------------------------- + -- Write_Phase_Message -- + ------------------------- + + procedure Write_Phase_Message (Msg : Phase_Message) is + begin + -- Nothing to do when switch -d_S (output elaboration order status) + -- is not in effect. + + if not Debug_Flag_Underscore_SS then + return; + end if; + + Write_Str (Msg); + Write_Eol; + end Write_Phase_Message; + end Phase_Writers; + -------------------------- -- Unit_Closure_Writers -- -------------------------- diff --git a/gcc/ada/bindo-writers.ads b/gcc/ada/bindo-writers.ads index 01e48e4..66483d0 100644 --- a/gcc/ada/bindo-writers.ads +++ b/gcc/ada/bindo-writers.ads @@ -132,6 +132,23 @@ package Bindo.Writers is end Library_Graph_Writers; + ------------------- + -- Phase_Writers -- + ------------------- + + package Phase_Writers is + procedure End_Phase (Phase : Elaboration_Phase); + pragma Inline (End_Phase); + -- Write the end message associated with elaboration phase Phase to + -- standard output. + + procedure Start_Phase (Phase : Elaboration_Phase); + pragma Inline (Start_Phase); + -- Write the start message associated with elaboration phase Phase to + -- standard output. + + end Phase_Writers; + -------------------------- -- Unit_Closure_Writers -- -------------------------- diff --git a/gcc/ada/bindo.adb b/gcc/ada/bindo.adb index 678f009..d5830ca 100644 --- a/gcc/ada/bindo.adb +++ b/gcc/ada/bindo.adb @@ -355,6 +355,11 @@ package body Bindo is -- -- GNATbind output the cycle paths in text format to standard output -- + -- -d_S Output elaboration-order status information + -- + -- GNATbind outputs trace information concerning the status of its + -- various phases to standard output. + -- -- -d_T Output elaboration-order trace information -- -- GNATbind outputs trace information on elaboration-order detection @@ -416,6 +421,11 @@ package body Bindo is -- plgv -- print library-graph vertex -- pu -- print units -- + -- * Apparent infinite loop + -- + -- The elaboration order mechanism appears to be stuck in an infinite + -- loop. Use switch -d_S to output the status of each elaboration phase. + -- -- * Invalid elaboration order -- -- The elaboration order is invalid when: diff --git a/gcc/ada/bindo.ads b/gcc/ada/bindo.ads index b0ebe62..ae35c95 100644 --- a/gcc/ada/bindo.ads +++ b/gcc/ada/bindo.ads @@ -31,6 +31,24 @@ with Namet; use Namet; package Bindo is + -- The following type represents the various phases of the elaboration + -- order mechanism. + + type Elaboration_Phase is + (Component_Discovery, + Cycle_Diagnostics, + Cycle_Discovery, + Cycle_Validation, + Elaboration_Order_Validation, + Invocation_Graph_Construction, + Invocation_Graph_Validation, + Library_Graph_Augmentation, + Library_Graph_Construction, + Library_Graph_Elaboration, + Library_Graph_Validation, + Unit_Collection, + Unit_Elaboration); + -- The following type represents the various kinds of precedence between -- two items. diff --git a/gcc/ada/debug.adb b/gcc/ada/debug.adb index a81de09..44f0b9e 100644 --- a/gcc/ada/debug.adb +++ b/gcc/ada/debug.adb @@ -394,8 +394,8 @@ package body Debug is -- d_P Output cycle paths -- d_Q -- d_R - -- d_S - -- d_T Output elaboration order trace information + -- d_S Output elaboration-order status + -- d_T Output elaboration-order trace information -- d_U -- d_V Validate bindo cycles, graphs, and order -- d_W @@ -1167,6 +1167,9 @@ package body Debug is -- d_P GNATBIND outputs the cycle paths to standard output + -- d_S GNATBIND outputs trace information concerning the status of its + -- various phases to standard output. + -- d_T GNATBIND outputs trace information of elaboration order detection -- activities to standard output. |