annotate gcc/ada/repinfo.adb @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 ------------------------------------------------------------------------------
kono
parents:
diff changeset
2 -- --
kono
parents:
diff changeset
3 -- GNAT COMPILER COMPONENTS --
kono
parents:
diff changeset
4 -- --
kono
parents:
diff changeset
5 -- R E P I N F O --
kono
parents:
diff changeset
6 -- --
kono
parents:
diff changeset
7 -- B o d y --
kono
parents:
diff changeset
8 -- --
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
9 -- Copyright (C) 1999-2019, Free Software Foundation, Inc. --
111
kono
parents:
diff changeset
10 -- --
kono
parents:
diff changeset
11 -- GNAT is free software; you can redistribute it and/or modify it under --
kono
parents:
diff changeset
12 -- terms of the GNU General Public License as published by the Free Soft- --
kono
parents:
diff changeset
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
kono
parents:
diff changeset
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
kono
parents:
diff changeset
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
kono
parents:
diff changeset
16 -- or FITNESS FOR A PARTICULAR PURPOSE. --
kono
parents:
diff changeset
17 -- --
kono
parents:
diff changeset
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
kono
parents:
diff changeset
19 -- additional permissions described in the GCC Runtime Library Exception, --
kono
parents:
diff changeset
20 -- version 3.1, as published by the Free Software Foundation. --
kono
parents:
diff changeset
21 -- --
kono
parents:
diff changeset
22 -- You should have received a copy of the GNU General Public License and --
kono
parents:
diff changeset
23 -- a copy of the GCC Runtime Library Exception along with this program; --
kono
parents:
diff changeset
24 -- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
kono
parents:
diff changeset
25 -- <http://www.gnu.org/licenses/>. --
kono
parents:
diff changeset
26 -- --
kono
parents:
diff changeset
27 -- GNAT was originally developed by the GNAT team at New York University. --
kono
parents:
diff changeset
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
kono
parents:
diff changeset
29 -- --
kono
parents:
diff changeset
30 ------------------------------------------------------------------------------
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 with Alloc;
kono
parents:
diff changeset
33 with Atree; use Atree;
kono
parents:
diff changeset
34 with Casing; use Casing;
kono
parents:
diff changeset
35 with Debug; use Debug;
kono
parents:
diff changeset
36 with Einfo; use Einfo;
kono
parents:
diff changeset
37 with Lib; use Lib;
kono
parents:
diff changeset
38 with Namet; use Namet;
kono
parents:
diff changeset
39 with Nlists; use Nlists;
kono
parents:
diff changeset
40 with Opt; use Opt;
kono
parents:
diff changeset
41 with Output; use Output;
kono
parents:
diff changeset
42 with Sem_Aux; use Sem_Aux;
kono
parents:
diff changeset
43 with Sinfo; use Sinfo;
kono
parents:
diff changeset
44 with Sinput; use Sinput;
kono
parents:
diff changeset
45 with Snames; use Snames;
kono
parents:
diff changeset
46 with Stringt; use Stringt;
kono
parents:
diff changeset
47 with Table;
kono
parents:
diff changeset
48 with Uname; use Uname;
kono
parents:
diff changeset
49 with Urealp; use Urealp;
kono
parents:
diff changeset
50
kono
parents:
diff changeset
51 with Ada.Unchecked_Conversion;
kono
parents:
diff changeset
52
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
53 with GNAT.HTable;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
54
111
kono
parents:
diff changeset
55 package body Repinfo is
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 SSU : constant := 8;
kono
parents:
diff changeset
58 -- Value for Storage_Unit, we do not want to get this from TTypes, since
kono
parents:
diff changeset
59 -- this introduces problematic dependencies in ASIS, and in any case this
kono
parents:
diff changeset
60 -- value is assumed to be 8 for the implementation of the DDA.
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 ---------------------------------------
kono
parents:
diff changeset
63 -- Representation of GCC Expressions --
kono
parents:
diff changeset
64 ---------------------------------------
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 -- A table internal to this unit is used to hold the values of back
kono
parents:
diff changeset
67 -- annotated expressions. This table is written out by -gnatt and read
kono
parents:
diff changeset
68 -- back in for ASIS processing.
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 -- Node values are stored as Uint values using the negative of the node
kono
parents:
diff changeset
71 -- index in this table. Constants appear as non-negative Uint values.
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 type Exp_Node is record
kono
parents:
diff changeset
74 Expr : TCode;
kono
parents:
diff changeset
75 Op1 : Node_Ref_Or_Val;
kono
parents:
diff changeset
76 Op2 : Node_Ref_Or_Val;
kono
parents:
diff changeset
77 Op3 : Node_Ref_Or_Val;
kono
parents:
diff changeset
78 end record;
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 -- The following representation clause ensures that the above record
kono
parents:
diff changeset
81 -- has no holes. We do this so that when instances of this record are
kono
parents:
diff changeset
82 -- written by Tree_Gen, we do not write uninitialized values to the file.
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 for Exp_Node use record
kono
parents:
diff changeset
85 Expr at 0 range 0 .. 31;
kono
parents:
diff changeset
86 Op1 at 4 range 0 .. 31;
kono
parents:
diff changeset
87 Op2 at 8 range 0 .. 31;
kono
parents:
diff changeset
88 Op3 at 12 range 0 .. 31;
kono
parents:
diff changeset
89 end record;
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 for Exp_Node'Size use 16 * 8;
kono
parents:
diff changeset
92 -- This ensures that we did not leave out any fields
kono
parents:
diff changeset
93
kono
parents:
diff changeset
94 package Rep_Table is new Table.Table (
kono
parents:
diff changeset
95 Table_Component_Type => Exp_Node,
kono
parents:
diff changeset
96 Table_Index_Type => Nat,
kono
parents:
diff changeset
97 Table_Low_Bound => 1,
kono
parents:
diff changeset
98 Table_Initial => Alloc.Rep_Table_Initial,
kono
parents:
diff changeset
99 Table_Increment => Alloc.Rep_Table_Increment,
kono
parents:
diff changeset
100 Table_Name => "BE_Rep_Table");
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 --------------------------------------------------------------
kono
parents:
diff changeset
103 -- Representation of Front-End Dynamic Size/Offset Entities --
kono
parents:
diff changeset
104 --------------------------------------------------------------
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 package Dynamic_SO_Entity_Table is new Table.Table (
kono
parents:
diff changeset
107 Table_Component_Type => Entity_Id,
kono
parents:
diff changeset
108 Table_Index_Type => Nat,
kono
parents:
diff changeset
109 Table_Low_Bound => 1,
kono
parents:
diff changeset
110 Table_Initial => Alloc.Rep_Table_Initial,
kono
parents:
diff changeset
111 Table_Increment => Alloc.Rep_Table_Increment,
kono
parents:
diff changeset
112 Table_Name => "FE_Rep_Table");
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 Unit_Casing : Casing_Type;
kono
parents:
diff changeset
115 -- Identifier casing for current unit. This is set by List_Rep_Info for
kono
parents:
diff changeset
116 -- each unit, before calling subprograms which may read it.
kono
parents:
diff changeset
117
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
118 Need_Separator : Boolean;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
119 -- Set True if a separator is needed before outputting any information for
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
120 -- the current entity.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
121
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
122 ------------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
123 -- Set of Relevant Entities --
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
124 ------------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
125
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
126 Relevant_Entities_Size : constant := 4093;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
127 -- Number of headers in hash table
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
128
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
129 subtype Entity_Header_Num is Integer range 0 .. Relevant_Entities_Size - 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
130 -- Range of headers in hash table
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
131
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
132 function Entity_Hash (Id : Entity_Id) return Entity_Header_Num;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
133 -- Simple hash function for Entity_Ids
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
134
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
135 package Relevant_Entities is new GNAT.Htable.Simple_HTable
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
136 (Header_Num => Entity_Header_Num,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
137 Element => Boolean,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
138 No_Element => False,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
139 Key => Entity_Id,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
140 Hash => Entity_Hash,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
141 Equal => "=");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
142 -- Hash table to record which compiler-generated entities are relevant
111
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 -----------------------
kono
parents:
diff changeset
145 -- Local Subprograms --
kono
parents:
diff changeset
146 -----------------------
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148 function Back_End_Layout return Boolean;
kono
parents:
diff changeset
149 -- Test for layout mode, True = back end, False = front end. This function
kono
parents:
diff changeset
150 -- is used rather than checking the configuration parameter because we do
kono
parents:
diff changeset
151 -- not want Repinfo to depend on Targparm (for ASIS)
kono
parents:
diff changeset
152
kono
parents:
diff changeset
153 procedure List_Entities
kono
parents:
diff changeset
154 (Ent : Entity_Id;
kono
parents:
diff changeset
155 Bytes_Big_Endian : Boolean;
kono
parents:
diff changeset
156 In_Subprogram : Boolean := False);
kono
parents:
diff changeset
157 -- This procedure lists the entities associated with the entity E, starting
kono
parents:
diff changeset
158 -- with the First_Entity and using the Next_Entity link. If a nested
kono
parents:
diff changeset
159 -- package is found, entities within the package are recursively processed.
kono
parents:
diff changeset
160 -- When recursing within a subprogram body, Is_Subprogram suppresses
kono
parents:
diff changeset
161 -- duplicate information about signature.
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 procedure List_Name (Ent : Entity_Id);
kono
parents:
diff changeset
164 -- List name of entity Ent in appropriate case. The name is listed with
kono
parents:
diff changeset
165 -- full qualification up to but not including the compilation unit name.
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 procedure List_Array_Info (Ent : Entity_Id; Bytes_Big_Endian : Boolean);
kono
parents:
diff changeset
168 -- List representation info for array type Ent
kono
parents:
diff changeset
169
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
170 procedure List_Common_Type_Info (Ent : Entity_Id);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
171 -- List common type info (name, size, alignment) for type Ent
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
172
111
kono
parents:
diff changeset
173 procedure List_Linker_Section (Ent : Entity_Id);
kono
parents:
diff changeset
174 -- List linker section for Ent (caller has checked that Ent is an entity
kono
parents:
diff changeset
175 -- for which the Linker_Section_Pragma field is defined).
kono
parents:
diff changeset
176
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
177 procedure List_Location (Ent : Entity_Id);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
178 -- List location information for Ent
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
179
111
kono
parents:
diff changeset
180 procedure List_Object_Info (Ent : Entity_Id);
kono
parents:
diff changeset
181 -- List representation info for object Ent
kono
parents:
diff changeset
182
kono
parents:
diff changeset
183 procedure List_Record_Info (Ent : Entity_Id; Bytes_Big_Endian : Boolean);
kono
parents:
diff changeset
184 -- List representation info for record type Ent
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 procedure List_Scalar_Storage_Order
kono
parents:
diff changeset
187 (Ent : Entity_Id;
kono
parents:
diff changeset
188 Bytes_Big_Endian : Boolean);
kono
parents:
diff changeset
189 -- List scalar storage order information for record or array type Ent.
kono
parents:
diff changeset
190 -- Also includes bit order information for record types, if necessary.
kono
parents:
diff changeset
191
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
192 procedure List_Subprogram_Info (Ent : Entity_Id);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
193 -- List subprogram info for subprogram Ent
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
194
111
kono
parents:
diff changeset
195 procedure List_Type_Info (Ent : Entity_Id);
kono
parents:
diff changeset
196 -- List type info for type Ent
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 function Rep_Not_Constant (Val : Node_Ref_Or_Val) return Boolean;
kono
parents:
diff changeset
199 -- Returns True if Val represents a variable value, and False if it
kono
parents:
diff changeset
200 -- represents a value that is fixed at compile time.
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 procedure Spaces (N : Natural);
kono
parents:
diff changeset
203 -- Output given number of spaces
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 procedure Write_Info_Line (S : String);
kono
parents:
diff changeset
206 -- Routine to write a line to Repinfo output file. This routine is passed
kono
parents:
diff changeset
207 -- as a special output procedure to Output.Set_Special_Output. Note that
kono
parents:
diff changeset
208 -- Write_Info_Line is called with an EOL character at the end of each line,
kono
parents:
diff changeset
209 -- as per the Output spec, but the internal call to the appropriate routine
kono
parents:
diff changeset
210 -- in Osint requires that the end of line sequence be stripped off.
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 procedure Write_Mechanism (M : Mechanism_Type);
kono
parents:
diff changeset
213 -- Writes symbolic string for mechanism represented by M
kono
parents:
diff changeset
214
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
215 procedure Write_Separator;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
216 -- Called before outputting anything for an entity. Ensures that
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
217 -- a separator precedes the output for a particular entity.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
218
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
219 procedure Write_Unknown_Val;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
220 -- Writes symbolic string for an unknown or non-representable value
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
221
111
kono
parents:
diff changeset
222 procedure Write_Val (Val : Node_Ref_Or_Val; Paren : Boolean := False);
kono
parents:
diff changeset
223 -- Given a representation value, write it out. No_Uint values or values
kono
parents:
diff changeset
224 -- dependent on discriminants are written as two question marks. If the
kono
parents:
diff changeset
225 -- flag Paren is set, then the output is surrounded in parentheses if it is
kono
parents:
diff changeset
226 -- other than a simple value.
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 ---------------------
kono
parents:
diff changeset
229 -- Back_End_Layout --
kono
parents:
diff changeset
230 ---------------------
kono
parents:
diff changeset
231
kono
parents:
diff changeset
232 function Back_End_Layout return Boolean is
kono
parents:
diff changeset
233 begin
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
234 -- We have back-end layout if the back end has made any entries in the
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
235 -- table of GCC expressions, otherwise we have front-end layout.
111
kono
parents:
diff changeset
236
kono
parents:
diff changeset
237 return Rep_Table.Last > 0;
kono
parents:
diff changeset
238 end Back_End_Layout;
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 ------------------------
kono
parents:
diff changeset
241 -- Create_Discrim_Ref --
kono
parents:
diff changeset
242 ------------------------
kono
parents:
diff changeset
243
kono
parents:
diff changeset
244 function Create_Discrim_Ref (Discr : Entity_Id) return Node_Ref is
kono
parents:
diff changeset
245 begin
kono
parents:
diff changeset
246 return Create_Node
kono
parents:
diff changeset
247 (Expr => Discrim_Val,
kono
parents:
diff changeset
248 Op1 => Discriminant_Number (Discr));
kono
parents:
diff changeset
249 end Create_Discrim_Ref;
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 ---------------------------
kono
parents:
diff changeset
252 -- Create_Dynamic_SO_Ref --
kono
parents:
diff changeset
253 ---------------------------
kono
parents:
diff changeset
254
kono
parents:
diff changeset
255 function Create_Dynamic_SO_Ref (E : Entity_Id) return Dynamic_SO_Ref is
kono
parents:
diff changeset
256 begin
kono
parents:
diff changeset
257 Dynamic_SO_Entity_Table.Append (E);
kono
parents:
diff changeset
258 return UI_From_Int (-Dynamic_SO_Entity_Table.Last);
kono
parents:
diff changeset
259 end Create_Dynamic_SO_Ref;
kono
parents:
diff changeset
260
kono
parents:
diff changeset
261 -----------------
kono
parents:
diff changeset
262 -- Create_Node --
kono
parents:
diff changeset
263 -----------------
kono
parents:
diff changeset
264
kono
parents:
diff changeset
265 function Create_Node
kono
parents:
diff changeset
266 (Expr : TCode;
kono
parents:
diff changeset
267 Op1 : Node_Ref_Or_Val;
kono
parents:
diff changeset
268 Op2 : Node_Ref_Or_Val := No_Uint;
kono
parents:
diff changeset
269 Op3 : Node_Ref_Or_Val := No_Uint) return Node_Ref
kono
parents:
diff changeset
270 is
kono
parents:
diff changeset
271 begin
kono
parents:
diff changeset
272 Rep_Table.Append (
kono
parents:
diff changeset
273 (Expr => Expr,
kono
parents:
diff changeset
274 Op1 => Op1,
kono
parents:
diff changeset
275 Op2 => Op2,
kono
parents:
diff changeset
276 Op3 => Op3));
kono
parents:
diff changeset
277 return UI_From_Int (-Rep_Table.Last);
kono
parents:
diff changeset
278 end Create_Node;
kono
parents:
diff changeset
279
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
280 -----------------
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
281 -- Entity_Hash --
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
282 -----------------
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
283
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
284 function Entity_Hash (Id : Entity_Id) return Entity_Header_Num is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
285 begin
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
286 return Entity_Header_Num (Id mod Relevant_Entities_Size);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
287 end Entity_Hash;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
288
111
kono
parents:
diff changeset
289 ---------------------------
kono
parents:
diff changeset
290 -- Get_Dynamic_SO_Entity --
kono
parents:
diff changeset
291 ---------------------------
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 function Get_Dynamic_SO_Entity (U : Dynamic_SO_Ref) return Entity_Id is
kono
parents:
diff changeset
294 begin
kono
parents:
diff changeset
295 return Dynamic_SO_Entity_Table.Table (-UI_To_Int (U));
kono
parents:
diff changeset
296 end Get_Dynamic_SO_Entity;
kono
parents:
diff changeset
297
kono
parents:
diff changeset
298 -----------------------
kono
parents:
diff changeset
299 -- Is_Dynamic_SO_Ref --
kono
parents:
diff changeset
300 -----------------------
kono
parents:
diff changeset
301
kono
parents:
diff changeset
302 function Is_Dynamic_SO_Ref (U : SO_Ref) return Boolean is
kono
parents:
diff changeset
303 begin
kono
parents:
diff changeset
304 return U < Uint_0;
kono
parents:
diff changeset
305 end Is_Dynamic_SO_Ref;
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 ----------------------
kono
parents:
diff changeset
308 -- Is_Static_SO_Ref --
kono
parents:
diff changeset
309 ----------------------
kono
parents:
diff changeset
310
kono
parents:
diff changeset
311 function Is_Static_SO_Ref (U : SO_Ref) return Boolean is
kono
parents:
diff changeset
312 begin
kono
parents:
diff changeset
313 return U >= Uint_0;
kono
parents:
diff changeset
314 end Is_Static_SO_Ref;
kono
parents:
diff changeset
315
kono
parents:
diff changeset
316 ---------
kono
parents:
diff changeset
317 -- lgx --
kono
parents:
diff changeset
318 ---------
kono
parents:
diff changeset
319
kono
parents:
diff changeset
320 procedure lgx (U : Node_Ref_Or_Val) is
kono
parents:
diff changeset
321 begin
kono
parents:
diff changeset
322 List_GCC_Expression (U);
kono
parents:
diff changeset
323 Write_Eol;
kono
parents:
diff changeset
324 end lgx;
kono
parents:
diff changeset
325
kono
parents:
diff changeset
326 ----------------------
kono
parents:
diff changeset
327 -- List_Array_Info --
kono
parents:
diff changeset
328 ----------------------
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 procedure List_Array_Info (Ent : Entity_Id; Bytes_Big_Endian : Boolean) is
kono
parents:
diff changeset
331 begin
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
332 Write_Separator;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
333
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
334 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
335 Write_Line ("{");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
336 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
337
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
338 List_Common_Type_Info (Ent);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
339
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
340 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
341 Write_Line (",");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
342 Write_Str (" ""Component_Size"": ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
343 Write_Val (Component_Size (Ent));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
344 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
345 Write_Str ("for ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
346 List_Name (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
347 Write_Str ("'Component_Size use ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
348 Write_Val (Component_Size (Ent));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
349 Write_Line (";");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
350 end if;
111
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 List_Scalar_Storage_Order (Ent, Bytes_Big_Endian);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
353
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
354 List_Linker_Section (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
355
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
356 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
357 Write_Eol;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
358 Write_Line ("}");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
359 end if;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
360
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
361 -- The component type is relevant for an array
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
362
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
363 if List_Representation_Info = 4
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
364 and then Is_Itype (Component_Type (Base_Type (Ent)))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
365 then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
366 Relevant_Entities.Set (Component_Type (Base_Type (Ent)), True);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
367 end if;
111
kono
parents:
diff changeset
368 end List_Array_Info;
kono
parents:
diff changeset
369
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
370 ---------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
371 -- List_Common_Type_Info --
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
372 ---------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
373
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
374 procedure List_Common_Type_Info (Ent : Entity_Id) is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
375 begin
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
376 if List_Representation_Info_To_JSON then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
377 Write_Str (" ""name"": """);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
378 List_Name (Ent);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
379 Write_Line (""",");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
380 List_Location (Ent);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
381 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
382
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
383 -- Do not list size info for unconstrained arrays, not meaningful
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
384
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
385 if Is_Array_Type (Ent) and then not Is_Constrained (Ent) then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
386 null;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
387
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
388 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
389 -- If Esize and RM_Size are the same, list as Size. This is a common
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
390 -- case, which we may as well list in simple form.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
391
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
392 if Esize (Ent) = RM_Size (Ent) then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
393 if List_Representation_Info_To_JSON then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
394 Write_Str (" ""Size"": ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
395 Write_Val (Esize (Ent));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
396 Write_Line (",");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
397 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
398 Write_Str ("for ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
399 List_Name (Ent);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
400 Write_Str ("'Size use ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
401 Write_Val (Esize (Ent));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
402 Write_Line (";");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
403 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
404
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
405 -- Otherwise list size values separately
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
406
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
407 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
408 if List_Representation_Info_To_JSON then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
409 Write_Str (" ""Object_Size"": ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
410 Write_Val (Esize (Ent));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
411 Write_Line (",");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
412
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
413 Write_Str (" ""Value_Size"": ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
414 Write_Val (RM_Size (Ent));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
415 Write_Line (",");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
416
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
417 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
418 Write_Str ("for ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
419 List_Name (Ent);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
420 Write_Str ("'Object_Size use ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
421 Write_Val (Esize (Ent));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
422 Write_Line (";");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
423
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
424 Write_Str ("for ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
425 List_Name (Ent);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
426 Write_Str ("'Value_Size use ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
427 Write_Val (RM_Size (Ent));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
428 Write_Line (";");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
429 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
430 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
431 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
432
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
433 if List_Representation_Info_To_JSON then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
434 Write_Str (" ""Alignment"": ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
435 Write_Val (Alignment (Ent));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
436 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
437 Write_Str ("for ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
438 List_Name (Ent);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
439 Write_Str ("'Alignment use ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
440 Write_Val (Alignment (Ent));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
441 Write_Line (";");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
442 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
443 end List_Common_Type_Info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
444
111
kono
parents:
diff changeset
445 -------------------
kono
parents:
diff changeset
446 -- List_Entities --
kono
parents:
diff changeset
447 -------------------
kono
parents:
diff changeset
448
kono
parents:
diff changeset
449 procedure List_Entities
kono
parents:
diff changeset
450 (Ent : Entity_Id;
kono
parents:
diff changeset
451 Bytes_Big_Endian : Boolean;
kono
parents:
diff changeset
452 In_Subprogram : Boolean := False)
kono
parents:
diff changeset
453 is
kono
parents:
diff changeset
454 Body_E : Entity_Id;
kono
parents:
diff changeset
455 E : Entity_Id;
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 function Find_Declaration (E : Entity_Id) return Node_Id;
kono
parents:
diff changeset
458 -- Utility to retrieve declaration node for entity in the
kono
parents:
diff changeset
459 -- case of package bodies and subprograms.
kono
parents:
diff changeset
460
kono
parents:
diff changeset
461 ----------------------
kono
parents:
diff changeset
462 -- Find_Declaration --
kono
parents:
diff changeset
463 ----------------------
kono
parents:
diff changeset
464
kono
parents:
diff changeset
465 function Find_Declaration (E : Entity_Id) return Node_Id is
kono
parents:
diff changeset
466 Decl : Node_Id;
kono
parents:
diff changeset
467
kono
parents:
diff changeset
468 begin
kono
parents:
diff changeset
469 Decl := Parent (E);
kono
parents:
diff changeset
470 while Present (Decl)
kono
parents:
diff changeset
471 and then Nkind (Decl) /= N_Package_Body
kono
parents:
diff changeset
472 and then Nkind (Decl) /= N_Subprogram_Declaration
kono
parents:
diff changeset
473 and then Nkind (Decl) /= N_Subprogram_Body
kono
parents:
diff changeset
474 loop
kono
parents:
diff changeset
475 Decl := Parent (Decl);
kono
parents:
diff changeset
476 end loop;
kono
parents:
diff changeset
477
kono
parents:
diff changeset
478 return Decl;
kono
parents:
diff changeset
479 end Find_Declaration;
kono
parents:
diff changeset
480
kono
parents:
diff changeset
481 -- Start of processing for List_Entities
kono
parents:
diff changeset
482
kono
parents:
diff changeset
483 begin
kono
parents:
diff changeset
484 -- List entity if we have one, and it is not a renaming declaration.
kono
parents:
diff changeset
485 -- For renamings, we don't get proper information, and really it makes
kono
parents:
diff changeset
486 -- sense to restrict the output to the renamed entity.
kono
parents:
diff changeset
487
kono
parents:
diff changeset
488 if Present (Ent)
kono
parents:
diff changeset
489 and then Nkind (Declaration_Node (Ent)) not in N_Renaming_Declaration
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
490 and then not Is_Ignored_Ghost_Entity (Ent)
111
kono
parents:
diff changeset
491 then
kono
parents:
diff changeset
492 -- If entity is a subprogram and we are listing mechanisms,
kono
parents:
diff changeset
493 -- then we need to list mechanisms for this entity. We skip this
kono
parents:
diff changeset
494 -- if it is a nested subprogram, as the information has already
kono
parents:
diff changeset
495 -- been produced when listing the enclosing scope.
kono
parents:
diff changeset
496
kono
parents:
diff changeset
497 if List_Representation_Info_Mechanisms
kono
parents:
diff changeset
498 and then (Is_Subprogram (Ent)
kono
parents:
diff changeset
499 or else Ekind (Ent) = E_Entry
kono
parents:
diff changeset
500 or else Ekind (Ent) = E_Entry_Family)
kono
parents:
diff changeset
501 and then not In_Subprogram
kono
parents:
diff changeset
502 then
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
503 List_Subprogram_Info (Ent);
111
kono
parents:
diff changeset
504 end if;
kono
parents:
diff changeset
505
kono
parents:
diff changeset
506 E := First_Entity (Ent);
kono
parents:
diff changeset
507 while Present (E) loop
kono
parents:
diff changeset
508 -- We list entities that come from source (excluding private or
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
509 -- incomplete types or deferred constants, for which we will list
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
510 -- the information for the full view). If requested, we also list
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
511 -- relevant entities that have been generated when processing the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
512 -- original entities coming from source. But if debug flag A is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
513 -- set, then all entities are listed.
111
kono
parents:
diff changeset
514
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
515 if ((Comes_From_Source (E)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
516 or else (Ekind (E) = E_Block
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
517 and then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
518 Nkind (Parent (E)) = N_Implicit_Label_Declaration
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
519 and then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
520 Comes_From_Source (Label_Construct (Parent (E)))))
111
kono
parents:
diff changeset
521 and then not Is_Incomplete_Or_Private_Type (E)
kono
parents:
diff changeset
522 and then not (Ekind (E) = E_Constant
kono
parents:
diff changeset
523 and then Present (Full_View (E))))
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
524 or else (List_Representation_Info = 4
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
525 and then Relevant_Entities.Get (E))
111
kono
parents:
diff changeset
526 or else Debug_Flag_AA
kono
parents:
diff changeset
527 then
kono
parents:
diff changeset
528 if Is_Subprogram (E) then
kono
parents:
diff changeset
529 if List_Representation_Info_Mechanisms then
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
530 List_Subprogram_Info (E);
111
kono
parents:
diff changeset
531 end if;
kono
parents:
diff changeset
532
kono
parents:
diff changeset
533 -- Recurse into entities local to subprogram
kono
parents:
diff changeset
534
kono
parents:
diff changeset
535 List_Entities (E, Bytes_Big_Endian, True);
kono
parents:
diff changeset
536
kono
parents:
diff changeset
537 elsif Ekind_In (E, E_Entry,
kono
parents:
diff changeset
538 E_Entry_Family,
kono
parents:
diff changeset
539 E_Subprogram_Type)
kono
parents:
diff changeset
540 then
kono
parents:
diff changeset
541 if List_Representation_Info_Mechanisms then
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
542 List_Subprogram_Info (E);
111
kono
parents:
diff changeset
543 end if;
kono
parents:
diff changeset
544
kono
parents:
diff changeset
545 elsif Is_Record_Type (E) then
kono
parents:
diff changeset
546 if List_Representation_Info >= 1 then
kono
parents:
diff changeset
547 List_Record_Info (E, Bytes_Big_Endian);
kono
parents:
diff changeset
548 end if;
kono
parents:
diff changeset
549
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
550 -- Recurse into entities local to a record type
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
551
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
552 if List_Representation_Info = 4 then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
553 List_Entities (E, Bytes_Big_Endian, False);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
554 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
555
111
kono
parents:
diff changeset
556 elsif Is_Array_Type (E) then
kono
parents:
diff changeset
557 if List_Representation_Info >= 1 then
kono
parents:
diff changeset
558 List_Array_Info (E, Bytes_Big_Endian);
kono
parents:
diff changeset
559 end if;
kono
parents:
diff changeset
560
kono
parents:
diff changeset
561 elsif Is_Type (E) then
kono
parents:
diff changeset
562 if List_Representation_Info >= 2 then
kono
parents:
diff changeset
563 List_Type_Info (E);
kono
parents:
diff changeset
564 end if;
kono
parents:
diff changeset
565
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
566 -- Note that formals are not annotated so we skip them here
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
567
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
568 elsif Ekind_In (E, E_Constant,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
569 E_Loop_Parameter,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
570 E_Variable)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
571 then
111
kono
parents:
diff changeset
572 if List_Representation_Info >= 2 then
kono
parents:
diff changeset
573 List_Object_Info (E);
kono
parents:
diff changeset
574 end if;
kono
parents:
diff changeset
575 end if;
kono
parents:
diff changeset
576
kono
parents:
diff changeset
577 -- Recurse into nested package, but not if they are package
kono
parents:
diff changeset
578 -- renamings (in particular renamings of the enclosing package,
kono
parents:
diff changeset
579 -- as for some Java bindings and for generic instances).
kono
parents:
diff changeset
580
kono
parents:
diff changeset
581 if Ekind (E) = E_Package then
kono
parents:
diff changeset
582 if No (Renamed_Object (E)) then
kono
parents:
diff changeset
583 List_Entities (E, Bytes_Big_Endian);
kono
parents:
diff changeset
584 end if;
kono
parents:
diff changeset
585
kono
parents:
diff changeset
586 -- Recurse into bodies
kono
parents:
diff changeset
587
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
588 elsif Ekind_In (E, E_Package_Body,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
589 E_Protected_Body,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
590 E_Protected_Type,
111
kono
parents:
diff changeset
591 E_Subprogram_Body,
kono
parents:
diff changeset
592 E_Task_Body,
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
593 E_Task_Type)
111
kono
parents:
diff changeset
594 then
kono
parents:
diff changeset
595 List_Entities (E, Bytes_Big_Endian);
kono
parents:
diff changeset
596
kono
parents:
diff changeset
597 -- Recurse into blocks
kono
parents:
diff changeset
598
kono
parents:
diff changeset
599 elsif Ekind (E) = E_Block then
kono
parents:
diff changeset
600 List_Entities (E, Bytes_Big_Endian);
kono
parents:
diff changeset
601 end if;
kono
parents:
diff changeset
602 end if;
kono
parents:
diff changeset
603
kono
parents:
diff changeset
604 E := Next_Entity (E);
kono
parents:
diff changeset
605 end loop;
kono
parents:
diff changeset
606
kono
parents:
diff changeset
607 -- For a package body, the entities of the visible subprograms are
kono
parents:
diff changeset
608 -- declared in the corresponding spec. Iterate over its entities in
kono
parents:
diff changeset
609 -- order to handle properly the subprogram bodies. Skip bodies in
kono
parents:
diff changeset
610 -- subunits, which are listed independently.
kono
parents:
diff changeset
611
kono
parents:
diff changeset
612 if Ekind (Ent) = E_Package_Body
kono
parents:
diff changeset
613 and then Present (Corresponding_Spec (Find_Declaration (Ent)))
kono
parents:
diff changeset
614 then
kono
parents:
diff changeset
615 E := First_Entity (Corresponding_Spec (Find_Declaration (Ent)));
kono
parents:
diff changeset
616 while Present (E) loop
kono
parents:
diff changeset
617 if Is_Subprogram (E)
kono
parents:
diff changeset
618 and then
kono
parents:
diff changeset
619 Nkind (Find_Declaration (E)) = N_Subprogram_Declaration
kono
parents:
diff changeset
620 then
kono
parents:
diff changeset
621 Body_E := Corresponding_Body (Find_Declaration (E));
kono
parents:
diff changeset
622
kono
parents:
diff changeset
623 if Present (Body_E)
kono
parents:
diff changeset
624 and then
kono
parents:
diff changeset
625 Nkind (Parent (Find_Declaration (Body_E))) /= N_Subunit
kono
parents:
diff changeset
626 then
kono
parents:
diff changeset
627 List_Entities (Body_E, Bytes_Big_Endian);
kono
parents:
diff changeset
628 end if;
kono
parents:
diff changeset
629 end if;
kono
parents:
diff changeset
630
kono
parents:
diff changeset
631 Next_Entity (E);
kono
parents:
diff changeset
632 end loop;
kono
parents:
diff changeset
633 end if;
kono
parents:
diff changeset
634 end if;
kono
parents:
diff changeset
635 end List_Entities;
kono
parents:
diff changeset
636
kono
parents:
diff changeset
637 -------------------------
kono
parents:
diff changeset
638 -- List_GCC_Expression --
kono
parents:
diff changeset
639 -------------------------
kono
parents:
diff changeset
640
kono
parents:
diff changeset
641 procedure List_GCC_Expression (U : Node_Ref_Or_Val) is
kono
parents:
diff changeset
642
kono
parents:
diff changeset
643 procedure Print_Expr (Val : Node_Ref_Or_Val);
kono
parents:
diff changeset
644 -- Internal recursive procedure to print expression
kono
parents:
diff changeset
645
kono
parents:
diff changeset
646 ----------------
kono
parents:
diff changeset
647 -- Print_Expr --
kono
parents:
diff changeset
648 ----------------
kono
parents:
diff changeset
649
kono
parents:
diff changeset
650 procedure Print_Expr (Val : Node_Ref_Or_Val) is
kono
parents:
diff changeset
651 begin
kono
parents:
diff changeset
652 if Val >= 0 then
kono
parents:
diff changeset
653 UI_Write (Val, Decimal);
kono
parents:
diff changeset
654
kono
parents:
diff changeset
655 else
kono
parents:
diff changeset
656 declare
kono
parents:
diff changeset
657 Node : Exp_Node renames Rep_Table.Table (-UI_To_Int (Val));
kono
parents:
diff changeset
658
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
659 procedure Unop (S : String);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
660 -- Output text for unary operator with S being operator name
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
661
111
kono
parents:
diff changeset
662 procedure Binop (S : String);
kono
parents:
diff changeset
663 -- Output text for binary operator with S being operator name
kono
parents:
diff changeset
664
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
665 ----------
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
666 -- Unop --
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
667 ----------
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
668
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
669 procedure Unop (S : String) is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
670 begin
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
671 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
672 Write_Str ("{ ""code"": """);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
673 if S (S'Last) = ' ' then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
674 Write_Str (S (S'First .. S'Last - 1));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
675 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
676 Write_Str (S);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
677 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
678 Write_Str (""", ""operands"": [ ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
679 Print_Expr (Node.Op1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
680 Write_Str (" ] }");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
681 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
682 Write_Str (S);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
683 Print_Expr (Node.Op1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
684 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
685 end Unop;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
686
111
kono
parents:
diff changeset
687 -----------
kono
parents:
diff changeset
688 -- Binop --
kono
parents:
diff changeset
689 -----------
kono
parents:
diff changeset
690
kono
parents:
diff changeset
691 procedure Binop (S : String) is
kono
parents:
diff changeset
692 begin
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
693 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
694 Write_Str ("{ ""code"": """);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
695 Write_Str (S (S'First + 1 .. S'Last - 1));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
696 Write_Str (""", ""operands"": [ ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
697 Print_Expr (Node.Op1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
698 Write_Str (", ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
699 Print_Expr (Node.Op2);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
700 Write_Str (" ] }");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
701 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
702 Write_Char ('(');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
703 Print_Expr (Node.Op1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
704 Write_Str (S);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
705 Print_Expr (Node.Op2);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
706 Write_Char (')');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
707 end if;
111
kono
parents:
diff changeset
708 end Binop;
kono
parents:
diff changeset
709
kono
parents:
diff changeset
710 -- Start of processing for Print_Expr
kono
parents:
diff changeset
711
kono
parents:
diff changeset
712 begin
kono
parents:
diff changeset
713 case Node.Expr is
kono
parents:
diff changeset
714 when Cond_Expr =>
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
715 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
716 Write_Str ("{ ""code"": ""?<>""");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
717 Write_Str (", ""operands"": [ ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
718 Print_Expr (Node.Op1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
719 Write_Str (", ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
720 Print_Expr (Node.Op2);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
721 Write_Str (", ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
722 Print_Expr (Node.Op3);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
723 Write_Str (" ] }");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
724 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
725 Write_Str ("(if ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
726 Print_Expr (Node.Op1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
727 Write_Str (" then ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
728 Print_Expr (Node.Op2);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
729 Write_Str (" else ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
730 Print_Expr (Node.Op3);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
731 Write_Str (" end)");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
732 end if;
111
kono
parents:
diff changeset
733
kono
parents:
diff changeset
734 when Plus_Expr =>
kono
parents:
diff changeset
735 Binop (" + ");
kono
parents:
diff changeset
736
kono
parents:
diff changeset
737 when Minus_Expr =>
kono
parents:
diff changeset
738 Binop (" - ");
kono
parents:
diff changeset
739
kono
parents:
diff changeset
740 when Mult_Expr =>
kono
parents:
diff changeset
741 Binop (" * ");
kono
parents:
diff changeset
742
kono
parents:
diff changeset
743 when Trunc_Div_Expr =>
kono
parents:
diff changeset
744 Binop (" /t ");
kono
parents:
diff changeset
745
kono
parents:
diff changeset
746 when Ceil_Div_Expr =>
kono
parents:
diff changeset
747 Binop (" /c ");
kono
parents:
diff changeset
748
kono
parents:
diff changeset
749 when Floor_Div_Expr =>
kono
parents:
diff changeset
750 Binop (" /f ");
kono
parents:
diff changeset
751
kono
parents:
diff changeset
752 when Trunc_Mod_Expr =>
kono
parents:
diff changeset
753 Binop (" modt ");
kono
parents:
diff changeset
754
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
755 when Ceil_Mod_Expr =>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
756 Binop (" modc ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
757
111
kono
parents:
diff changeset
758 when Floor_Mod_Expr =>
kono
parents:
diff changeset
759 Binop (" modf ");
kono
parents:
diff changeset
760
kono
parents:
diff changeset
761 when Exact_Div_Expr =>
kono
parents:
diff changeset
762 Binop (" /e ");
kono
parents:
diff changeset
763
kono
parents:
diff changeset
764 when Negate_Expr =>
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
765 Unop ("-");
111
kono
parents:
diff changeset
766
kono
parents:
diff changeset
767 when Min_Expr =>
kono
parents:
diff changeset
768 Binop (" min ");
kono
parents:
diff changeset
769
kono
parents:
diff changeset
770 when Max_Expr =>
kono
parents:
diff changeset
771 Binop (" max ");
kono
parents:
diff changeset
772
kono
parents:
diff changeset
773 when Abs_Expr =>
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
774 Unop ("abs ");
111
kono
parents:
diff changeset
775
kono
parents:
diff changeset
776 when Truth_And_Expr =>
kono
parents:
diff changeset
777 Binop (" and ");
kono
parents:
diff changeset
778
kono
parents:
diff changeset
779 when Truth_Or_Expr =>
kono
parents:
diff changeset
780 Binop (" or ");
kono
parents:
diff changeset
781
kono
parents:
diff changeset
782 when Truth_Xor_Expr =>
kono
parents:
diff changeset
783 Binop (" xor ");
kono
parents:
diff changeset
784
kono
parents:
diff changeset
785 when Truth_Not_Expr =>
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
786 Unop ("not ");
111
kono
parents:
diff changeset
787
kono
parents:
diff changeset
788 when Lt_Expr =>
kono
parents:
diff changeset
789 Binop (" < ");
kono
parents:
diff changeset
790
kono
parents:
diff changeset
791 when Le_Expr =>
kono
parents:
diff changeset
792 Binop (" <= ");
kono
parents:
diff changeset
793
kono
parents:
diff changeset
794 when Gt_Expr =>
kono
parents:
diff changeset
795 Binop (" > ");
kono
parents:
diff changeset
796
kono
parents:
diff changeset
797 when Ge_Expr =>
kono
parents:
diff changeset
798 Binop (" >= ");
kono
parents:
diff changeset
799
kono
parents:
diff changeset
800 when Eq_Expr =>
kono
parents:
diff changeset
801 Binop (" == ");
kono
parents:
diff changeset
802
kono
parents:
diff changeset
803 when Ne_Expr =>
kono
parents:
diff changeset
804 Binop (" != ");
kono
parents:
diff changeset
805
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
806 when Bit_And_Expr =>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
807 Binop (" & ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
808
111
kono
parents:
diff changeset
809 when Discrim_Val =>
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
810 Unop ("#");
111
kono
parents:
diff changeset
811
kono
parents:
diff changeset
812 when Dynamic_Val =>
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
813 Unop ("var");
111
kono
parents:
diff changeset
814 end case;
kono
parents:
diff changeset
815 end;
kono
parents:
diff changeset
816 end if;
kono
parents:
diff changeset
817 end Print_Expr;
kono
parents:
diff changeset
818
kono
parents:
diff changeset
819 -- Start of processing for List_GCC_Expression
kono
parents:
diff changeset
820
kono
parents:
diff changeset
821 begin
kono
parents:
diff changeset
822 if U = No_Uint then
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
823 Write_Unknown_Val;
111
kono
parents:
diff changeset
824 else
kono
parents:
diff changeset
825 Print_Expr (U);
kono
parents:
diff changeset
826 end if;
kono
parents:
diff changeset
827 end List_GCC_Expression;
kono
parents:
diff changeset
828
kono
parents:
diff changeset
829 -------------------------
kono
parents:
diff changeset
830 -- List_Linker_Section --
kono
parents:
diff changeset
831 -------------------------
kono
parents:
diff changeset
832
kono
parents:
diff changeset
833 procedure List_Linker_Section (Ent : Entity_Id) is
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
834 function Expr_Value_S (N : Node_Id) return Node_Id;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
835 -- Returns the folded value of the expression. This function is called
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
836 -- in instances where it has already been determined that the expression
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
837 -- is static or its value is known at compile time. This version is used
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
838 -- for string types and returns the corresponding N_String_Literal node.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
839 -- NOTE: This is an exact copy of Sem_Eval.Expr_Value_S. Licensing stops
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
840 -- Repinfo from within Sem_Eval. Once ASIS is removed, and the licenses
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
841 -- are modified, Repinfo should be able to rely on Sem_Eval.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
842
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
843 ------------------
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
844 -- Expr_Value_S --
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
845 ------------------
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
846
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
847 function Expr_Value_S (N : Node_Id) return Node_Id is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
848 begin
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
849 if Nkind (N) = N_String_Literal then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
850 return N;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
851 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
852 pragma Assert (Ekind (Entity (N)) = E_Constant);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
853 return Expr_Value_S (Constant_Value (Entity (N)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
854 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
855 end Expr_Value_S;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
856
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
857 -- Local variables
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
858
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
859 Args : List_Id;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
860 Sect : Node_Id;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
861
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
862 -- Start of processing for List_Linker_Section
111
kono
parents:
diff changeset
863
kono
parents:
diff changeset
864 begin
kono
parents:
diff changeset
865 if Present (Linker_Section_Pragma (Ent)) then
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
866 Args := Pragma_Argument_Associations (Linker_Section_Pragma (Ent));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
867 Sect := Expr_Value_S (Get_Pragma_Arg (Last (Args)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
868
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
869 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
870 Write_Line (",");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
871 Write_Str (" ""Linker_Section"": """);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
872 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
873 Write_Str ("pragma Linker_Section (");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
874 List_Name (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
875 Write_Str (", """);
111
kono
parents:
diff changeset
876 end if;
kono
parents:
diff changeset
877
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
878 pragma Assert (Nkind (Sect) = N_String_Literal);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
879 String_To_Name_Buffer (Strval (Sect));
111
kono
parents:
diff changeset
880 Write_Str (Name_Buffer (1 .. Name_Len));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
881 Write_Str ("""");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
882 if not List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
883 Write_Line (");");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
884 end if;
111
kono
parents:
diff changeset
885 end if;
kono
parents:
diff changeset
886 end List_Linker_Section;
kono
parents:
diff changeset
887
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
888 -------------------
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
889 -- List_Location --
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
890 -------------------
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
891
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
892 procedure List_Location (Ent : Entity_Id) is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
893 begin
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
894 pragma Assert (List_Representation_Info_To_JSON);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
895 Write_Str (" ""location"": """);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
896 Write_Location (Sloc (Ent));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
897 Write_Line (""",");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
898 end List_Location;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
899
111
kono
parents:
diff changeset
900 ---------------
kono
parents:
diff changeset
901 -- List_Name --
kono
parents:
diff changeset
902 ---------------
kono
parents:
diff changeset
903
kono
parents:
diff changeset
904 procedure List_Name (Ent : Entity_Id) is
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
905 C : Character;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
906
111
kono
parents:
diff changeset
907 begin
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
908 -- List the qualified name recursively, except
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
909 -- at compilation unit level in default mode.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
910
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
911 if Is_Compilation_Unit (Ent) then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
912 null;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
913 elsif not Is_Compilation_Unit (Scope (Ent))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
914 or else List_Representation_Info_To_JSON
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
915 then
111
kono
parents:
diff changeset
916 List_Name (Scope (Ent));
kono
parents:
diff changeset
917 Write_Char ('.');
kono
parents:
diff changeset
918 end if;
kono
parents:
diff changeset
919
kono
parents:
diff changeset
920 Get_Unqualified_Decoded_Name_String (Chars (Ent));
kono
parents:
diff changeset
921 Set_Casing (Unit_Casing);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
922
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
923 -- The name of operators needs to be properly escaped for JSON
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
924
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
925 for J in 1 .. Name_Len loop
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
926 C := Name_Buffer (J);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
927 if C = '"' and then List_Representation_Info_To_JSON then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
928 Write_Char ('\');
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
929 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
930 Write_Char (C);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
931 end loop;
111
kono
parents:
diff changeset
932 end List_Name;
kono
parents:
diff changeset
933
kono
parents:
diff changeset
934 ---------------------
kono
parents:
diff changeset
935 -- List_Object_Info --
kono
parents:
diff changeset
936 ---------------------
kono
parents:
diff changeset
937
kono
parents:
diff changeset
938 procedure List_Object_Info (Ent : Entity_Id) is
kono
parents:
diff changeset
939 begin
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
940 Write_Separator;
111
kono
parents:
diff changeset
941
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
942 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
943 Write_Line ("{");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
944
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
945 Write_Str (" ""name"": """);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
946 List_Name (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
947 Write_Line (""",");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
948 List_Location (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
949
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
950 Write_Str (" ""Size"": ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
951 Write_Val (Esize (Ent));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
952 Write_Line (",");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
953
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
954 Write_Str (" ""Alignment"": ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
955 Write_Val (Alignment (Ent));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
956
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
957 List_Linker_Section (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
958
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
959 Write_Eol;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
960 Write_Line ("}");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
961 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
962 Write_Str ("for ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
963 List_Name (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
964 Write_Str ("'Size use ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
965 Write_Val (Esize (Ent));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
966 Write_Line (";");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
967
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
968 Write_Str ("for ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
969 List_Name (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
970 Write_Str ("'Alignment use ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
971 Write_Val (Alignment (Ent));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
972 Write_Line (";");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
973
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
974 List_Linker_Section (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
975 end if;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
976
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
977 -- The type is relevant for an object
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
978
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
979 if List_Representation_Info = 4 and then Is_Itype (Etype (Ent)) then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
980 Relevant_Entities.Set (Etype (Ent), True);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
981 end if;
111
kono
parents:
diff changeset
982 end List_Object_Info;
kono
parents:
diff changeset
983
kono
parents:
diff changeset
984 ----------------------
kono
parents:
diff changeset
985 -- List_Record_Info --
kono
parents:
diff changeset
986 ----------------------
kono
parents:
diff changeset
987
kono
parents:
diff changeset
988 procedure List_Record_Info (Ent : Entity_Id; Bytes_Big_Endian : Boolean) is
kono
parents:
diff changeset
989 procedure Compute_Max_Length
kono
parents:
diff changeset
990 (Ent : Entity_Id;
kono
parents:
diff changeset
991 Starting_Position : Uint := Uint_0;
kono
parents:
diff changeset
992 Starting_First_Bit : Uint := Uint_0;
kono
parents:
diff changeset
993 Prefix_Length : Natural := 0);
kono
parents:
diff changeset
994 -- Internal recursive procedure to compute the max length
kono
parents:
diff changeset
995
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
996 procedure List_Component_Layout
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
997 (Ent : Entity_Id;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
998 Starting_Position : Uint := Uint_0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
999 Starting_First_Bit : Uint := Uint_0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1000 Prefix : String := "";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1001 Indent : Natural := 0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1002 -- Procedure to display the layout of a single component
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1003
111
kono
parents:
diff changeset
1004 procedure List_Record_Layout
kono
parents:
diff changeset
1005 (Ent : Entity_Id;
kono
parents:
diff changeset
1006 Starting_Position : Uint := Uint_0;
kono
parents:
diff changeset
1007 Starting_First_Bit : Uint := Uint_0;
kono
parents:
diff changeset
1008 Prefix : String := "");
kono
parents:
diff changeset
1009 -- Internal recursive procedure to display the layout
kono
parents:
diff changeset
1010
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1011 procedure List_Structural_Record_Layout
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1012 (Ent : Entity_Id;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1013 Outer_Ent : Entity_Id;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1014 Variant : Node_Id := Empty;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1015 Indent : Natural := 0);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1016 -- Internal recursive procedure to display the structural layout
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1017
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1018 Incomplete_Layout : exception;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1019 -- Exception raised if the layout is incomplete in -gnatc mode
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1020
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1021 Not_In_Extended_Main : exception;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1022 -- Exception raised when an ancestor is not declared in the main unit
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1023
111
kono
parents:
diff changeset
1024 Max_Name_Length : Natural := 0;
kono
parents:
diff changeset
1025 Max_Spos_Length : Natural := 0;
kono
parents:
diff changeset
1026
kono
parents:
diff changeset
1027 ------------------------
kono
parents:
diff changeset
1028 -- Compute_Max_Length --
kono
parents:
diff changeset
1029 ------------------------
kono
parents:
diff changeset
1030
kono
parents:
diff changeset
1031 procedure Compute_Max_Length
kono
parents:
diff changeset
1032 (Ent : Entity_Id;
kono
parents:
diff changeset
1033 Starting_Position : Uint := Uint_0;
kono
parents:
diff changeset
1034 Starting_First_Bit : Uint := Uint_0;
kono
parents:
diff changeset
1035 Prefix_Length : Natural := 0)
kono
parents:
diff changeset
1036 is
kono
parents:
diff changeset
1037 Comp : Entity_Id;
kono
parents:
diff changeset
1038
kono
parents:
diff changeset
1039 begin
kono
parents:
diff changeset
1040 Comp := First_Component_Or_Discriminant (Ent);
kono
parents:
diff changeset
1041 while Present (Comp) loop
kono
parents:
diff changeset
1042
kono
parents:
diff changeset
1043 -- Skip discriminant in unchecked union (since it is not there!)
kono
parents:
diff changeset
1044
kono
parents:
diff changeset
1045 if Ekind (Comp) = E_Discriminant
kono
parents:
diff changeset
1046 and then Is_Unchecked_Union (Ent)
kono
parents:
diff changeset
1047 then
kono
parents:
diff changeset
1048 goto Continue;
kono
parents:
diff changeset
1049 end if;
kono
parents:
diff changeset
1050
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1051 -- Skip _Parent component in extension (to avoid overlap)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1052
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1053 if Chars (Comp) = Name_uParent then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1054 goto Continue;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1055 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1056
111
kono
parents:
diff changeset
1057 -- All other cases
kono
parents:
diff changeset
1058
kono
parents:
diff changeset
1059 declare
kono
parents:
diff changeset
1060 Ctyp : constant Entity_Id := Underlying_Type (Etype (Comp));
kono
parents:
diff changeset
1061 Bofs : constant Uint := Component_Bit_Offset (Comp);
kono
parents:
diff changeset
1062 Npos : Uint;
kono
parents:
diff changeset
1063 Fbit : Uint;
kono
parents:
diff changeset
1064 Spos : Uint;
kono
parents:
diff changeset
1065 Sbit : Uint;
kono
parents:
diff changeset
1066
kono
parents:
diff changeset
1067 Name_Length : Natural;
kono
parents:
diff changeset
1068
kono
parents:
diff changeset
1069 begin
kono
parents:
diff changeset
1070 Get_Decoded_Name_String (Chars (Comp));
kono
parents:
diff changeset
1071 Name_Length := Prefix_Length + Name_Len;
kono
parents:
diff changeset
1072
kono
parents:
diff changeset
1073 if Rep_Not_Constant (Bofs) then
kono
parents:
diff changeset
1074
kono
parents:
diff changeset
1075 -- If the record is not packed, then we know that all fields
kono
parents:
diff changeset
1076 -- whose position is not specified have starting normalized
kono
parents:
diff changeset
1077 -- bit position of zero.
kono
parents:
diff changeset
1078
kono
parents:
diff changeset
1079 if Unknown_Normalized_First_Bit (Comp)
kono
parents:
diff changeset
1080 and then not Is_Packed (Ent)
kono
parents:
diff changeset
1081 then
kono
parents:
diff changeset
1082 Set_Normalized_First_Bit (Comp, Uint_0);
kono
parents:
diff changeset
1083 end if;
kono
parents:
diff changeset
1084
kono
parents:
diff changeset
1085 UI_Image_Length := 2; -- For "??" marker
kono
parents:
diff changeset
1086 else
kono
parents:
diff changeset
1087 Npos := Bofs / SSU;
kono
parents:
diff changeset
1088 Fbit := Bofs mod SSU;
kono
parents:
diff changeset
1089
kono
parents:
diff changeset
1090 -- Complete annotation in case not done
kono
parents:
diff changeset
1091
kono
parents:
diff changeset
1092 if Unknown_Normalized_First_Bit (Comp) then
kono
parents:
diff changeset
1093 Set_Normalized_Position (Comp, Npos);
kono
parents:
diff changeset
1094 Set_Normalized_First_Bit (Comp, Fbit);
kono
parents:
diff changeset
1095 end if;
kono
parents:
diff changeset
1096
kono
parents:
diff changeset
1097 Spos := Starting_Position + Npos;
kono
parents:
diff changeset
1098 Sbit := Starting_First_Bit + Fbit;
kono
parents:
diff changeset
1099
kono
parents:
diff changeset
1100 if Sbit >= SSU then
kono
parents:
diff changeset
1101 Spos := Spos + 1;
kono
parents:
diff changeset
1102 Sbit := Sbit - SSU;
kono
parents:
diff changeset
1103 end if;
kono
parents:
diff changeset
1104
kono
parents:
diff changeset
1105 -- If extended information is requested, recurse fully into
kono
parents:
diff changeset
1106 -- record components, i.e. skip the outer level.
kono
parents:
diff changeset
1107
kono
parents:
diff changeset
1108 if List_Representation_Info_Extended
kono
parents:
diff changeset
1109 and then Is_Record_Type (Ctyp)
kono
parents:
diff changeset
1110 then
kono
parents:
diff changeset
1111 Compute_Max_Length (Ctyp, Spos, Sbit, Name_Length + 1);
kono
parents:
diff changeset
1112 goto Continue;
kono
parents:
diff changeset
1113 end if;
kono
parents:
diff changeset
1114
kono
parents:
diff changeset
1115 UI_Image (Spos);
kono
parents:
diff changeset
1116 end if;
kono
parents:
diff changeset
1117
kono
parents:
diff changeset
1118 Max_Name_Length := Natural'Max (Max_Name_Length, Name_Length);
kono
parents:
diff changeset
1119 Max_Spos_Length :=
kono
parents:
diff changeset
1120 Natural'Max (Max_Spos_Length, UI_Image_Length);
kono
parents:
diff changeset
1121 end;
kono
parents:
diff changeset
1122
kono
parents:
diff changeset
1123 <<Continue>>
kono
parents:
diff changeset
1124 Next_Component_Or_Discriminant (Comp);
kono
parents:
diff changeset
1125 end loop;
kono
parents:
diff changeset
1126 end Compute_Max_Length;
kono
parents:
diff changeset
1127
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1128 ---------------------------
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1129 -- List_Component_Layout --
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1130 ---------------------------
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1132 procedure List_Component_Layout
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1133 (Ent : Entity_Id;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1134 Starting_Position : Uint := Uint_0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1135 Starting_First_Bit : Uint := Uint_0;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1136 Prefix : String := "";
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1137 Indent : Natural := 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1138 is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1139 Esiz : constant Uint := Esize (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1140 Npos : constant Uint := Normalized_Position (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1141 Fbit : constant Uint := Normalized_First_Bit (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1142 Spos : Uint;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1143 Sbit : Uint;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1144 Lbit : Uint;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1145
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1146 begin
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1147 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1148 Spaces (Indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1149 Write_Line (" {");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1150 Spaces (Indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1151 Write_Str (" ""name"": """);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1152 Write_Str (Prefix);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1153 Write_Str (Name_Buffer (1 .. Name_Len));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1154 Write_Line (""",");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1155 if Ekind (Ent) = E_Discriminant then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1156 Spaces (Indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1157 Write_Str (" ""discriminant"": ");
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1158 UI_Write (Discriminant_Number (Ent), Decimal);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1159 Write_Line (",");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1160 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1161 Spaces (Indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1162 Write_Str (" ""Position"": ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1163 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1164 Write_Str (" ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1165 Write_Str (Prefix);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1166 Write_Str (Name_Buffer (1 .. Name_Len));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1167 Spaces (Max_Name_Length - Prefix'Length - Name_Len);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1168 Write_Str (" at ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1169 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1170
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1171 if Known_Static_Normalized_Position (Ent) then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1172 Spos := Starting_Position + Npos;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1173 Sbit := Starting_First_Bit + Fbit;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1174
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1175 if Sbit >= SSU then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1176 Spos := Spos + 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1177 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1178
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1179 UI_Image (Spos);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1180 Spaces (Max_Spos_Length - UI_Image_Length);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1181 Write_Str (UI_Image_Buffer (1 .. UI_Image_Length));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1182
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1183 elsif Known_Normalized_Position (Ent)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1184 and then List_Representation_Info >= 3
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1185 then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1186 Spaces (Max_Spos_Length - 2);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1187
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1188 if Starting_Position /= Uint_0 then
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1189 UI_Write (Starting_Position, Decimal);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1190 Write_Str (" + ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1191 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1192
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1193 Write_Val (Npos);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1194
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1195 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1196 Write_Unknown_Val;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1197 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1198
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1199 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1200 Write_Line (",");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1201 Spaces (Indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1202 Write_Str (" ""First_Bit"": ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1203 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1204 Write_Str (" range ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1205 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1206
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1207 Sbit := Starting_First_Bit + Fbit;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1208
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1209 if Sbit >= SSU then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1210 Sbit := Sbit - SSU;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1211 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1212
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1213 UI_Write (Sbit, Decimal);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1214
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1215 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1216 Write_Line (", ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1217 Spaces (Indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1218 Write_Str (" ""Size"": ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1219 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1220 Write_Str (" .. ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1221 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1222
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1223 -- Allowing Uint_0 here is an annoying special case. Really this
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1224 -- should be a fine Esize value but currently it means unknown,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1225 -- except that we know after gigi has back annotated that a size
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1226 -- of zero is real, since otherwise gigi back annotates using
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1227 -- No_Uint as the value to indicate unknown.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1228
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1229 if (Esize (Ent) = Uint_0 or else Known_Static_Esize (Ent))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1230 and then Known_Static_Normalized_First_Bit (Ent)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1231 then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1232 Lbit := Sbit + Esiz - 1;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1233
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1234 if List_Representation_Info_To_JSON then
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1235 UI_Write (Esiz, Decimal);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1236 else
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1237 if Lbit >= 0 and then Lbit < 10 then
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1238 Write_Char (' ');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1239 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1240
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1241 UI_Write (Lbit, Decimal);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1242 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1243
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1244 -- The test for Esize (Ent) not Uint_0 here is an annoying special
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1245 -- case. Officially a value of zero for Esize means unknown, but
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1246 -- here we use the fact that we know that gigi annotates Esize with
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1247 -- No_Uint, not Uint_0. Really everyone should use No_Uint???
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1248
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1249 elsif List_Representation_Info < 3
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1250 or else (Esize (Ent) /= Uint_0 and then Unknown_Esize (Ent))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1251 then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1252 Write_Unknown_Val;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1253
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1254 -- List_Representation >= 3 and Known_Esize (Ent)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1255
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1256 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1257 Write_Val (Esiz, Paren => not List_Representation_Info_To_JSON);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1258
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1259 -- If in front-end layout mode, then dynamic size is stored in
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1260 -- storage units, so renormalize for output.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1261
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1262 if not Back_End_Layout then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1263 Write_Str (" * ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1264 Write_Int (SSU);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1265 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1266
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1267 -- Add appropriate first bit offset
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1268
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1269 if not List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1270 if Sbit = 0 then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1271 Write_Str (" - 1");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1272
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1273 elsif Sbit = 1 then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1274 null;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1275
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1276 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1277 Write_Str (" + ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1278 Write_Int (UI_To_Int (Sbit) - 1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1279 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1280 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1281 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1282
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1283 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1284 Write_Eol;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1285 Spaces (Indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1286 Write_Str (" }");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1287 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1288 Write_Line (";");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1289 end if;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1290
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1291 -- The type is relevant for a component
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1292
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1293 if List_Representation_Info = 4 and then Is_Itype (Etype (Ent)) then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1294 Relevant_Entities.Set (Etype (Ent), True);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1295 end if;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1296 end List_Component_Layout;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1297
111
kono
parents:
diff changeset
1298 ------------------------
kono
parents:
diff changeset
1299 -- List_Record_Layout --
kono
parents:
diff changeset
1300 ------------------------
kono
parents:
diff changeset
1301
kono
parents:
diff changeset
1302 procedure List_Record_Layout
kono
parents:
diff changeset
1303 (Ent : Entity_Id;
kono
parents:
diff changeset
1304 Starting_Position : Uint := Uint_0;
kono
parents:
diff changeset
1305 Starting_First_Bit : Uint := Uint_0;
kono
parents:
diff changeset
1306 Prefix : String := "")
kono
parents:
diff changeset
1307 is
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1308 Comp : Entity_Id;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1309 First : Boolean := True;
111
kono
parents:
diff changeset
1310
kono
parents:
diff changeset
1311 begin
kono
parents:
diff changeset
1312 Comp := First_Component_Or_Discriminant (Ent);
kono
parents:
diff changeset
1313 while Present (Comp) loop
kono
parents:
diff changeset
1314
kono
parents:
diff changeset
1315 -- Skip discriminant in unchecked union (since it is not there!)
kono
parents:
diff changeset
1316
kono
parents:
diff changeset
1317 if Ekind (Comp) = E_Discriminant
kono
parents:
diff changeset
1318 and then Is_Unchecked_Union (Ent)
kono
parents:
diff changeset
1319 then
kono
parents:
diff changeset
1320 goto Continue;
kono
parents:
diff changeset
1321 end if;
kono
parents:
diff changeset
1322
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1323 -- Skip _Parent component in extension (to avoid overlap)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1324
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1325 if Chars (Comp) = Name_uParent then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1326 goto Continue;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1327 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1328
111
kono
parents:
diff changeset
1329 -- All other cases
kono
parents:
diff changeset
1330
kono
parents:
diff changeset
1331 declare
kono
parents:
diff changeset
1332 Ctyp : constant Entity_Id := Underlying_Type (Etype (Comp));
kono
parents:
diff changeset
1333 Npos : constant Uint := Normalized_Position (Comp);
kono
parents:
diff changeset
1334 Fbit : constant Uint := Normalized_First_Bit (Comp);
kono
parents:
diff changeset
1335 Spos : Uint;
kono
parents:
diff changeset
1336 Sbit : Uint;
kono
parents:
diff changeset
1337
kono
parents:
diff changeset
1338 begin
kono
parents:
diff changeset
1339 Get_Decoded_Name_String (Chars (Comp));
kono
parents:
diff changeset
1340 Set_Casing (Unit_Casing);
kono
parents:
diff changeset
1341
kono
parents:
diff changeset
1342 -- If extended information is requested, recurse fully into
kono
parents:
diff changeset
1343 -- record components, i.e. skip the outer level.
kono
parents:
diff changeset
1344
kono
parents:
diff changeset
1345 if List_Representation_Info_Extended
kono
parents:
diff changeset
1346 and then Is_Record_Type (Ctyp)
kono
parents:
diff changeset
1347 and then Known_Static_Normalized_Position (Comp)
kono
parents:
diff changeset
1348 and then Known_Static_Normalized_First_Bit (Comp)
kono
parents:
diff changeset
1349 then
kono
parents:
diff changeset
1350 Spos := Starting_Position + Npos;
kono
parents:
diff changeset
1351 Sbit := Starting_First_Bit + Fbit;
kono
parents:
diff changeset
1352
kono
parents:
diff changeset
1353 if Sbit >= SSU then
kono
parents:
diff changeset
1354 Spos := Spos + 1;
kono
parents:
diff changeset
1355 Sbit := Sbit - SSU;
kono
parents:
diff changeset
1356 end if;
kono
parents:
diff changeset
1357
kono
parents:
diff changeset
1358 List_Record_Layout (Ctyp,
kono
parents:
diff changeset
1359 Spos, Sbit, Prefix & Name_Buffer (1 .. Name_Len) & ".");
kono
parents:
diff changeset
1360
kono
parents:
diff changeset
1361 goto Continue;
kono
parents:
diff changeset
1362 end if;
kono
parents:
diff changeset
1363
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1364 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1365 if First then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1366 Write_Eol;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1367 First := False;
111
kono
parents:
diff changeset
1368 else
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1369 Write_Line (",");
111
kono
parents:
diff changeset
1370 end if;
kono
parents:
diff changeset
1371 end if;
kono
parents:
diff changeset
1372
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1373 List_Component_Layout (Comp,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1374 Starting_Position, Starting_First_Bit, Prefix);
111
kono
parents:
diff changeset
1375 end;
kono
parents:
diff changeset
1376
kono
parents:
diff changeset
1377 <<Continue>>
kono
parents:
diff changeset
1378 Next_Component_Or_Discriminant (Comp);
kono
parents:
diff changeset
1379 end loop;
kono
parents:
diff changeset
1380 end List_Record_Layout;
kono
parents:
diff changeset
1381
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1382 -----------------------------------
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1383 -- List_Structural_Record_Layout --
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1384 -----------------------------------
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1385
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1386 procedure List_Structural_Record_Layout
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1387 (Ent : Entity_Id;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1388 Outer_Ent : Entity_Id;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1389 Variant : Node_Id := Empty;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1390 Indent : Natural := 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1391 is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1392 function Derived_Discriminant (Disc : Entity_Id) return Entity_Id;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1393 -- This function assumes that Outer_Ent is an extension of Ent.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1394 -- Disc is a discriminant of Ent that does not itself constrain a
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1395 -- discriminant of the parent type of Ent. Return the discriminant
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1396 -- of Outer_Ent that ultimately constrains Disc, if any.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1397
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1398 ----------------------------
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1399 -- Derived_Discriminant --
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1400 ----------------------------
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1401
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1402 function Derived_Discriminant (Disc : Entity_Id) return Entity_Id is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1403 Corr_Disc : Entity_Id;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1404 Derived_Disc : Entity_Id;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1405
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1406 begin
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1407 Derived_Disc := First_Stored_Discriminant (Outer_Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1408
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1409 -- Loop over the discriminants of the extension
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1410
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1411 while Present (Derived_Disc) loop
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1412
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1413 -- Check if this discriminant constrains another discriminant.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1414 -- If so, find the ultimately constrained discriminant and
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1415 -- compare with the original components in the base type.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1416
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1417 if Present (Corresponding_Discriminant (Derived_Disc)) then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1418 Corr_Disc := Corresponding_Discriminant (Derived_Disc);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1419
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1420 while Present (Corresponding_Discriminant (Corr_Disc)) loop
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1421 Corr_Disc := Corresponding_Discriminant (Corr_Disc);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1422 end loop;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1423
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1424 if Original_Record_Component (Corr_Disc) =
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1425 Original_Record_Component (Disc)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1426 then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1427 return Derived_Disc;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1428 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1429 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1430
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1431 Next_Stored_Discriminant (Derived_Disc);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1432 end loop;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1433
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1434 -- Disc is not constrained by a discriminant of Outer_Ent
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1435
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1436 return Empty;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1437 end Derived_Discriminant;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1438
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1439 -- Local declarations
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1440
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1441 Comp : Node_Id;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1442 Comp_List : Node_Id;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1443 First : Boolean := True;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1444 Var : Node_Id;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1445
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1446 -- Start of processing for List_Structural_Record_Layout
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1447
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1448 begin
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1449 -- If we are dealing with a variant, just process the components
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1450
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1451 if Present (Variant) then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1452 Comp_List := Component_List (Variant);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1453
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1454 -- Otherwise, we are dealing with the full record and need to get
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1455 -- to its definition in order to retrieve its structural layout.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1456
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1457 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1458 declare
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1459 Definition : Node_Id :=
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1460 Type_Definition (Declaration_Node (Ent));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1461
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1462 Is_Extension : constant Boolean :=
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1463 Is_Tagged_Type (Ent)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1464 and then Nkind (Definition) =
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1465 N_Derived_Type_Definition;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1466
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1467 Disc : Entity_Id;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1468 Listed_Disc : Entity_Id;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1469 Parent_Type : Entity_Id;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1470
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1471 begin
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1472 -- If this is an extension, first list the layout of the parent
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1473 -- and then proceed to the extension part, if any.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1474
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1475 if Is_Extension then
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1476 Parent_Type := Parent_Subtype (Ent);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1477 if No (Parent_Type) then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1478 raise Incomplete_Layout;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1479 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1480
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1481 if Is_Private_Type (Parent_Type) then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1482 Parent_Type := Full_View (Parent_Type);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1483 pragma Assert (Present (Parent_Type));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1484 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1485
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1486 Parent_Type := Base_Type (Parent_Type);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1487 if not In_Extended_Main_Source_Unit (Parent_Type) then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1488 raise Not_In_Extended_Main;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1489 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1490
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1491 List_Structural_Record_Layout (Parent_Type, Outer_Ent);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1492 First := False;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1493
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1494 if Present (Record_Extension_Part (Definition)) then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1495 Definition := Record_Extension_Part (Definition);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1496 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1497 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1498
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1499 -- If the record has discriminants and is not an unchecked
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1500 -- union, then display them now.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1501
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1502 if Has_Discriminants (Ent)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1503 and then not Is_Unchecked_Union (Ent)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1504 then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1505 Disc := First_Stored_Discriminant (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1506 while Present (Disc) loop
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1507
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1508 -- If this is a record extension and the discriminant is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1509 -- the renaming of another discriminant, skip it.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1510
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1511 if Is_Extension
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1512 and then Present (Corresponding_Discriminant (Disc))
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1513 then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1514 goto Continue_Disc;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1515 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1516
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1517 -- If this is the parent type of an extension, retrieve
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1518 -- the derived discriminant from the extension, if any.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1519
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1520 if Ent /= Outer_Ent then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1521 Listed_Disc := Derived_Discriminant (Disc);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1522
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1523 if No (Listed_Disc) then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1524 goto Continue_Disc;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1525 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1526 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1527 Listed_Disc := Disc;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1528 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1529
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1530 Get_Decoded_Name_String (Chars (Listed_Disc));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1531 Set_Casing (Unit_Casing);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1532
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1533 if First then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1534 Write_Eol;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1535 First := False;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1536 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1537 Write_Line (",");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1538 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1539
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1540 List_Component_Layout (Listed_Disc, Indent => Indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1541
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1542 <<Continue_Disc>>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1543 Next_Stored_Discriminant (Disc);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1544 end loop;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1545 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1546
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1547 Comp_List := Component_List (Definition);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1548 end;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1549 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1550
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1551 -- Bail out for the null record
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1552
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1553 if No (Comp_List) then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1554 return;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1555 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1556
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1557 -- Now deal with the regular components, if any
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1558
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1559 if Present (Component_Items (Comp_List)) then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1560 Comp := First_Non_Pragma (Component_Items (Comp_List));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1561 while Present (Comp) loop
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1562
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1563 -- Skip _Parent component in extension (to avoid overlap)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1564
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1565 if Chars (Defining_Identifier (Comp)) = Name_uParent then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1566 goto Continue_Comp;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1567 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1568
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1569 Get_Decoded_Name_String (Chars (Defining_Identifier (Comp)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1570 Set_Casing (Unit_Casing);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1571
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1572 if First then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1573 Write_Eol;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1574 First := False;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1575 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1576 Write_Line (",");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1577 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1578
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1579 List_Component_Layout
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1580 (Defining_Identifier (Comp), Indent => Indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1581
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1582 <<Continue_Comp>>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1583 Next_Non_Pragma (Comp);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1584 end loop;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1585 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1586
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1587 -- We are done if there is no variant part
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1588
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1589 if No (Variant_Part (Comp_List)) then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1590 return;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1591 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1592
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1593 Write_Eol;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1594 Spaces (Indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1595 Write_Line (" ],");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1596 Spaces (Indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1597 Write_Str (" ""variant"" : [");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1598
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1599 -- Otherwise we recurse on each variant
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1600
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1601 Var := First_Non_Pragma (Variants (Variant_Part (Comp_List)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1602 First := True;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1603 while Present (Var) loop
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1604 if First then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1605 Write_Eol;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1606 First := False;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1607 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1608 Write_Line (",");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1609 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1610
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1611 Spaces (Indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1612 Write_Line (" {");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1613 Spaces (Indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1614 Write_Str (" ""present"": ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1615 Write_Val (Present_Expr (Var));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1616 Write_Line (",");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1617 Spaces (Indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1618 Write_Str (" ""record"": [");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1619
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1620 List_Structural_Record_Layout (Ent, Outer_Ent, Var, Indent + 4);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1621
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1622 Write_Eol;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1623 Spaces (Indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1624 Write_Line (" ]");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1625 Spaces (Indent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1626 Write_Str (" }");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1627 Next_Non_Pragma (Var);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1628 end loop;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1629 end List_Structural_Record_Layout;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1630
111
kono
parents:
diff changeset
1631 -- Start of processing for List_Record_Info
kono
parents:
diff changeset
1632
kono
parents:
diff changeset
1633 begin
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1634 Write_Separator;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1635
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1636 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1637 Write_Line ("{");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1638 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1639
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1640 List_Common_Type_Info (Ent);
111
kono
parents:
diff changeset
1641
kono
parents:
diff changeset
1642 -- First find out max line length and max starting position
kono
parents:
diff changeset
1643 -- length, for the purpose of lining things up nicely.
kono
parents:
diff changeset
1644
kono
parents:
diff changeset
1645 Compute_Max_Length (Ent);
kono
parents:
diff changeset
1646
kono
parents:
diff changeset
1647 -- Then do actual output based on those values
kono
parents:
diff changeset
1648
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1649 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1650 Write_Line (",");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1651 Write_Str (" ""record"": [");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1652
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1653 -- ??? We can output structural layout only for base types fully
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1654 -- declared in the extended main source unit for the time being,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1655 -- because otherwise declarations might not be processed at all.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1656
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1657 if Is_Base_Type (Ent) then
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1658 begin
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1659 List_Structural_Record_Layout (Ent, Ent);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1660
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1661 exception
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1662 when Incomplete_Layout
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1663 | Not_In_Extended_Main
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1664 =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1665 List_Record_Layout (Ent);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1666
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1667 when others =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1668 raise Program_Error;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1669 end;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1670 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1671 List_Record_Layout (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1672 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1673
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1674 Write_Eol;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1675 Write_Str (" ]");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1676 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1677 Write_Str ("for ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1678 List_Name (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1679 Write_Line (" use record");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1680
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1681 List_Record_Layout (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1682
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1683 Write_Line ("end record;");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1684 end if;
111
kono
parents:
diff changeset
1685
kono
parents:
diff changeset
1686 List_Scalar_Storage_Order (Ent, Bytes_Big_Endian);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1687
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1688 List_Linker_Section (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1689
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1690 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1691 Write_Eol;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1692 Write_Line ("}");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1693 end if;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1694
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1695 -- The type is relevant for a record subtype
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1696
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1697 if List_Representation_Info = 4
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1698 and then not Is_Base_Type (Ent)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1699 and then Is_Itype (Etype (Ent))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1700 then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1701 Relevant_Entities.Set (Etype (Ent), True);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1702 end if;
111
kono
parents:
diff changeset
1703 end List_Record_Info;
kono
parents:
diff changeset
1704
kono
parents:
diff changeset
1705 -------------------
kono
parents:
diff changeset
1706 -- List_Rep_Info --
kono
parents:
diff changeset
1707 -------------------
kono
parents:
diff changeset
1708
kono
parents:
diff changeset
1709 procedure List_Rep_Info (Bytes_Big_Endian : Boolean) is
kono
parents:
diff changeset
1710 Col : Nat;
kono
parents:
diff changeset
1711
kono
parents:
diff changeset
1712 begin
kono
parents:
diff changeset
1713 if List_Representation_Info /= 0
kono
parents:
diff changeset
1714 or else List_Representation_Info_Mechanisms
kono
parents:
diff changeset
1715 then
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1716 -- For the normal case, we output a single JSON stream
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1717
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1718 if not List_Representation_Info_To_File
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1719 and then List_Representation_Info_To_JSON
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1720 then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1721 Write_Line ("[");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1722 Need_Separator := False;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1723 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1724
111
kono
parents:
diff changeset
1725 for U in Main_Unit .. Last_Unit loop
kono
parents:
diff changeset
1726 if In_Extended_Main_Source_Unit (Cunit_Entity (U)) then
kono
parents:
diff changeset
1727 Unit_Casing := Identifier_Casing (Source_Index (U));
kono
parents:
diff changeset
1728
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1729 if List_Representation_Info = 4 then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1730 Relevant_Entities.Reset;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1731 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1732
111
kono
parents:
diff changeset
1733 -- Normal case, list to standard output
kono
parents:
diff changeset
1734
kono
parents:
diff changeset
1735 if not List_Representation_Info_To_File then
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1736 if not List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1737 Write_Eol;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1738 Write_Str ("Representation information for unit ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1739 Write_Unit_Name (Unit_Name (U));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1740 Col := Column;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1741 Write_Eol;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1742
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1743 for J in 1 .. Col - 1 loop
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1744 Write_Char ('-');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1745 end loop;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1746
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1747 Write_Eol;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1748 Need_Separator := True;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1749 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1750
111
kono
parents:
diff changeset
1751 List_Entities (Cunit_Entity (U), Bytes_Big_Endian);
kono
parents:
diff changeset
1752
kono
parents:
diff changeset
1753 -- List representation information to file
kono
parents:
diff changeset
1754
kono
parents:
diff changeset
1755 else
kono
parents:
diff changeset
1756 Create_Repinfo_File_Access.all
kono
parents:
diff changeset
1757 (Get_Name_String (File_Name (Source_Index (U))));
kono
parents:
diff changeset
1758 Set_Special_Output (Write_Info_Line'Access);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1759 if List_Representation_Info_To_JSON then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1760 Write_Line ("[");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1761 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1762 Need_Separator := False;
111
kono
parents:
diff changeset
1763 List_Entities (Cunit_Entity (U), Bytes_Big_Endian);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1764 if List_Representation_Info_To_JSON then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1765 Write_Line ("]");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1766 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1767 Cancel_Special_Output;
111
kono
parents:
diff changeset
1768 Close_Repinfo_File_Access.all;
kono
parents:
diff changeset
1769 end if;
kono
parents:
diff changeset
1770 end if;
kono
parents:
diff changeset
1771 end loop;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1772
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1773 if not List_Representation_Info_To_File
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1774 and then List_Representation_Info_To_JSON
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1775 then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1776 Write_Line ("]");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1777 end if;
111
kono
parents:
diff changeset
1778 end if;
kono
parents:
diff changeset
1779 end List_Rep_Info;
kono
parents:
diff changeset
1780
kono
parents:
diff changeset
1781 -------------------------------
kono
parents:
diff changeset
1782 -- List_Scalar_Storage_Order --
kono
parents:
diff changeset
1783 -------------------------------
kono
parents:
diff changeset
1784
kono
parents:
diff changeset
1785 procedure List_Scalar_Storage_Order
kono
parents:
diff changeset
1786 (Ent : Entity_Id;
kono
parents:
diff changeset
1787 Bytes_Big_Endian : Boolean)
kono
parents:
diff changeset
1788 is
kono
parents:
diff changeset
1789 procedure List_Attr (Attr_Name : String; Is_Reversed : Boolean);
kono
parents:
diff changeset
1790 -- Show attribute definition clause for Attr_Name (an endianness
kono
parents:
diff changeset
1791 -- attribute), depending on whether or not the endianness is reversed
kono
parents:
diff changeset
1792 -- compared to native endianness.
kono
parents:
diff changeset
1793
kono
parents:
diff changeset
1794 ---------------
kono
parents:
diff changeset
1795 -- List_Attr --
kono
parents:
diff changeset
1796 ---------------
kono
parents:
diff changeset
1797
kono
parents:
diff changeset
1798 procedure List_Attr (Attr_Name : String; Is_Reversed : Boolean) is
kono
parents:
diff changeset
1799 begin
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1800 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1801 Write_Line (",");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1802 Write_Str (" """);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1803 Write_Str (Attr_Name);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1804 Write_Str (""": ""System.");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1805 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1806 Write_Str ("for ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1807 List_Name (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1808 Write_Char (''');
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1809 Write_Str (Attr_Name);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1810 Write_Str (" use System.");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1811 end if;
111
kono
parents:
diff changeset
1812
kono
parents:
diff changeset
1813 if Bytes_Big_Endian xor Is_Reversed then
kono
parents:
diff changeset
1814 Write_Str ("High");
kono
parents:
diff changeset
1815 else
kono
parents:
diff changeset
1816 Write_Str ("Low");
kono
parents:
diff changeset
1817 end if;
kono
parents:
diff changeset
1818
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1819 Write_Str ("_Order_First");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1820 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1821 Write_Str ("""");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1822 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1823 Write_Line (";");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
1824 end if;
111
kono
parents:
diff changeset
1825 end List_Attr;
kono
parents:
diff changeset
1826
kono
parents:
diff changeset
1827 List_SSO : constant Boolean :=
kono
parents:
diff changeset
1828 Has_Rep_Item (Ent, Name_Scalar_Storage_Order)
kono
parents:
diff changeset
1829 or else SSO_Set_Low_By_Default (Ent)
kono
parents:
diff changeset
1830 or else SSO_Set_High_By_Default (Ent);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1831 -- Scalar_Storage_Order is displayed if specified explicitly or set by
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1832 -- Default_Scalar_Storage_Order.
111
kono
parents:
diff changeset
1833
kono
parents:
diff changeset
1834 -- Start of processing for List_Scalar_Storage_Order
kono
parents:
diff changeset
1835
kono
parents:
diff changeset
1836 begin
kono
parents:
diff changeset
1837 -- For record types, list Bit_Order if not default, or if SSO is shown
kono
parents:
diff changeset
1838
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1839 -- Also, when -gnatR4 is in effect always list bit order and scalar
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1840 -- storage order explicitly, so that you don't need to know the native
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1841 -- endianness of the target for which the output was produced in order
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1842 -- to interpret it.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1843
111
kono
parents:
diff changeset
1844 if Is_Record_Type (Ent)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1845 and then (List_SSO
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1846 or else Reverse_Bit_Order (Ent)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1847 or else List_Representation_Info = 4)
111
kono
parents:
diff changeset
1848 then
kono
parents:
diff changeset
1849 List_Attr ("Bit_Order", Reverse_Bit_Order (Ent));
kono
parents:
diff changeset
1850 end if;
kono
parents:
diff changeset
1851
kono
parents:
diff changeset
1852 -- List SSO if required. If not, then storage is supposed to be in
kono
parents:
diff changeset
1853 -- native order.
kono
parents:
diff changeset
1854
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1855 if List_SSO or else List_Representation_Info = 4 then
111
kono
parents:
diff changeset
1856 List_Attr ("Scalar_Storage_Order", Reverse_Storage_Order (Ent));
kono
parents:
diff changeset
1857 else
kono
parents:
diff changeset
1858 pragma Assert (not Reverse_Storage_Order (Ent));
kono
parents:
diff changeset
1859 null;
kono
parents:
diff changeset
1860 end if;
kono
parents:
diff changeset
1861 end List_Scalar_Storage_Order;
kono
parents:
diff changeset
1862
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1863 --------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1864 -- List_Subprogram_Info --
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1865 --------------------------
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1866
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1867 procedure List_Subprogram_Info (Ent : Entity_Id) is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1868 First : Boolean := True;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1869 Plen : Natural;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1870 Form : Entity_Id;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1871
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1872 begin
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1873 Write_Separator;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1874
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1875 if List_Representation_Info_To_JSON then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1876 Write_Line ("{");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1877 Write_Str (" ""name"": """);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1878 List_Name (Ent);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1879 Write_Line (""",");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1880 List_Location (Ent);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1881
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1882 Write_Str (" ""Convention"": """);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1883 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1884 case Ekind (Ent) is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1885 when E_Function =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1886 Write_Str ("function ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1887
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1888 when E_Operator =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1889 Write_Str ("operator ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1890
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1891 when E_Procedure =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1892 Write_Str ("procedure ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1893
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1894 when E_Subprogram_Type =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1895 Write_Str ("type ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1896
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1897 when E_Entry
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1898 | E_Entry_Family
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1899 =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1900 Write_Str ("entry ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1901
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1902 when others =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1903 raise Program_Error;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1904 end case;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1905
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1906 List_Name (Ent);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1907 Write_Str (" declared at ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1908 Write_Location (Sloc (Ent));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1909 Write_Eol;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1910
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1911 Write_Str ("convention : ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1912 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1913
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1914 case Convention (Ent) is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1915 when Convention_Ada =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1916 Write_Str ("Ada");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1917
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1918 when Convention_Ada_Pass_By_Copy =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1919 Write_Str ("Ada_Pass_By_Copy");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1920
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1921 when Convention_Ada_Pass_By_Reference =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1922 Write_Str ("Ada_Pass_By_Reference");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1923
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1924 when Convention_Intrinsic =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1925 Write_Str ("Intrinsic");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1926
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1927 when Convention_Entry =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1928 Write_Str ("Entry");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1929
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1930 when Convention_Protected =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1931 Write_Str ("Protected");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1932
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1933 when Convention_Assembler =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1934 Write_Str ("Assembler");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1935
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1936 when Convention_C =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1937 Write_Str ("C");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1938
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1939 when Convention_COBOL =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1940 Write_Str ("COBOL");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1941
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1942 when Convention_CPP =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1943 Write_Str ("C++");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1944
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1945 when Convention_Fortran =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1946 Write_Str ("Fortran");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1947
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1948 when Convention_Stdcall =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1949 Write_Str ("Stdcall");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1950
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1951 when Convention_Stubbed =>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1952 Write_Str ("Stubbed");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1953 end case;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1954
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1955 if List_Representation_Info_To_JSON then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1956 Write_Line (""",");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1957 Write_Str (" ""formal"": [");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1958 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1959 Write_Eol;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1960 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1961
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1962 -- Find max length of formal name
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1963
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1964 Plen := 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1965 Form := First_Formal (Ent);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1966 while Present (Form) loop
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1967 Get_Unqualified_Decoded_Name_String (Chars (Form));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1968
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1969 if Name_Len > Plen then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1970 Plen := Name_Len;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1971 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1972
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1973 Next_Formal (Form);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1974 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1975
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1976 -- Output formals and mechanisms
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1977
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1978 Form := First_Formal (Ent);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1979 while Present (Form) loop
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1980 Get_Unqualified_Decoded_Name_String (Chars (Form));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1981 Set_Casing (Unit_Casing);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1982
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1983 if List_Representation_Info_To_JSON then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1984 if First then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1985 Write_Eol;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1986 First := False;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1987 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1988 Write_Line (",");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1989 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1990
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1991 Write_Line (" {");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1992 Write_Str (" ""name"": """);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1993 Write_Str (Name_Buffer (1 .. Name_Len));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1994 Write_Line (""",");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1995
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1996 Write_Str (" ""mechanism"": """);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1997 Write_Mechanism (Mechanism (Form));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1998 Write_Line ("""");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
1999 Write_Str (" }");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2000 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2001 while Name_Len <= Plen loop
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2002 Name_Len := Name_Len + 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2003 Name_Buffer (Name_Len) := ' ';
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2004 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2005
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2006 Write_Str (" ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2007 Write_Str (Name_Buffer (1 .. Plen + 1));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2008 Write_Str (": passed by ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2009
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2010 Write_Mechanism (Mechanism (Form));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2011 Write_Eol;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2012 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2013
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2014 Next_Formal (Form);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2015 end loop;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2016
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2017 if List_Representation_Info_To_JSON then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2018 Write_Eol;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2019 Write_Str (" ]");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2020 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2021
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2022 if Ekind (Ent) = E_Function then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2023 if List_Representation_Info_To_JSON then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2024 Write_Line (",");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2025 Write_Str (" ""mechanism"": """);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2026 Write_Mechanism (Mechanism (Ent));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2027 Write_Str ("""");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2028 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2029 Write_Str ("returns by ");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2030 Write_Mechanism (Mechanism (Ent));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2031 Write_Eol;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2032 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2033 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2034
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2035 if not Is_Entry (Ent) then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2036 List_Linker_Section (Ent);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2037 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2038
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2039 if List_Representation_Info_To_JSON then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2040 Write_Eol;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2041 Write_Line ("}");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2042 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2043 end List_Subprogram_Info;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2044
111
kono
parents:
diff changeset
2045 --------------------
kono
parents:
diff changeset
2046 -- List_Type_Info --
kono
parents:
diff changeset
2047 --------------------
kono
parents:
diff changeset
2048
kono
parents:
diff changeset
2049 procedure List_Type_Info (Ent : Entity_Id) is
kono
parents:
diff changeset
2050 begin
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2051 Write_Separator;
111
kono
parents:
diff changeset
2052
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2053 if List_Representation_Info_To_JSON then
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2054 Write_Line ("{");
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2055 end if;
111
kono
parents:
diff changeset
2056
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2057 List_Common_Type_Info (Ent);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2058
111
kono
parents:
diff changeset
2059 -- Special stuff for fixed-point
kono
parents:
diff changeset
2060
kono
parents:
diff changeset
2061 if Is_Fixed_Point_Type (Ent) then
kono
parents:
diff changeset
2062
kono
parents:
diff changeset
2063 -- Write small (always a static constant)
kono
parents:
diff changeset
2064
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2065 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2066 Write_Line (",");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2067 Write_Str (" ""Small"": ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2068 UR_Write (Small_Value (Ent));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2069 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2070 Write_Str ("for ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2071 List_Name (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2072 Write_Str ("'Small use ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2073 UR_Write (Small_Value (Ent));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2074 Write_Line (";");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2075 end if;
111
kono
parents:
diff changeset
2076
kono
parents:
diff changeset
2077 -- Write range if static
kono
parents:
diff changeset
2078
kono
parents:
diff changeset
2079 declare
kono
parents:
diff changeset
2080 R : constant Node_Id := Scalar_Range (Ent);
kono
parents:
diff changeset
2081
kono
parents:
diff changeset
2082 begin
kono
parents:
diff changeset
2083 if Nkind (Low_Bound (R)) = N_Real_Literal
kono
parents:
diff changeset
2084 and then
kono
parents:
diff changeset
2085 Nkind (High_Bound (R)) = N_Real_Literal
kono
parents:
diff changeset
2086 then
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2087 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2088 Write_Line (",");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2089 Write_Str (" ""Range"": [ ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2090 UR_Write (Realval (Low_Bound (R)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2091 Write_Str (", ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2092 UR_Write (Realval (High_Bound (R)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2093 Write_Str (" ]");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2094 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2095 Write_Str ("for ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2096 List_Name (Ent);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2097 Write_Str ("'Range use ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2098 UR_Write (Realval (Low_Bound (R)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2099 Write_Str (" .. ");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2100 UR_Write (Realval (High_Bound (R)));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2101 Write_Line (";");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2102 end if;
111
kono
parents:
diff changeset
2103 end if;
kono
parents:
diff changeset
2104 end;
kono
parents:
diff changeset
2105 end if;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2106
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2107 List_Linker_Section (Ent);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2108
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2109 if List_Representation_Info_To_JSON then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2110 Write_Eol;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2111 Write_Line ("}");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2112 end if;
111
kono
parents:
diff changeset
2113 end List_Type_Info;
kono
parents:
diff changeset
2114
kono
parents:
diff changeset
2115 ----------------------
kono
parents:
diff changeset
2116 -- Rep_Not_Constant --
kono
parents:
diff changeset
2117 ----------------------
kono
parents:
diff changeset
2118
kono
parents:
diff changeset
2119 function Rep_Not_Constant (Val : Node_Ref_Or_Val) return Boolean is
kono
parents:
diff changeset
2120 begin
kono
parents:
diff changeset
2121 if Val = No_Uint or else Val < 0 then
kono
parents:
diff changeset
2122 return True;
kono
parents:
diff changeset
2123 else
kono
parents:
diff changeset
2124 return False;
kono
parents:
diff changeset
2125 end if;
kono
parents:
diff changeset
2126 end Rep_Not_Constant;
kono
parents:
diff changeset
2127
kono
parents:
diff changeset
2128 ---------------
kono
parents:
diff changeset
2129 -- Rep_Value --
kono
parents:
diff changeset
2130 ---------------
kono
parents:
diff changeset
2131
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2132 function Rep_Value (Val : Node_Ref_Or_Val; D : Discrim_List) return Uint is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2133
111
kono
parents:
diff changeset
2134 function B (Val : Boolean) return Uint;
kono
parents:
diff changeset
2135 -- Returns Uint_0 for False, Uint_1 for True
kono
parents:
diff changeset
2136
kono
parents:
diff changeset
2137 function T (Val : Node_Ref_Or_Val) return Boolean;
kono
parents:
diff changeset
2138 -- Returns True for 0, False for any non-zero (i.e. True)
kono
parents:
diff changeset
2139
kono
parents:
diff changeset
2140 function V (Val : Node_Ref_Or_Val) return Uint;
kono
parents:
diff changeset
2141 -- Internal recursive routine to evaluate tree
kono
parents:
diff changeset
2142
kono
parents:
diff changeset
2143 function W (Val : Uint) return Word;
kono
parents:
diff changeset
2144 -- Convert Val to Word, assuming Val is always in the Int range. This
kono
parents:
diff changeset
2145 -- is a helper function for the evaluation of bitwise expressions like
kono
parents:
diff changeset
2146 -- Bit_And_Expr, for which there is no direct support in uintp. Uint
kono
parents:
diff changeset
2147 -- values out of the Int range are expected to be seen in such
kono
parents:
diff changeset
2148 -- expressions only with overflowing byte sizes around, introducing
kono
parents:
diff changeset
2149 -- inherent unreliabilities in computations anyway.
kono
parents:
diff changeset
2150
kono
parents:
diff changeset
2151 -------
kono
parents:
diff changeset
2152 -- B --
kono
parents:
diff changeset
2153 -------
kono
parents:
diff changeset
2154
kono
parents:
diff changeset
2155 function B (Val : Boolean) return Uint is
kono
parents:
diff changeset
2156 begin
kono
parents:
diff changeset
2157 if Val then
kono
parents:
diff changeset
2158 return Uint_1;
kono
parents:
diff changeset
2159 else
kono
parents:
diff changeset
2160 return Uint_0;
kono
parents:
diff changeset
2161 end if;
kono
parents:
diff changeset
2162 end B;
kono
parents:
diff changeset
2163
kono
parents:
diff changeset
2164 -------
kono
parents:
diff changeset
2165 -- T --
kono
parents:
diff changeset
2166 -------
kono
parents:
diff changeset
2167
kono
parents:
diff changeset
2168 function T (Val : Node_Ref_Or_Val) return Boolean is
kono
parents:
diff changeset
2169 begin
kono
parents:
diff changeset
2170 if V (Val) = 0 then
kono
parents:
diff changeset
2171 return False;
kono
parents:
diff changeset
2172 else
kono
parents:
diff changeset
2173 return True;
kono
parents:
diff changeset
2174 end if;
kono
parents:
diff changeset
2175 end T;
kono
parents:
diff changeset
2176
kono
parents:
diff changeset
2177 -------
kono
parents:
diff changeset
2178 -- V --
kono
parents:
diff changeset
2179 -------
kono
parents:
diff changeset
2180
kono
parents:
diff changeset
2181 function V (Val : Node_Ref_Or_Val) return Uint is
kono
parents:
diff changeset
2182 L, R, Q : Uint;
kono
parents:
diff changeset
2183
kono
parents:
diff changeset
2184 begin
kono
parents:
diff changeset
2185 if Val >= 0 then
kono
parents:
diff changeset
2186 return Val;
kono
parents:
diff changeset
2187
kono
parents:
diff changeset
2188 else
kono
parents:
diff changeset
2189 declare
kono
parents:
diff changeset
2190 Node : Exp_Node renames Rep_Table.Table (-UI_To_Int (Val));
kono
parents:
diff changeset
2191
kono
parents:
diff changeset
2192 begin
kono
parents:
diff changeset
2193 case Node.Expr is
kono
parents:
diff changeset
2194 when Cond_Expr =>
kono
parents:
diff changeset
2195 if T (Node.Op1) then
kono
parents:
diff changeset
2196 return V (Node.Op2);
kono
parents:
diff changeset
2197 else
kono
parents:
diff changeset
2198 return V (Node.Op3);
kono
parents:
diff changeset
2199 end if;
kono
parents:
diff changeset
2200
kono
parents:
diff changeset
2201 when Plus_Expr =>
kono
parents:
diff changeset
2202 return V (Node.Op1) + V (Node.Op2);
kono
parents:
diff changeset
2203
kono
parents:
diff changeset
2204 when Minus_Expr =>
kono
parents:
diff changeset
2205 return V (Node.Op1) - V (Node.Op2);
kono
parents:
diff changeset
2206
kono
parents:
diff changeset
2207 when Mult_Expr =>
kono
parents:
diff changeset
2208 return V (Node.Op1) * V (Node.Op2);
kono
parents:
diff changeset
2209
kono
parents:
diff changeset
2210 when Trunc_Div_Expr =>
kono
parents:
diff changeset
2211 return V (Node.Op1) / V (Node.Op2);
kono
parents:
diff changeset
2212
kono
parents:
diff changeset
2213 when Ceil_Div_Expr =>
kono
parents:
diff changeset
2214 return
kono
parents:
diff changeset
2215 UR_Ceiling
kono
parents:
diff changeset
2216 (V (Node.Op1) / UR_From_Uint (V (Node.Op2)));
kono
parents:
diff changeset
2217
kono
parents:
diff changeset
2218 when Floor_Div_Expr =>
kono
parents:
diff changeset
2219 return
kono
parents:
diff changeset
2220 UR_Floor
kono
parents:
diff changeset
2221 (V (Node.Op1) / UR_From_Uint (V (Node.Op2)));
kono
parents:
diff changeset
2222
kono
parents:
diff changeset
2223 when Trunc_Mod_Expr =>
kono
parents:
diff changeset
2224 return V (Node.Op1) rem V (Node.Op2);
kono
parents:
diff changeset
2225
kono
parents:
diff changeset
2226 when Floor_Mod_Expr =>
kono
parents:
diff changeset
2227 return V (Node.Op1) mod V (Node.Op2);
kono
parents:
diff changeset
2228
kono
parents:
diff changeset
2229 when Ceil_Mod_Expr =>
kono
parents:
diff changeset
2230 L := V (Node.Op1);
kono
parents:
diff changeset
2231 R := V (Node.Op2);
kono
parents:
diff changeset
2232 Q := UR_Ceiling (L / UR_From_Uint (R));
kono
parents:
diff changeset
2233 return L - R * Q;
kono
parents:
diff changeset
2234
kono
parents:
diff changeset
2235 when Exact_Div_Expr =>
kono
parents:
diff changeset
2236 return V (Node.Op1) / V (Node.Op2);
kono
parents:
diff changeset
2237
kono
parents:
diff changeset
2238 when Negate_Expr =>
kono
parents:
diff changeset
2239 return -V (Node.Op1);
kono
parents:
diff changeset
2240
kono
parents:
diff changeset
2241 when Min_Expr =>
kono
parents:
diff changeset
2242 return UI_Min (V (Node.Op1), V (Node.Op2));
kono
parents:
diff changeset
2243
kono
parents:
diff changeset
2244 when Max_Expr =>
kono
parents:
diff changeset
2245 return UI_Max (V (Node.Op1), V (Node.Op2));
kono
parents:
diff changeset
2246
kono
parents:
diff changeset
2247 when Abs_Expr =>
kono
parents:
diff changeset
2248 return UI_Abs (V (Node.Op1));
kono
parents:
diff changeset
2249
kono
parents:
diff changeset
2250 when Truth_And_Expr =>
kono
parents:
diff changeset
2251 return B (T (Node.Op1) and then T (Node.Op2));
kono
parents:
diff changeset
2252
kono
parents:
diff changeset
2253 when Truth_Or_Expr =>
kono
parents:
diff changeset
2254 return B (T (Node.Op1) or else T (Node.Op2));
kono
parents:
diff changeset
2255
kono
parents:
diff changeset
2256 when Truth_Xor_Expr =>
kono
parents:
diff changeset
2257 return B (T (Node.Op1) xor T (Node.Op2));
kono
parents:
diff changeset
2258
kono
parents:
diff changeset
2259 when Truth_Not_Expr =>
kono
parents:
diff changeset
2260 return B (not T (Node.Op1));
kono
parents:
diff changeset
2261
kono
parents:
diff changeset
2262 when Bit_And_Expr =>
kono
parents:
diff changeset
2263 L := V (Node.Op1);
kono
parents:
diff changeset
2264 R := V (Node.Op2);
kono
parents:
diff changeset
2265 return UI_From_Int (Int (W (L) and W (R)));
kono
parents:
diff changeset
2266
kono
parents:
diff changeset
2267 when Lt_Expr =>
kono
parents:
diff changeset
2268 return B (V (Node.Op1) < V (Node.Op2));
kono
parents:
diff changeset
2269
kono
parents:
diff changeset
2270 when Le_Expr =>
kono
parents:
diff changeset
2271 return B (V (Node.Op1) <= V (Node.Op2));
kono
parents:
diff changeset
2272
kono
parents:
diff changeset
2273 when Gt_Expr =>
kono
parents:
diff changeset
2274 return B (V (Node.Op1) > V (Node.Op2));
kono
parents:
diff changeset
2275
kono
parents:
diff changeset
2276 when Ge_Expr =>
kono
parents:
diff changeset
2277 return B (V (Node.Op1) >= V (Node.Op2));
kono
parents:
diff changeset
2278
kono
parents:
diff changeset
2279 when Eq_Expr =>
kono
parents:
diff changeset
2280 return B (V (Node.Op1) = V (Node.Op2));
kono
parents:
diff changeset
2281
kono
parents:
diff changeset
2282 when Ne_Expr =>
kono
parents:
diff changeset
2283 return B (V (Node.Op1) /= V (Node.Op2));
kono
parents:
diff changeset
2284
kono
parents:
diff changeset
2285 when Discrim_Val =>
kono
parents:
diff changeset
2286 declare
kono
parents:
diff changeset
2287 Sub : constant Int := UI_To_Int (Node.Op1);
kono
parents:
diff changeset
2288 begin
kono
parents:
diff changeset
2289 pragma Assert (Sub in D'Range);
kono
parents:
diff changeset
2290 return D (Sub);
kono
parents:
diff changeset
2291 end;
kono
parents:
diff changeset
2292
kono
parents:
diff changeset
2293 when Dynamic_Val =>
kono
parents:
diff changeset
2294 return No_Uint;
kono
parents:
diff changeset
2295 end case;
kono
parents:
diff changeset
2296 end;
kono
parents:
diff changeset
2297 end if;
kono
parents:
diff changeset
2298 end V;
kono
parents:
diff changeset
2299
kono
parents:
diff changeset
2300 -------
kono
parents:
diff changeset
2301 -- W --
kono
parents:
diff changeset
2302 -------
kono
parents:
diff changeset
2303
kono
parents:
diff changeset
2304 -- We use an unchecked conversion to map Int values to their Word
kono
parents:
diff changeset
2305 -- bitwise equivalent, which we could not achieve with a normal type
kono
parents:
diff changeset
2306 -- conversion for negative Ints. We want bitwise equivalents because W
kono
parents:
diff changeset
2307 -- is used as a helper for bit operators like Bit_And_Expr, and can be
kono
parents:
diff changeset
2308 -- called for negative Ints in the context of aligning expressions like
kono
parents:
diff changeset
2309 -- X+Align & -Align.
kono
parents:
diff changeset
2310
kono
parents:
diff changeset
2311 function W (Val : Uint) return Word is
kono
parents:
diff changeset
2312 function To_Word is new Ada.Unchecked_Conversion (Int, Word);
kono
parents:
diff changeset
2313 begin
kono
parents:
diff changeset
2314 return To_Word (UI_To_Int (Val));
kono
parents:
diff changeset
2315 end W;
kono
parents:
diff changeset
2316
kono
parents:
diff changeset
2317 -- Start of processing for Rep_Value
kono
parents:
diff changeset
2318
kono
parents:
diff changeset
2319 begin
kono
parents:
diff changeset
2320 if Val = No_Uint then
kono
parents:
diff changeset
2321 return No_Uint;
kono
parents:
diff changeset
2322
kono
parents:
diff changeset
2323 else
kono
parents:
diff changeset
2324 return V (Val);
kono
parents:
diff changeset
2325 end if;
kono
parents:
diff changeset
2326 end Rep_Value;
kono
parents:
diff changeset
2327
kono
parents:
diff changeset
2328 ------------
kono
parents:
diff changeset
2329 -- Spaces --
kono
parents:
diff changeset
2330 ------------
kono
parents:
diff changeset
2331
kono
parents:
diff changeset
2332 procedure Spaces (N : Natural) is
kono
parents:
diff changeset
2333 begin
kono
parents:
diff changeset
2334 for J in 1 .. N loop
kono
parents:
diff changeset
2335 Write_Char (' ');
kono
parents:
diff changeset
2336 end loop;
kono
parents:
diff changeset
2337 end Spaces;
kono
parents:
diff changeset
2338
kono
parents:
diff changeset
2339 ---------------
kono
parents:
diff changeset
2340 -- Tree_Read --
kono
parents:
diff changeset
2341 ---------------
kono
parents:
diff changeset
2342
kono
parents:
diff changeset
2343 procedure Tree_Read is
kono
parents:
diff changeset
2344 begin
kono
parents:
diff changeset
2345 Rep_Table.Tree_Read;
kono
parents:
diff changeset
2346 end Tree_Read;
kono
parents:
diff changeset
2347
kono
parents:
diff changeset
2348 ----------------
kono
parents:
diff changeset
2349 -- Tree_Write --
kono
parents:
diff changeset
2350 ----------------
kono
parents:
diff changeset
2351
kono
parents:
diff changeset
2352 procedure Tree_Write is
kono
parents:
diff changeset
2353 begin
kono
parents:
diff changeset
2354 Rep_Table.Tree_Write;
kono
parents:
diff changeset
2355 end Tree_Write;
kono
parents:
diff changeset
2356
kono
parents:
diff changeset
2357 ---------------------
kono
parents:
diff changeset
2358 -- Write_Info_Line --
kono
parents:
diff changeset
2359 ---------------------
kono
parents:
diff changeset
2360
kono
parents:
diff changeset
2361 procedure Write_Info_Line (S : String) is
kono
parents:
diff changeset
2362 begin
kono
parents:
diff changeset
2363 Write_Repinfo_Line_Access.all (S (S'First .. S'Last - 1));
kono
parents:
diff changeset
2364 end Write_Info_Line;
kono
parents:
diff changeset
2365
kono
parents:
diff changeset
2366 ---------------------
kono
parents:
diff changeset
2367 -- Write_Mechanism --
kono
parents:
diff changeset
2368 ---------------------
kono
parents:
diff changeset
2369
kono
parents:
diff changeset
2370 procedure Write_Mechanism (M : Mechanism_Type) is
kono
parents:
diff changeset
2371 begin
kono
parents:
diff changeset
2372 case M is
kono
parents:
diff changeset
2373 when 0 =>
kono
parents:
diff changeset
2374 Write_Str ("default");
kono
parents:
diff changeset
2375
kono
parents:
diff changeset
2376 when -1 =>
kono
parents:
diff changeset
2377 Write_Str ("copy");
kono
parents:
diff changeset
2378
kono
parents:
diff changeset
2379 when -2 =>
kono
parents:
diff changeset
2380 Write_Str ("reference");
kono
parents:
diff changeset
2381
kono
parents:
diff changeset
2382 when others =>
kono
parents:
diff changeset
2383 raise Program_Error;
kono
parents:
diff changeset
2384 end case;
kono
parents:
diff changeset
2385 end Write_Mechanism;
kono
parents:
diff changeset
2386
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2387 ---------------------
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2388 -- Write_Separator --
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2389 ---------------------
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2390
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2391 procedure Write_Separator is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2392 begin
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2393 if Need_Separator then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2394 if List_Representation_Info_To_JSON then
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2395 Write_Line (",");
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2396 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2397 Write_Eol;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2398 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2399 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2400 Need_Separator := True;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2401 end if;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2402 end Write_Separator;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2403
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2404 -----------------------
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2405 -- Write_Unknown_Val --
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2406 -----------------------
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2407
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2408 procedure Write_Unknown_Val is
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2409 begin
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2410 if List_Representation_Info_To_JSON then
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2411 Write_Str ("""??""");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2412 else
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2413 Write_Str ("??");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2414 end if;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2415 end Write_Unknown_Val;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2416
111
kono
parents:
diff changeset
2417 ---------------
kono
parents:
diff changeset
2418 -- Write_Val --
kono
parents:
diff changeset
2419 ---------------
kono
parents:
diff changeset
2420
kono
parents:
diff changeset
2421 procedure Write_Val (Val : Node_Ref_Or_Val; Paren : Boolean := False) is
kono
parents:
diff changeset
2422 begin
kono
parents:
diff changeset
2423 if Rep_Not_Constant (Val) then
kono
parents:
diff changeset
2424 if List_Representation_Info < 3 or else Val = No_Uint then
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2425 Write_Unknown_Val;
111
kono
parents:
diff changeset
2426
kono
parents:
diff changeset
2427 else
kono
parents:
diff changeset
2428 if Paren then
kono
parents:
diff changeset
2429 Write_Char ('(');
kono
parents:
diff changeset
2430 end if;
kono
parents:
diff changeset
2431
kono
parents:
diff changeset
2432 if Back_End_Layout then
kono
parents:
diff changeset
2433 List_GCC_Expression (Val);
kono
parents:
diff changeset
2434 else
kono
parents:
diff changeset
2435 Write_Name_Decoded (Chars (Get_Dynamic_SO_Entity (Val)));
kono
parents:
diff changeset
2436 end if;
kono
parents:
diff changeset
2437
kono
parents:
diff changeset
2438 if Paren then
kono
parents:
diff changeset
2439 Write_Char (')');
kono
parents:
diff changeset
2440 end if;
kono
parents:
diff changeset
2441 end if;
kono
parents:
diff changeset
2442
kono
parents:
diff changeset
2443 else
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2444 UI_Write (Val, Decimal);
111
kono
parents:
diff changeset
2445 end if;
kono
parents:
diff changeset
2446 end Write_Val;
kono
parents:
diff changeset
2447
kono
parents:
diff changeset
2448 end Repinfo;