annotate gcc/ada/bindo.adb @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 ------------------------------------------------------------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 -- B I N D O --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 -- B o d y --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 -- Copyright (C) 2019, Free Software Foundation, Inc. --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 -- for more details. You should have received a copy of the GNU General --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 -- GNAT was originally developed by the GNAT team at New York University. --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 ------------------------------------------------------------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 with Binde;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 with Opt; use Opt;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 with Bindo.Elaborators;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 use Bindo.Elaborators;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 package body Bindo is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 ---------------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 -- Elaboration-order mechanism --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 ---------------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 -- The elaboration-order (EO) mechanism implemented in this unit and its
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 -- children has the following objectives:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 -- * Find an ordering of all library items (historically referred to as
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 -- "units") in the bind which require elaboration, taking into account:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 -- - The dependencies between units expressed in the form of with
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 -- clauses.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 -- - Pragmas Elaborate, Elaborate_All, Elaborate_Body, Preelaborable,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 -- and Pure.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 -- - The flow of execution at elaboration time.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 -- - Additional dependencies between units supplied to the binder by
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 -- means of a forced-elaboration-order file.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 -- The high-level idea empoyed by the EO mechanism is to construct two
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 -- graphs and use the information they represent to find an ordering of
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 -- all units.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 -- The invocation graph represents the flow of execution at elaboration
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 -- time.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 -- The library graph captures the dependencies between units expressed
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 -- by with clause and elaboration-related pragmas. The library graph is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 -- further augmented with additional information from the invocation
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 -- graph by exploring the execution paths from a unit with elaboration
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 -- code to other external units.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 -- The strongly connected components of the library graph are computed.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 -- The order is obtained using a topological sort-like algorithm which
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 -- traverses the library graph and its strongly connected components in
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 -- an attempt to order available units while enabling other units to be
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 -- ordered.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 -- * Diagnose elaboration circularities between units
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 -- An elaboration circularity arises when either
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 -- - At least one unit cannot be ordered, or
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 -- - All units can be ordered, but an edge with an Elaborate_All
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 -- pragma links two vertices within the same component of the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 -- library graph.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 -- The library graph is traversed to discover, collect, and sort all
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 -- cycles that hinder the elaboration order.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 -- The most important cycle is diagnosed by describing its effects on
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 -- the elaboration order and listing all units comprising the circuit.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 -- Various suggestions on how to break the cycle are offered.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 -----------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 -- Terminology --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 -----------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 -- * Component - A strongly connected component of a graph.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 -- * Elaborable component - A component that is not waiting on other
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 -- components to be elaborated.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 -- * Elaborable vertex - A vertex that is not waiting on strong and weak
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 -- predecessors, and whose component is elaborable.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 -- * Elaboration circularity - A cycle involving units from the bind.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 -- * Elaboration root - A special invocation construct which denotes the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 -- elaboration procedure of a unit.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 -- * Invocation - The act of activating a task, calling a subprogram, or
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 -- instantiating a generic.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 -- * Invocation construct - An entry declaration, [single] protected type,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 -- subprogram declaration, subprogram instantiation, or a [single] task
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 -- type declared in the visible, private, or body declarations of some
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 -- unit. The construct is encoded in the ALI file of the related unit.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 -- * Invocation graph - A directed graph which models the flow of execution
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 -- at elaboration time.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 -- - Vertices - Invocation constructs plus extra information. Certain
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 -- vertices act as elaboration roots.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 -- - Edges - Invocation relations plus extra information.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 -- * Invocation relation - A flow link between two invocation constructs.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 -- This link is encoded in the ALI file of unit that houses the invoker.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 -- * Invocation signature - A set of attributes that uniquely identify an
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 -- invocation construct within the namespace of all ALI files.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 -- * Invoker - The source construct of an invocation relation (the caller,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132 -- instantiator, or task activator).
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 -- * Library graph - A directed graph which captures with clause and pragma
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 -- dependencies between units.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 -- - Vertices - Units plus extra information.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 -- - Edges - With clause, pragma, and additional dependencies between
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 -- units.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 -- * Pending predecessor - A vertex that must be elaborated before another
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 -- vertex can be elaborated.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 -- * Strong edge - A non-invocation library graph edge. Strong edges
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 -- represent the language-defined relations between units.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 -- * Strong predecessor - A library graph vertex reachable via a strong
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 -- edge.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 -- * Target - The destination construct of an invocation relation (the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 -- generic, subprogram, or task type).
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 -- * Weak edge - An invocation library graph edge. Weak edges represent
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 -- the speculative flow of execution at elaboration time, which may or
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 -- may not take place.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 -- * Weak predecessor - A library graph vertex reachable via a weak edge.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 -- * Weakly elaborable vertex - A vertex that is waiting solely on weak
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 -- predecessors to be elaborated, and whose component is elaborable.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 ------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 -- Architecture --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 ------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 -- Find_Elaboration_Order
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 -- |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 -- +--> Collect_Elaborable_Units
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 -- +--> Write_ALI_Tables
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171 -- +--> Elaborate_Units
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 -- |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 -- +------ | -------------- Construction phase ------------------------+
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 -- | | |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 -- | +--> Build_Library_Graph |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176 -- | +--> Validate_Library_Graph |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 -- | +--> Write_Library_Graph |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178 -- | | |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 -- | +--> Build_Invocation_Graph |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 -- | +--> Validate_Invocation_Graph |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 -- | +--> Write_Invocation_Graph |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 -- | | |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 -- +------ | ----------------------------------------------------------+
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 -- |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 -- +------ | -------------- Augmentation phase ------------------------+
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186 -- | | |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 -- | +--> Augment_Library_Graph |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 -- | | |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 -- +------ | ----------------------------------------------------------+
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 -- |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191 -- +------ | -------------- Ordering phase ----------------------------+
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 -- | | |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 -- | +--> Find_Components |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194 -- | | |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 -- | +--> Elaborate_Library_Graph |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196 -- | +--> Validate_Elaboration_Order |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 -- | +--> Write_Elaboration_Order |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 -- | | |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 -- | +--> Write_Unit_Closure |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200 -- | | |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 -- +------ | ----------------------------------------------------------+
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 -- |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203 -- +------ | -------------- Diagnostics phase -------------------------+
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 -- | | |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 -- | +--> Find_Cycles |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 -- | +--> Validate_Cycles |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207 -- | +--> Write_Cycles |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208 -- | | |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 -- | +--> Diagnose_Cycle / Diagnose_All_Cycles |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210 -- | |
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 -- +-------------------------------------------------------------------+
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 ------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 -- Construction phase --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215 ------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 -- The Construction phase has the following objectives:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219 -- * Build the library graph by inspecting the ALI file of each unit that
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 -- requires elaboration.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 -- * Validate the consistency of the library graph, only when switch -d_V
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 -- is in effect.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 -- * Write the contents of the invocation graph in human-readable form to
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 -- standard output when switch -d_L is in effect.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 -- * Build the invocation graph by inspecting invocation constructs and
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229 -- relations in the ALI file of each unit that requires elaboration.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231 -- * Validate the consistency of the invocation graph, only when switch
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 -- -d_V is in effect.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 -- * Write the contents of the invocation graph in human-readable form to
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 -- standard output when switch -d_I is in effect.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 ------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 -- Augmentation phase --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239 ------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 -- The Augmentation phase has the following objectives:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 -- * Discover transitions of the elaboration flow from a unit with an
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244 -- elaboration root to other units. Augment the library graph with
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245 -- extra edges for each such transition.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247 --------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248 -- Ordering phase --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249 --------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 -- The Ordering phase has the following objectives:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253 -- * Discover all components of the library graph by treating specs and
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 -- bodies as single vertices.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 -- * Try to order as many vertices of the library graph as possible by
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 -- performing a topological sort based on the pending predecessors of
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258 -- vertices across all components and within a single component.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 -- * Validate the consistency of the order, only when switch -d_V is in
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 -- effect.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263 -- * Write the contents of the order in human-readable form to standard
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 -- output when switch -d_O is in effect.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 -- * Write the sources of the order closure when switch -R is in effect.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268 -----------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269 -- Diagnostics phase --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270 -----------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 -- The Diagnostics phase has the following objectives:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274 -- * Discover, save, and sort all cycles in the library graph. The cycles
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275 -- are sorted based on the following heuristics:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277 -- - A cycle with higher precedence is preferred.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 -- - A cycle with fewer invocation edges is preferred.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281 -- - A cycle with a shorter length is preferred.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 -- * Validate the consistency of cycles, only when switch -d_V is in
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284 -- effect.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286 -- * Write the contents of all cycles in human-readable form to standard
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287 -- output when switch -d_O is in effect.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289 -- * Diagnose the most important cycle, or all cycles when switch -d_C is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290 -- in effect. The diagnostic consists of:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
292 -- - The reason for the existence of the cycle, along with the unit
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
293 -- whose elaboration cannot be guaranteed.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
294 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
295 -- - A detailed traceback of the cycle, showcasing the transition
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
296 -- between units, along with any other elaboration-order-related
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
297 -- information.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
298 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
299 -- - A set of suggestions on how to break the cycle considering the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
300 -- the edges comprising the circuit, the elaboration model used to
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
301 -- compile the units, the availability of invocation information,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
302 -- and the state of various relevant switches.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
303
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
304 --------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
305 -- Switches --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
306 --------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
307
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
308 -- -d_a Ignore the effects of pragma Elaborate_All
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
309 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
310 -- GNATbind creates a regular with edge instead of an Elaborate_All
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
311 -- edge in the library graph, thus eliminating the effects of the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
312 -- pragma.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
313 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
314 -- -d_b Ignore the effects of pragma Elaborate_Body
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
315 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
316 -- GNATbind treats a spec and body pair as decoupled.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
317 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
318 -- -d_e Ignore the effects of pragma Elaborate
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
319 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
320 -- GNATbind creates a regular with edge instead of an Elaborate edge
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
321 -- in the library graph, thus eliminating the effects of the pragma.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
322 -- In addition, GNATbind does not create an edge to the body of the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
323 -- pragma argument.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
324 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
325 -- -d_t Output cycle-detection trace information
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
326 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
327 -- GNATbind outputs trace information on cycle-detection activities
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
328 -- to standard output.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
329 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
330 -- -d_A Output ALI invocation tables
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
331 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
332 -- GNATbind outputs the contents of ALI table Invocation_Constructs
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
333 -- and Invocation_Edges in textual format to standard output.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
334 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
335 -- -d_C Diagnose all cycles
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
336 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
337 -- GNATbind outputs diagnostics for all unique cycles in the bind,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
338 -- rather than just the most important one.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
339 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
340 -- -d_I Output invocation graph
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
341 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
342 -- GNATbind outputs the invocation graph in text format to standard
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
343 -- output.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
344 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
345 -- -d_L Output library graph
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
346 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
347 -- GNATbind outputs the library graph in textual format to standard
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
348 -- output.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
349 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
350 -- -d_P Output cycle paths
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
351 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
352 -- GNATbind outputs the cycle paths in text format to standard output
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
353 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
354 -- -d_S Output elaboration-order status information
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
355 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
356 -- GNATbind outputs trace information concerning the status of its
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
357 -- various phases to standard output.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
358 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
359 -- -d_T Output elaboration-order trace information
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
360 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
361 -- GNATbind outputs trace information on elaboration-order detection
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
362 -- activities to standard output.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
363 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
364 -- -d_V Validate bindo cycles, graphs, and order
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
365 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
366 -- GNATbind validates the invocation graph, library graph along with
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
367 -- its cycles, and elaboration order by detecting inconsistencies and
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
368 -- producing error reports.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
369 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
370 -- -e Output complete list of elaboration-order dependencies
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
371 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
372 -- GNATbind outputs the dependencies between units to standard
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
373 -- output.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
374 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
375 -- -f Force elaboration order from given file
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
376 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
377 -- GNATbind applies an additional set of edges to the library graph.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
378 -- The edges are read from a file specified by the argument of the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
379 -- flag.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
380 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
381 -- -H Legacy elaboration-order model enabled
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
382 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
383 -- GNATbind uses the library-graph and heuristics-based elaboration-
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
384 -- order model.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
385 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
386 -- -l Output chosen elaboration order
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
387 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
388 -- GNATbind outputs the elaboration order in text format to standard
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
389 -- output.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
390 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
391 -- -p Pessimistic (worst-case) elaboration order
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
392 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
393 -- This switch is not used in Bindo and its children.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
394
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
395 ----------------------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
396 -- Debugging elaboration-order issues --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
397 ----------------------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
398
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
399 -- Prior to debugging elaboration-order-related issues, enable all relevant
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
400 -- debug flags to collect as much information as possible. Depending on the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
401 -- number of files in the bind, Bindo may emit anywhere between several MBs
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
402 -- to several hundred MBs of data to standard output. The switches are:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
403 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
404 -- -d_A -d_C -d_I -d_L -d_P -d_t -d_T -d_V
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
405 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
406 -- Bindo offers several debugging routines that can be invoked from gdb.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
407 -- Those are defined in the body of Bindo.Writers, in sections denoted by
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
408 -- header Debug. For quick reference, the routines are:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
409 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
410 -- palgc -- print all library-graph cycles
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
411 -- pau -- print all units
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
412 -- pc -- print component
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
413 -- pige -- print invocation-graph edge
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
414 -- pigv -- print invocation-graph vertex
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
415 -- plgc -- print library-graph cycle
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
416 -- plge -- print library-graph edge
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
417 -- plgv -- print library-graph vertex
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
418 -- pu -- print units
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
419 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
420 -- * Apparent infinite loop
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
421 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
422 -- The elaboration order mechanism appears to be stuck in an infinite
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
423 -- loop. Use switch -d_S to output the status of each elaboration phase.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
424 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
425 -- * Invalid elaboration order
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
426 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
427 -- The elaboration order is invalid when:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
428 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
429 -- - A unit that requires elaboration is missing from the order
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
430 -- - A unit that does not require elaboration is present in the order
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
431 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
432 -- Examine the output of the elaboration algorithm available via switch
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
433 -- -d_T to determine how the related units were included in or excluded
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
434 -- from the order. Determine whether the library graph contains all the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
435 -- relevant edges for those units.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
436 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
437 -- Units and routines of interest:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
438 -- Bindo.Elaborators
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
439 -- Elaborate_Library_Graph
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
440 -- Elaborate_Units
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
441 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
442 -- * Invalid invocation graph
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
443 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
444 -- The invocation graph is invalid when:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
445 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
446 -- - An edge lacks an attribute
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
447 -- - A vertex lacks an attribute
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
448 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
449 -- Find the malformed edge or vertex and determine which attribute is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
450 -- missing. Examine the contents of the invocation-related ALI tables
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
451 -- available via switch -d_A. If the invocation construct or relation
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
452 -- is missing, verify the ALI file. If the ALI lacks all the relevant
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
453 -- information, then Sem_Elab most likely failed to discover a valid
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
454 -- elaboration path.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
455 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
456 -- Units and routines of interest:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
457 -- Bindo.Builders
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
458 -- Bindo.Graphs
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
459 -- Add_Edge
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
460 -- Add_Vertex
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
461 -- Build_Invocation_Graph
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
462 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
463 -- * Invalid library graph
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
464 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
465 -- The library graph is invalid when:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
466 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
467 -- - An edge lacks an attribute
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
468 -- - A vertex lacks an attribute
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
469 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
470 -- Find the malformed edge or vertex and determine which attribute is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
471 -- missing.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
472 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
473 -- Units and routines of interest:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
474 -- Bindo.Builders
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
475 -- Bindo.Graphs
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
476 -- Add_Edge
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
477 -- Add_Vertex
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
478 -- Build_Library_Graph
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
479 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
480 -- * Invalid library-graph cycle
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
481 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
482 -- A library-graph cycle is invalid when:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
483 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
484 -- - It lacks enough edges to form a circuit
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
485 -- - At least one edge in the circuit is repeated
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
486 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
487 -- Find the malformed cycle and determine which attribute is missing.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
488 --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
489 -- Units and routines of interest:
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
490 -- Bindo.Graphs
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
491 -- Find_Cycles
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
492
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
493 ----------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
494 -- Find_Elaboration_Order --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
495 ----------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
496
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
497 procedure Find_Elaboration_Order
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
498 (Order : out Unit_Id_Table;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
499 Main_Lib_File : File_Name_Type)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
500 is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
501 begin
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
502 -- Use the library graph and heuristic-based elaboration order when
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
503 -- switch -H (legacy elaboration-order mode enabled).
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
504
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
505 if Legacy_Elaboration_Order then
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
506 Binde.Find_Elab_Order (Order, Main_Lib_File);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
507
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
508 -- Otherwise use the invocation and library-graph-based elaboration
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
509 -- order.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
510
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
511 else
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
512 Invocation_And_Library_Graph_Elaborators.Elaborate_Units
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
513 (Order => Order,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
514 Main_Lib_File => Main_Lib_File);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
515 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
516 end Find_Elaboration_Order;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
517
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
518 end Bindo;