From f0bfd1f91fdba41a6d9fa7ada6e02ea8121f604c Mon Sep 17 00:00:00 2001 From: Hristian Kirtchev Date: Tue, 9 Jul 2019 07:55:12 +0000 Subject: [Ada] Elaboration order v4.0 and generic instantiations This patch updates the library graph augmentation mechanism of the elaboration order v4.0 to emulate a particular behavior of the v3.0 scheme involving generic instantiations. If a unit without any elaboration code instantiates a generic without any elaboration code, the invocation edge from the instance to the generic body is not considered for library graph augmentation. ------------ -- Source -- ------------ -- gen_pack1.ads generic type Element_Type is private; package Gen_Pack1 is procedure Read; end Gen_Pack1; -- gen_pack1.adb with Types1; package body Gen_Pack1 is procedure Read is null; end Gen_Pack1; -- types1.ads with Gen_Pack1; package Types1 is procedure Read; package Optional_Numbers is new Gen_Pack1 (Positive); end Types1; -- main1.adb with Types1; procedure Main1 is begin Types1.Optional_Numbers.Read; end Main1; ----------------- -- Compilation -- ----------------- $ gnatmake -q main1.adb 2019-07-09 Hristian Kirtchev gcc/ada/ * bindo-augmentors.adb (Visit_Elaboration_Root): Do not start a DFS from an elaboration root whose corresponding unit lacks elaboration code. This behavior mimics that of the old elaboration order mechanism. * bindo-graphs.adb (Find_All_Cycles_Through_Vertex): Move the vertex tracing within the functional branches of the routine. This prevents spurious trace output. (Has_No_Elaboration_Code): New routine. (Trace_Cycle, Trace_Edge): Update the various Ids to use the "standard" trace format. * bindo-graphs.ads (Has_No_Elaboration_Code): New routine. * bindo-units.ads, bindo-units.adb (Has_No_Elaboration_Code): New routine. From-SVN: r273288 --- gcc/ada/bindo-graphs.ads | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'gcc/ada/bindo-graphs.ads') diff --git a/gcc/ada/bindo-graphs.ads b/gcc/ada/bindo-graphs.ads index 53bc4ee..86ba823 100644 --- a/gcc/ada/bindo-graphs.ads +++ b/gcc/ada/bindo-graphs.ads @@ -1028,6 +1028,13 @@ package Bindo.Graphs is -- Determine whether library graph G contains a cycle involving pragma -- Elaborate_All. + function Has_No_Elaboration_Code + (G : Library_Graph; + Vertex : Library_Graph_Vertex_Id) return Boolean; + pragma Inline (Has_No_Elaboration_Code); + -- Determine whether vertex Vertex of library graph G represents a unit + -- that lacks elaboration code. + function In_Same_Component (G : Library_Graph; Left : Library_Graph_Vertex_Id; -- cgit v1.1