annotate gcc/ada/bindo-units.ads @ 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 . U N I T S --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 -- --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 -- S p e c --
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 -- For full architecture, see unit Bindo.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 -- The following unit contains facilities to collect all elaborable units in
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 -- the bind and inspect their properties.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 with GNAT; use GNAT;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 with GNAT.Sets; use GNAT.Sets;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 package Bindo.Units is
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 ---------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 -- Unit sets --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 ---------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 function Hash_Unit (U_Id : Unit_Id) return Bucket_Range_Type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 pragma Inline (Hash_Unit);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 -- Obtain the hash value of key U_Id
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 package Unit_Sets is new Membership_Sets
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 (Element_Type => Unit_Id,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 "=" => "=",
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 Hash => Hash_Unit);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 procedure Collect_Elaborable_Units;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 pragma Inline (Collect_Elaborable_Units);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 -- Gather all units in the bind that require elaboration. The units are
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 -- accessible via iterator Elaborable_Units_Iterator.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 function Corresponding_Body (U_Id : Unit_Id) return Unit_Id;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 pragma Inline (Corresponding_Body);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 -- Return the body of a spec unit U_Id
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 function Corresponding_Spec (U_Id : Unit_Id) return Unit_Id;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 pragma Inline (Corresponding_Spec);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 -- Return the spec of a body unit U_Id
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 function Corresponding_Unit (FNam : File_Name_Type) return Unit_Id;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 pragma Inline (Corresponding_Unit);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 -- Obtain the unit which corresponds to name FNam
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 function Corresponding_Unit (UNam : Unit_Name_Type) return Unit_Id;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 pragma Inline (Corresponding_Unit);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 -- Obtain the unit which corresponds to name FNam
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 function File_Name (U_Id : Unit_Id) return File_Name_Type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 pragma Inline (File_Name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 -- Obtain the file name of unit U_Id
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 type Unit_Processor_Ptr is access procedure (U_Id : Unit_Id);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 procedure For_Each_Elaborable_Unit (Processor : Unit_Processor_Ptr);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 pragma Inline (For_Each_Elaborable_Unit);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 -- Invoke Processor on each elaborable unit in the bind
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 procedure For_Each_Unit (Processor : Unit_Processor_Ptr);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 pragma Inline (For_Each_Unit);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 -- Invoke Processor on each unit in the bind
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 function Has_No_Elaboration_Code (U_Id : Unit_Id) return Boolean;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 pragma Inline (Has_No_Elaboration_Code);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 -- Determine whether unit U_Id lacks elaboration code
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 function Hash_Invocation_Signature
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 (IS_Id : Invocation_Signature_Id) return Bucket_Range_Type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 pragma Inline (Hash_Invocation_Signature);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 -- Obtain the hash value of key IS_Id
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 function Invocation_Graph_Encoding
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94 (U_Id : Unit_Id) return Invocation_Graph_Encoding_Kind;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 pragma Inline (Invocation_Graph_Encoding);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 -- Obtain the encoding format used to capture invocation constructs and
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 -- relations in the ALI file of unit U_Id.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 function Is_Dynamically_Elaborated (U_Id : Unit_Id) return Boolean;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 pragma Inline (Is_Dynamically_Elaborated);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 -- Determine whether unit U_Id was compiled using the dynamic elaboration
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 -- model.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 function Is_Internal_Unit (U_Id : Unit_Id) return Boolean;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 pragma Inline (Is_Internal_Unit);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 -- Determine whether unit U_Id is internal
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 function Is_Predefined_Unit (U_Id : Unit_Id) return Boolean;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 pragma Inline (Is_Predefined_Unit);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 -- Determine whether unit U_Id is predefined
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 function Name (U_Id : Unit_Id) return Unit_Name_Type;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 pragma Inline (Name);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 -- Obtain the name of unit U_Id
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 function Needs_Elaboration (IS_Id : Invocation_Signature_Id) return Boolean;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 pragma Inline (Needs_Elaboration);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 -- Determine whether invocation signature IS_Id belongs to a construct that
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 -- appears in a unit which needs to be elaborated.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 function Needs_Elaboration (U_Id : Unit_Id) return Boolean;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 pragma Inline (Needs_Elaboration);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 -- Determine whether unit U_Id needs to be elaborated
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 function Number_Of_Elaborable_Units return Natural;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 pragma Inline (Number_Of_Elaborable_Units);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 -- Obtain the number of units in the bind that need to be elaborated
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 function Number_Of_Units return Natural;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130 pragma Inline (Number_Of_Units);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 -- Obtain the number of units in the bind
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 ---------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 -- Iterators --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 ---------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 -- The following type represents an iterator over all units that need to be
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 -- elaborated.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 type Elaborable_Units_Iterator is private;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142 function Has_Next (Iter : Elaborable_Units_Iterator) return Boolean;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 pragma Inline (Has_Next);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144 -- Determine whether iterator Iter has more units to examine
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 function Iterate_Elaborable_Units return Elaborable_Units_Iterator;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 pragma Inline (Iterate_Elaborable_Units);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 -- Obtain an iterator over all units that need to be elaborated
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 procedure Next
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 (Iter : in out Elaborable_Units_Iterator;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 U_Id : out Unit_Id);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 pragma Inline (Next);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154 -- Return the current unit referenced by iterator Iter and advance to the
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 -- next available unit.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 -----------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 -- Maintenance --
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 -----------------
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 procedure Finalize_Units;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 pragma Inline (Finalize_Units);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 -- Destroy the internal structures of this unit
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 procedure Initialize_Units;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 pragma Inline (Initialize_Units);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 -- Initialize the internal structures of this unit
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 private
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 type Elaborable_Units_Iterator is new Unit_Sets.Iterator;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 end Bindo.Units;