1------------------------------------------------------------------------------
2--                                                                          --
3--                         GNAT COMPILER COMPONENTS                         --
4--                                                                          --
5--                               C S T A N D                                --
6--                                                                          --
7--                                 B o d y                                  --
8--                                                                          --
9--          Copyright (C) 1992-2012, Free Software Foundation, Inc.         --
10--                                                                          --
11-- GNAT is free software;  you can  redistribute it  and/or modify it under --
12-- terms of the  GNU General Public License as published  by the Free Soft- --
13-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
14-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
15-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
16-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
17-- for  more details.  You should have  received  a copy of the GNU General --
18-- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
19-- http://www.gnu.org/licenses for a complete copy of the license.          --
20--                                                                          --
21-- GNAT was originally developed  by the GNAT team at  New York University. --
22-- Extensive contributions were provided by Ada Core Technologies Inc.      --
23--                                                                          --
24------------------------------------------------------------------------------
25
26with Atree;    use Atree;
27with Back_End; use Back_End;
28with Csets;    use Csets;
29with Debug;    use Debug;
30with Einfo;    use Einfo;
31with Elists;   use Elists;
32with Layout;   use Layout;
33with Namet;    use Namet;
34with Nlists;   use Nlists;
35with Nmake;    use Nmake;
36with Opt;      use Opt;
37with Output;   use Output;
38with Targparm; use Targparm;
39with Tbuild;   use Tbuild;
40with Ttypes;   use Ttypes;
41with Scn;
42with Sem_Mech; use Sem_Mech;
43with Sem_Util; use Sem_Util;
44with Sinfo;    use Sinfo;
45with Snames;   use Snames;
46with Stand;    use Stand;
47with Uintp;    use Uintp;
48with Urealp;   use Urealp;
49
50package body CStand is
51
52   Stloc  : constant Source_Ptr := Standard_Location;
53   Staloc : constant Source_Ptr := Standard_ASCII_Location;
54   --  Standard abbreviations used throughout this package
55
56   Back_End_Float_Types : Elist_Id := No_Elist;
57   --  List used for any floating point supported by the back end. This needs
58   --  to be at the library level, because the call back procedures retrieving
59   --  this information are at that level.
60
61   -----------------------
62   -- Local Subprograms --
63   -----------------------
64
65   procedure Build_Float_Type
66     (E    : Entity_Id;
67      Siz  : Int;
68      Rep  : Float_Rep_Kind;
69      Digs : Int);
70   --  Procedure to build standard predefined float base type. The first
71   --  parameter is the entity for the type, and the second parameter is the
72   --  size in bits. The third parameter indicates the kind of representation
73   --  to be used. The fourth parameter is the digits value. Each type
74   --  is added to the list of predefined floating point types.
75
76   procedure Build_Signed_Integer_Type (E : Entity_Id; Siz : Int);
77   --  Procedure to build standard predefined signed integer subtype. The
78   --  first parameter is the entity for the subtype. The second parameter
79   --  is the size in bits. The corresponding base type is not built by
80   --  this routine but instead must be built by the caller where needed.
81
82   procedure Copy_Float_Type (To : Entity_Id; From : Entity_Id);
83   --  Build a floating point type, copying representation details from From.
84   --  This is used to create predefined floating point types based on
85   --  available types in the back end.
86
87   procedure Create_Operators;
88   --  Make entries for each of the predefined operators in Standard
89
90   procedure Create_Unconstrained_Base_Type
91     (E : Entity_Id;
92      K : Entity_Kind);
93   --  The predefined signed integer types are constrained subtypes which
94   --  must have a corresponding unconstrained base type. This type is almost
95   --  useless. The only place it has semantics is Subtypes_Statically_Match.
96   --  Consequently, we arrange for it to be identical apart from the setting
97   --  of the constrained bit. This routine takes an entity E for the Type,
98   --  copies it to estabish the base type, then resets the Ekind of the
99   --  original entity to K (the Ekind for the subtype). The Etype field of
100   --  E is set by the call (to point to the created base type entity), and
101   --  also the Is_Constrained flag of E is set.
102   --
103   --  To understand the exact requirement for this, see RM 3.5.4(11) which
104   --  makes it clear that Integer, for example, is constrained, with the
105   --  constraint bounds matching the bounds of the (unconstrained) base
106   --  type. The point is that Integer and Integer'Base have identical
107   --  bounds, but do not statically match, since a subtype with constraints
108   --  never matches a subtype with no constraints.
109
110   function Find_Back_End_Float_Type (Name : String) return Entity_Id;
111   --  Return the first float type in Back_End_Float_Types with the given name.
112   --  Names of entities in back end types, are either type names of C
113   --  predefined types (all lower case), or mode names (upper case).
114   --  These are not generally valid identifier names.
115
116   function Identifier_For (S : Standard_Entity_Type) return Node_Id;
117   --  Returns an identifier node with the same name as the defining
118   --  identifier corresponding to the given Standard_Entity_Type value
119
120   procedure Make_Component
121     (Rec : Entity_Id;
122      Typ : Entity_Id;
123      Nam : String);
124   --  Build a record component with the given type and name, and append to
125   --  the list of components of Rec.
126
127   function Make_Formal
128     (Typ         : Entity_Id;
129      Formal_Name : String) return Entity_Id;
130   --  Construct entity for subprogram formal with given name and type
131
132   function Make_Integer (V : Uint) return Node_Id;
133   --  Builds integer literal with given value
134
135   procedure Make_Name (Id : Entity_Id; Nam : String);
136   --  Make an entry in the names table for Nam, and set as Chars field of Id
137
138   function New_Operator (Op : Name_Id; Typ : Entity_Id) return Entity_Id;
139   --  Build entity for standard operator with given name and type
140
141   function New_Standard_Entity
142     (New_Node_Kind : Node_Kind := N_Defining_Identifier) return Entity_Id;
143   --  Builds a new entity for Standard
144
145   procedure Print_Standard;
146   --  Print representation of package Standard if switch set
147
148   procedure Register_Float_Type
149     (Name      : C_String; -- Nul-terminated string with name of type
150      Digs      : Natural;  -- Nr or digits for floating point, 0 otherwise
151      Complex   : Boolean;  -- True iff type has real and imaginary parts
152      Count     : Natural;  -- Number of elements in vector, 0 otherwise
153      Float_Rep : Float_Rep_Kind; -- Representation used for fpt type
154      Precision : Positive; -- Precision of representation in bits
155      Size      : Positive; -- Size of representation in bits
156      Alignment : Natural); -- Required alignment in bits
157   pragma Convention (C, Register_Float_Type);
158   --  Call back to allow the back end to register available types.
159   --  This call back currently creates predefined floating point base types
160   --  for any floating point types reported by the back end, and adds them
161   --  to the list of predefined float types.
162
163   procedure Set_Integer_Bounds
164     (Id  : Entity_Id;
165      Typ : Entity_Id;
166      Lb  : Uint;
167      Hb  : Uint);
168   --  Procedure to set bounds for integer type or subtype. Id is the entity
169   --  whose bounds and type are to be set. The Typ parameter is the Etype
170   --  value for the entity (which will be the same as Id for all predefined
171   --  integer base types. The third and fourth parameters are the bounds.
172
173   ----------------------
174   -- Build_Float_Type --
175   ----------------------
176
177   procedure Build_Float_Type
178     (E    : Entity_Id;
179      Siz  : Int;
180      Rep  : Float_Rep_Kind;
181      Digs : Int)
182   is
183   begin
184      Set_Type_Definition (Parent (E),
185        Make_Floating_Point_Definition (Stloc,
186          Digits_Expression => Make_Integer (UI_From_Int (Digs))));
187
188      Set_Ekind                      (E, E_Floating_Point_Type);
189      Set_Etype                      (E, E);
190      Set_Float_Rep (E, Rep);
191      Init_Size                      (E, Siz);
192      Set_Elem_Alignment             (E);
193      Init_Digits_Value              (E, Digs);
194      Set_Float_Bounds               (E);
195      Set_Is_Frozen                  (E);
196      Set_Is_Public                  (E);
197      Set_Size_Known_At_Compile_Time (E);
198   end Build_Float_Type;
199
200   ------------------------------
201   -- Find_Back_End_Float_Type --
202   ------------------------------
203
204   function Find_Back_End_Float_Type (Name : String) return Entity_Id is
205      N : Elmt_Id;
206
207   begin
208      N := First_Elmt (Back_End_Float_Types);
209      while Present (N) and then Get_Name_String (Chars (Node (N))) /= Name
210      loop
211         Next_Elmt (N);
212      end loop;
213
214      return Node (N);
215   end Find_Back_End_Float_Type;
216
217   -------------------------------
218   -- Build_Signed_Integer_Type --
219   -------------------------------
220
221   procedure Build_Signed_Integer_Type (E : Entity_Id; Siz : Int) is
222      U2Siz1 : constant Uint := 2 ** (Siz - 1);
223      Lbound : constant Uint := -U2Siz1;
224      Ubound : constant Uint := U2Siz1 - 1;
225
226   begin
227      Set_Type_Definition (Parent (E),
228        Make_Signed_Integer_Type_Definition (Stloc,
229          Low_Bound  => Make_Integer (Lbound),
230          High_Bound => Make_Integer (Ubound)));
231
232      Set_Ekind                      (E, E_Signed_Integer_Type);
233      Set_Etype                      (E, E);
234      Init_Size                      (E, Siz);
235      Set_Elem_Alignment             (E);
236      Set_Integer_Bounds             (E, E, Lbound, Ubound);
237      Set_Is_Frozen                  (E);
238      Set_Is_Public                  (E);
239      Set_Is_Known_Valid             (E);
240      Set_Size_Known_At_Compile_Time (E);
241   end Build_Signed_Integer_Type;
242
243   ---------------------
244   -- Copy_Float_Type --
245   ---------------------
246
247   procedure Copy_Float_Type (To : Entity_Id; From : Entity_Id) is
248   begin
249      Build_Float_Type (To, UI_To_Int (Esize (From)), Float_Rep (From),
250                        UI_To_Int (Digits_Value (From)));
251   end Copy_Float_Type;
252
253   ----------------------
254   -- Create_Operators --
255   ----------------------
256
257   --  Each operator has an abbreviated signature. The formals have the names
258   --  LEFT and RIGHT. Their types are not actually used for resolution.
259
260   procedure Create_Operators is
261      Op_Node : Entity_Id;
262
263      --  The following tables define the binary and unary operators and their
264      --  corresponding result type.
265
266      Binary_Ops : constant array (S_Binary_Ops) of Name_Id :=
267
268         --  There is one entry here for each binary operator, except for the
269         --  case of concatenation, where there are three entries, one for a
270         --  String result, one for Wide_String, and one for Wide_Wide_String.
271
272        (Name_Op_Add,
273         Name_Op_And,
274         Name_Op_Concat,
275         Name_Op_Concat,
276         Name_Op_Concat,
277         Name_Op_Divide,
278         Name_Op_Eq,
279         Name_Op_Expon,
280         Name_Op_Ge,
281         Name_Op_Gt,
282         Name_Op_Le,
283         Name_Op_Lt,
284         Name_Op_Mod,
285         Name_Op_Multiply,
286         Name_Op_Ne,
287         Name_Op_Or,
288         Name_Op_Rem,
289         Name_Op_Subtract,
290         Name_Op_Xor);
291
292      Bin_Op_Types : constant array (S_Binary_Ops) of Entity_Id :=
293
294         --  This table has the corresponding result types. The entries are
295         --  ordered so they correspond to the Binary_Ops array above.
296
297        (Universal_Integer,         -- Add
298         Standard_Boolean,          -- And
299         Standard_String,           -- Concat (String)
300         Standard_Wide_String,      -- Concat (Wide_String)
301         Standard_Wide_Wide_String, -- Concat (Wide_Wide_String)
302         Universal_Integer,         -- Divide
303         Standard_Boolean,          -- Eq
304         Universal_Integer,         -- Expon
305         Standard_Boolean,          -- Ge
306         Standard_Boolean,          -- Gt
307         Standard_Boolean,          -- Le
308         Standard_Boolean,          -- Lt
309         Universal_Integer,         -- Mod
310         Universal_Integer,         -- Multiply
311         Standard_Boolean,          -- Ne
312         Standard_Boolean,          -- Or
313         Universal_Integer,         -- Rem
314         Universal_Integer,         -- Subtract
315         Standard_Boolean);         -- Xor
316
317      Unary_Ops : constant array (S_Unary_Ops) of Name_Id :=
318
319         --  There is one entry here for each unary operator
320
321        (Name_Op_Abs,
322         Name_Op_Subtract,
323         Name_Op_Not,
324         Name_Op_Add);
325
326      Unary_Op_Types : constant array (S_Unary_Ops) of Entity_Id :=
327
328         --  This table has the corresponding result types. The entries are
329         --  ordered so they correspond to the Unary_Ops array above.
330
331        (Universal_Integer,     -- Abs
332         Universal_Integer,     -- Subtract
333         Standard_Boolean,      -- Not
334         Universal_Integer);    -- Add
335
336   begin
337      for J in S_Binary_Ops loop
338         Op_Node := New_Operator (Binary_Ops (J), Bin_Op_Types (J));
339         SE (J)  := Op_Node;
340         Append_Entity (Make_Formal (Any_Type, "LEFT"),  Op_Node);
341         Append_Entity (Make_Formal (Any_Type, "RIGHT"), Op_Node);
342      end loop;
343
344      for J in S_Unary_Ops loop
345         Op_Node := New_Operator (Unary_Ops (J), Unary_Op_Types (J));
346         SE (J)  := Op_Node;
347         Append_Entity (Make_Formal (Any_Type, "RIGHT"), Op_Node);
348      end loop;
349
350      --  For concatenation, we create a separate operator for each
351      --  array type. This simplifies the resolution of the component-
352      --  component concatenation operation. In Standard, we set the types
353      --  of the formals for string, wide [wide]_string, concatenations.
354
355      Set_Etype (First_Entity (Standard_Op_Concat),  Standard_String);
356      Set_Etype (Last_Entity  (Standard_Op_Concat),  Standard_String);
357
358      Set_Etype (First_Entity (Standard_Op_Concatw), Standard_Wide_String);
359      Set_Etype (Last_Entity  (Standard_Op_Concatw), Standard_Wide_String);
360
361      Set_Etype (First_Entity (Standard_Op_Concatww),
362                 Standard_Wide_Wide_String);
363
364      Set_Etype (Last_Entity (Standard_Op_Concatww),
365                 Standard_Wide_Wide_String);
366   end Create_Operators;
367
368   ---------------------
369   -- Create_Standard --
370   ---------------------
371
372   --  The tree for the package Standard is prefixed to all compilations.
373   --  Several entities required by semantic analysis are denoted by global
374   --  variables that are initialized to point to the corresponding occurrences
375   --  in Standard. The visible entities of Standard are created here. Special
376   --  entities maybe created here as well or may be created from the semantics
377   --  module. By not adding them to the Decls list of Standard they will not
378   --  be visible to Ada programs.
379
380   procedure Create_Standard is
381      Decl_S : constant List_Id := New_List;
382      --  List of declarations in Standard
383
384      Decl_A : constant List_Id := New_List;
385      --  List of declarations in ASCII
386
387      Decl       : Node_Id;
388      Pspec      : Node_Id;
389      Tdef_Node  : Node_Id;
390      Ident_Node : Node_Id;
391      Ccode      : Char_Code;
392      E_Id       : Entity_Id;
393      R_Node     : Node_Id;
394      B_Node     : Node_Id;
395
396      procedure Build_Exception (S : Standard_Entity_Type);
397      --  Procedure to declare given entity as an exception
398
399      procedure Create_Back_End_Float_Types;
400      --  Initialize the Back_End_Float_Types list by having the back end
401      --  enumerate all available types and building type entities for them.
402
403      procedure Create_Float_Types;
404      --  Creates entities for all predefined floating point types, and
405      --  adds these to the Predefined_Float_Types list in package Standard.
406
407      procedure Pack_String_Type (String_Type : Entity_Id);
408      --  Generate proper tree for pragma Pack that applies to given type, and
409      --  mark type as having the pragma.
410
411      ---------------------
412      -- Build_Exception --
413      ---------------------
414
415      procedure Build_Exception (S : Standard_Entity_Type) is
416      begin
417         Set_Ekind          (Standard_Entity (S), E_Exception);
418         Set_Etype          (Standard_Entity (S), Standard_Exception_Type);
419         Set_Exception_Code (Standard_Entity (S), Uint_0);
420         Set_Is_Public      (Standard_Entity (S), True);
421
422         Decl :=
423           Make_Exception_Declaration (Stloc,
424             Defining_Identifier => Standard_Entity (S));
425         Append (Decl, Decl_S);
426      end Build_Exception;
427
428      ---------------------------
429      -- Create_Back_End_Float_Types --
430      ---------------------------
431
432      procedure Create_Back_End_Float_Types is
433      begin
434         Back_End_Float_Types := No_Elist;
435         Register_Back_End_Types (Register_Float_Type'Access);
436      end Create_Back_End_Float_Types;
437
438      ------------------------
439      -- Create_Float_Types --
440      ------------------------
441
442      procedure Create_Float_Types is
443      begin
444         --  Create type definition nodes for predefined float types
445
446         Copy_Float_Type
447           (Standard_Short_Float,
448            Find_Back_End_Float_Type ("float"));
449         Set_Is_Implementation_Defined (Standard_Short_Float);
450
451         Copy_Float_Type (Standard_Float, Standard_Short_Float);
452
453         Copy_Float_Type (Standard_Long_Float,
454           Find_Back_End_Float_Type ("double"));
455
456         Predefined_Float_Types := New_Elmt_List;
457         Append_Elmt (Standard_Short_Float, Predefined_Float_Types);
458         Append_Elmt (Standard_Float, Predefined_Float_Types);
459         Append_Elmt (Standard_Long_Float, Predefined_Float_Types);
460
461         --  ??? For now, we don't have a good way to tell the widest float
462         --  type with hardware support. Basically, GCC knows the size of that
463         --  type, but on x86-64 there often are two or three 128-bit types,
464         --  one double extended that has 18 decimal digits, a 128-bit quad
465         --  precision type with 33 digits and possibly a 128-bit decimal float
466         --  type with 34 digits. As a workaround, we define Long_Long_Float as
467         --  C's "long double" if that type exists and has at most 18 digits,
468         --  or otherwise the same as Long_Float.
469
470         declare
471            Max_HW_Digs : constant := 18;
472            --  Maximum hardware digits supported
473
474            LLF : Entity_Id := Find_Back_End_Float_Type ("long double");
475            --  Entity for long double type
476
477         begin
478            if No (LLF) or else Digits_Value (LLF) > Max_HW_Digs then
479               LLF := Standard_Long_Float;
480            end if;
481
482            Set_Is_Implementation_Defined (Standard_Long_Long_Float);
483            Copy_Float_Type (Standard_Long_Long_Float, LLF);
484
485            Append_Elmt (Standard_Long_Long_Float, Predefined_Float_Types);
486         end;
487
488         --  Any other back end types are appended at the end of the list of
489         --  predefined float types, and will only be selected if the none of
490         --  the types in Standard is suitable, or if a specific named type is
491         --  requested through a pragma Import.
492
493         while not Is_Empty_Elmt_List (Back_End_Float_Types) loop
494            declare
495               E : constant Elmt_Id := First_Elmt (Back_End_Float_Types);
496            begin
497               Append_Elmt (Node (E), To => Predefined_Float_Types);
498               Remove_Elmt (Back_End_Float_Types, E);
499            end;
500         end loop;
501      end Create_Float_Types;
502
503      ----------------------
504      -- Pack_String_Type --
505      ----------------------
506
507      procedure Pack_String_Type (String_Type : Entity_Id) is
508         Prag : constant Node_Id :=
509           Make_Pragma (Stloc,
510             Chars                        => Name_Pack,
511             Pragma_Argument_Associations =>
512               New_List (
513                 Make_Pragma_Argument_Association (Stloc,
514                   Expression => New_Occurrence_Of (String_Type, Stloc))));
515      begin
516         Append (Prag, Decl_S);
517         Record_Rep_Item (String_Type, Prag);
518         Set_Has_Pragma_Pack (String_Type, True);
519      end Pack_String_Type;
520
521   --  Start of processing for Create_Standard
522
523   begin
524      --  Initialize scanner for internal scans of literals
525
526      Scn.Initialize_Scanner (No_Unit, Internal_Source_File);
527
528      --  First step is to create defining identifiers for each entity
529
530      for S in Standard_Entity_Type loop
531         declare
532            S_Name : constant String := Standard_Entity_Type'Image (S);
533            --  Name of entity (note we skip S_ at the start)
534
535            Ident_Node : Node_Id;
536            --  Defining identifier node
537
538         begin
539            Ident_Node := New_Standard_Entity;
540            Make_Name (Ident_Node, S_Name (3 .. S_Name'Length));
541            Standard_Entity (S) := Ident_Node;
542         end;
543      end loop;
544
545      --  Create package declaration node for package Standard
546
547      Standard_Package_Node := New_Node (N_Package_Declaration, Stloc);
548
549      Pspec := New_Node (N_Package_Specification, Stloc);
550      Set_Specification (Standard_Package_Node, Pspec);
551
552      Set_Defining_Unit_Name (Pspec, Standard_Standard);
553      Set_Visible_Declarations (Pspec, Decl_S);
554
555      Set_Ekind (Standard_Standard, E_Package);
556      Set_Is_Pure (Standard_Standard);
557      Set_Is_Compilation_Unit (Standard_Standard);
558
559      --  Create type/subtype declaration nodes for standard types
560
561      for S in S_Types loop
562
563         --  Subtype declaration case
564
565         if S = S_Natural or else S = S_Positive then
566            Decl := New_Node (N_Subtype_Declaration, Stloc);
567            Set_Subtype_Indication (Decl,
568              New_Occurrence_Of (Standard_Integer, Stloc));
569
570         --  Full type declaration case
571
572         else
573            Decl := New_Node (N_Full_Type_Declaration, Stloc);
574         end if;
575
576         Set_Is_Frozen (Standard_Entity (S));
577         Set_Is_Public (Standard_Entity (S));
578         Set_Defining_Identifier (Decl, Standard_Entity (S));
579         Append (Decl, Decl_S);
580      end loop;
581
582      Create_Back_End_Float_Types;
583
584      --  Create type definition node for type Boolean. The Size is set to
585      --  1 as required by Ada 95 and current ARG interpretations for Ada/83.
586
587      --  Note: Object_Size of Boolean is 8. This means that we do NOT in
588      --  general know that Boolean variables have valid values, so we do
589      --  not set the Is_Known_Valid flag.
590
591      Tdef_Node := New_Node (N_Enumeration_Type_Definition, Stloc);
592      Set_Literals (Tdef_Node, New_List);
593      Append (Standard_False, Literals (Tdef_Node));
594      Append (Standard_True, Literals (Tdef_Node));
595      Set_Type_Definition (Parent (Standard_Boolean), Tdef_Node);
596
597      Set_Ekind          (Standard_Boolean, E_Enumeration_Type);
598      Set_First_Literal  (Standard_Boolean, Standard_False);
599      Set_Etype          (Standard_Boolean, Standard_Boolean);
600      Init_Esize         (Standard_Boolean, Standard_Character_Size);
601      Init_RM_Size       (Standard_Boolean, 1);
602      Set_Elem_Alignment (Standard_Boolean);
603
604      Set_Is_Unsigned_Type           (Standard_Boolean);
605      Set_Size_Known_At_Compile_Time (Standard_Boolean);
606      Set_Has_Pragma_Ordered         (Standard_Boolean);
607
608      Set_Ekind           (Standard_True, E_Enumeration_Literal);
609      Set_Etype           (Standard_True, Standard_Boolean);
610      Set_Enumeration_Pos (Standard_True, Uint_1);
611      Set_Enumeration_Rep (Standard_True, Uint_1);
612      Set_Is_Known_Valid  (Standard_True, True);
613
614      Set_Ekind           (Standard_False, E_Enumeration_Literal);
615      Set_Etype           (Standard_False, Standard_Boolean);
616      Set_Enumeration_Pos (Standard_False, Uint_0);
617      Set_Enumeration_Rep (Standard_False, Uint_0);
618      Set_Is_Known_Valid  (Standard_False, True);
619
620      --  For the bounds of Boolean, we create a range node corresponding to
621
622      --    range False .. True
623
624      --  where the occurrences of the literals must point to the
625      --  corresponding definition.
626
627      R_Node := New_Node (N_Range, Stloc);
628      B_Node := New_Node (N_Identifier, Stloc);
629      Set_Chars  (B_Node, Chars (Standard_False));
630      Set_Entity (B_Node,  Standard_False);
631      Set_Etype  (B_Node, Standard_Boolean);
632      Set_Is_Static_Expression (B_Node);
633      Set_Low_Bound  (R_Node, B_Node);
634
635      B_Node := New_Node (N_Identifier, Stloc);
636      Set_Chars  (B_Node, Chars (Standard_True));
637      Set_Entity (B_Node,  Standard_True);
638      Set_Etype  (B_Node, Standard_Boolean);
639      Set_Is_Static_Expression (B_Node);
640      Set_High_Bound (R_Node, B_Node);
641
642      Set_Scalar_Range (Standard_Boolean, R_Node);
643      Set_Etype (R_Node, Standard_Boolean);
644      Set_Parent (R_Node, Standard_Boolean);
645
646      --  Record entity identifiers for boolean literals in the
647      --  Boolean_Literals array, for easy reference during expansion.
648
649      Boolean_Literals := (False => Standard_False, True => Standard_True);
650
651      --  Create type definition nodes for predefined integer types
652
653      Build_Signed_Integer_Type
654        (Standard_Short_Short_Integer, Standard_Short_Short_Integer_Size);
655
656      Build_Signed_Integer_Type
657        (Standard_Short_Integer, Standard_Short_Integer_Size);
658
659      Build_Signed_Integer_Type
660        (Standard_Integer, Standard_Integer_Size);
661
662      declare
663         LIS : Nat;
664      begin
665         if Debug_Flag_M then
666            LIS := 64;
667         else
668            LIS := Standard_Long_Integer_Size;
669         end if;
670
671         Build_Signed_Integer_Type (Standard_Long_Integer, LIS);
672      end;
673
674      Build_Signed_Integer_Type
675        (Standard_Long_Long_Integer, Standard_Long_Long_Integer_Size);
676      Set_Is_Implementation_Defined (Standard_Long_Long_Integer);
677
678      Create_Unconstrained_Base_Type
679        (Standard_Short_Short_Integer, E_Signed_Integer_Subtype);
680      Set_Is_Implementation_Defined (Standard_Short_Short_Integer);
681
682      Create_Unconstrained_Base_Type
683        (Standard_Short_Integer, E_Signed_Integer_Subtype);
684
685      Create_Unconstrained_Base_Type
686        (Standard_Integer, E_Signed_Integer_Subtype);
687
688      Create_Unconstrained_Base_Type
689        (Standard_Long_Integer, E_Signed_Integer_Subtype);
690
691      Create_Unconstrained_Base_Type
692        (Standard_Long_Long_Integer, E_Signed_Integer_Subtype);
693      Set_Is_Implementation_Defined (Standard_Short_Short_Integer);
694
695      Create_Float_Types;
696
697      --  Create type definition node for type Character. Note that we do not
698      --  set the Literals field, since type Character is handled with special
699      --  routine that do not need a literal list.
700
701      Tdef_Node := New_Node (N_Enumeration_Type_Definition, Stloc);
702      Set_Type_Definition (Parent (Standard_Character), Tdef_Node);
703
704      Set_Ekind          (Standard_Character, E_Enumeration_Type);
705      Set_Etype          (Standard_Character, Standard_Character);
706      Init_Esize         (Standard_Character, Standard_Character_Size);
707      Init_RM_Size       (Standard_Character, 8);
708      Set_Elem_Alignment (Standard_Character);
709
710      Set_Has_Pragma_Ordered         (Standard_Character);
711      Set_Is_Unsigned_Type           (Standard_Character);
712      Set_Is_Character_Type          (Standard_Character);
713      Set_Is_Known_Valid             (Standard_Character);
714      Set_Size_Known_At_Compile_Time (Standard_Character);
715
716      --  Create the bounds for type Character
717
718      R_Node := New_Node (N_Range, Stloc);
719
720      --  Low bound for type Character (Standard.Nul)
721
722      B_Node := New_Node (N_Character_Literal, Stloc);
723      Set_Is_Static_Expression (B_Node);
724      Set_Chars                (B_Node, No_Name);
725      Set_Char_Literal_Value   (B_Node, Uint_0);
726      Set_Entity               (B_Node, Empty);
727      Set_Etype                (B_Node, Standard_Character);
728      Set_Low_Bound (R_Node, B_Node);
729
730      --  High bound for type Character
731
732      B_Node := New_Node (N_Character_Literal, Stloc);
733      Set_Is_Static_Expression (B_Node);
734      Set_Chars                (B_Node, No_Name);
735      Set_Char_Literal_Value   (B_Node, UI_From_Int (16#FF#));
736      Set_Entity               (B_Node, Empty);
737      Set_Etype                (B_Node, Standard_Character);
738      Set_High_Bound (R_Node, B_Node);
739
740      Set_Scalar_Range (Standard_Character, R_Node);
741      Set_Etype (R_Node, Standard_Character);
742      Set_Parent (R_Node, Standard_Character);
743
744      --  Create type definition for type Wide_Character. Note that we do not
745      --  set the Literals field, since type Wide_Character is handled with
746      --  special routines that do not need a literal list.
747
748      Tdef_Node := New_Node (N_Enumeration_Type_Definition, Stloc);
749      Set_Type_Definition (Parent (Standard_Wide_Character), Tdef_Node);
750
751      Set_Ekind      (Standard_Wide_Character, E_Enumeration_Type);
752      Set_Etype      (Standard_Wide_Character, Standard_Wide_Character);
753      Init_Size      (Standard_Wide_Character, Standard_Wide_Character_Size);
754
755      Set_Elem_Alignment             (Standard_Wide_Character);
756      Set_Has_Pragma_Ordered         (Standard_Wide_Character);
757      Set_Is_Unsigned_Type           (Standard_Wide_Character);
758      Set_Is_Character_Type          (Standard_Wide_Character);
759      Set_Is_Known_Valid             (Standard_Wide_Character);
760      Set_Size_Known_At_Compile_Time (Standard_Wide_Character);
761
762      --  Create the bounds for type Wide_Character
763
764      R_Node := New_Node (N_Range, Stloc);
765
766      --  Low bound for type Wide_Character
767
768      B_Node := New_Node (N_Character_Literal, Stloc);
769      Set_Is_Static_Expression (B_Node);
770      Set_Chars                (B_Node, No_Name);    --  ???
771      Set_Char_Literal_Value   (B_Node, Uint_0);
772      Set_Entity               (B_Node, Empty);
773      Set_Etype                (B_Node, Standard_Wide_Character);
774      Set_Low_Bound (R_Node, B_Node);
775
776      --  High bound for type Wide_Character
777
778      B_Node := New_Node (N_Character_Literal, Stloc);
779      Set_Is_Static_Expression (B_Node);
780      Set_Chars                (B_Node, No_Name);    --  ???
781      Set_Char_Literal_Value   (B_Node, UI_From_Int (16#FFFF#));
782      Set_Entity               (B_Node, Empty);
783      Set_Etype                (B_Node, Standard_Wide_Character);
784      Set_High_Bound           (R_Node, B_Node);
785
786      Set_Scalar_Range (Standard_Wide_Character, R_Node);
787      Set_Etype (R_Node, Standard_Wide_Character);
788      Set_Parent (R_Node, Standard_Wide_Character);
789
790      --  Create type definition for type Wide_Wide_Character. Note that we
791      --  do not set the Literals field, since type Wide_Wide_Character is
792      --  handled with special routines that do not need a literal list.
793
794      Tdef_Node := New_Node (N_Enumeration_Type_Definition, Stloc);
795      Set_Type_Definition (Parent (Standard_Wide_Wide_Character), Tdef_Node);
796
797      Set_Ekind (Standard_Wide_Wide_Character, E_Enumeration_Type);
798      Set_Etype (Standard_Wide_Wide_Character,
799                 Standard_Wide_Wide_Character);
800      Init_Size (Standard_Wide_Wide_Character,
801                 Standard_Wide_Wide_Character_Size);
802
803      Set_Elem_Alignment             (Standard_Wide_Wide_Character);
804      Set_Has_Pragma_Ordered         (Standard_Wide_Wide_Character);
805      Set_Is_Unsigned_Type           (Standard_Wide_Wide_Character);
806      Set_Is_Character_Type          (Standard_Wide_Wide_Character);
807      Set_Is_Known_Valid             (Standard_Wide_Wide_Character);
808      Set_Size_Known_At_Compile_Time (Standard_Wide_Wide_Character);
809      Set_Is_Ada_2005_Only           (Standard_Wide_Wide_Character);
810
811      --  Create the bounds for type Wide_Wide_Character
812
813      R_Node := New_Node (N_Range, Stloc);
814
815      --  Low bound for type Wide_Wide_Character
816
817      B_Node := New_Node (N_Character_Literal, Stloc);
818      Set_Is_Static_Expression (B_Node);
819      Set_Chars                (B_Node, No_Name);    --  ???
820      Set_Char_Literal_Value   (B_Node, Uint_0);
821      Set_Entity               (B_Node, Empty);
822      Set_Etype                (B_Node, Standard_Wide_Wide_Character);
823      Set_Low_Bound (R_Node, B_Node);
824
825      --  High bound for type Wide_Wide_Character
826
827      B_Node := New_Node (N_Character_Literal, Stloc);
828      Set_Is_Static_Expression (B_Node);
829      Set_Chars                (B_Node, No_Name);    --  ???
830      Set_Char_Literal_Value   (B_Node, UI_From_Int (16#7FFF_FFFF#));
831      Set_Entity               (B_Node, Empty);
832      Set_Etype                (B_Node, Standard_Wide_Wide_Character);
833      Set_High_Bound           (R_Node, B_Node);
834
835      Set_Scalar_Range (Standard_Wide_Wide_Character, R_Node);
836      Set_Etype (R_Node, Standard_Wide_Wide_Character);
837      Set_Parent (R_Node, Standard_Wide_Wide_Character);
838
839      --  Create type definition node for type String
840
841      Tdef_Node := New_Node (N_Unconstrained_Array_Definition, Stloc);
842
843      declare
844         CompDef_Node : Node_Id;
845      begin
846         CompDef_Node := New_Node (N_Component_Definition, Stloc);
847         Set_Aliased_Present      (CompDef_Node, False);
848         Set_Access_Definition    (CompDef_Node, Empty);
849         Set_Subtype_Indication   (CompDef_Node, Identifier_For (S_Character));
850         Set_Component_Definition (Tdef_Node, CompDef_Node);
851      end;
852
853      Set_Subtype_Marks      (Tdef_Node, New_List);
854      Append (Identifier_For (S_Positive), Subtype_Marks (Tdef_Node));
855      Set_Type_Definition (Parent (Standard_String), Tdef_Node);
856
857      Set_Ekind           (Standard_String, E_String_Type);
858      Set_Etype           (Standard_String, Standard_String);
859      Set_Component_Type  (Standard_String, Standard_Character);
860      Set_Component_Size  (Standard_String, Uint_8);
861      Init_Size_Align     (Standard_String);
862      Set_Alignment       (Standard_String, Uint_1);
863      Pack_String_Type    (Standard_String);
864
865      --  On targets where a storage unit is larger than a byte (such as AAMP),
866      --  pragma Pack has a real effect on the representation of type String,
867      --  and the type must be marked as having a nonstandard representation.
868
869      if System_Storage_Unit > Uint_8 then
870         Set_Has_Non_Standard_Rep (Standard_String);
871         Set_Has_Pragma_Pack      (Standard_String);
872      end if;
873
874      --  Set index type of String
875
876      E_Id := First
877        (Subtype_Marks (Type_Definition (Parent (Standard_String))));
878      Set_First_Index (Standard_String, E_Id);
879      Set_Entity (E_Id, Standard_Positive);
880      Set_Etype (E_Id, Standard_Positive);
881
882      --  Create type definition node for type Wide_String
883
884      Tdef_Node := New_Node (N_Unconstrained_Array_Definition, Stloc);
885
886      declare
887         CompDef_Node : Node_Id;
888      begin
889         CompDef_Node := New_Node (N_Component_Definition, Stloc);
890         Set_Aliased_Present    (CompDef_Node, False);
891         Set_Access_Definition  (CompDef_Node, Empty);
892         Set_Subtype_Indication (CompDef_Node,
893                                 Identifier_For (S_Wide_Character));
894         Set_Component_Definition (Tdef_Node, CompDef_Node);
895      end;
896
897      Set_Subtype_Marks (Tdef_Node, New_List);
898      Append (Identifier_For (S_Positive), Subtype_Marks (Tdef_Node));
899      Set_Type_Definition (Parent (Standard_Wide_String), Tdef_Node);
900
901      Set_Ekind           (Standard_Wide_String, E_String_Type);
902      Set_Etype           (Standard_Wide_String, Standard_Wide_String);
903      Set_Component_Type  (Standard_Wide_String, Standard_Wide_Character);
904      Set_Component_Size  (Standard_Wide_String, Uint_16);
905      Init_Size_Align     (Standard_Wide_String);
906      Pack_String_Type    (Standard_Wide_String);
907
908      --  Set index type of Wide_String
909
910      E_Id := First
911        (Subtype_Marks (Type_Definition (Parent (Standard_Wide_String))));
912      Set_First_Index (Standard_Wide_String, E_Id);
913      Set_Entity (E_Id, Standard_Positive);
914      Set_Etype (E_Id, Standard_Positive);
915
916      --  Create type definition node for type Wide_Wide_String
917
918      Tdef_Node := New_Node (N_Unconstrained_Array_Definition, Stloc);
919
920      declare
921         CompDef_Node : Node_Id;
922      begin
923         CompDef_Node := New_Node (N_Component_Definition, Stloc);
924         Set_Aliased_Present    (CompDef_Node, False);
925         Set_Access_Definition  (CompDef_Node, Empty);
926         Set_Subtype_Indication (CompDef_Node,
927                                 Identifier_For (S_Wide_Wide_Character));
928         Set_Component_Definition (Tdef_Node, CompDef_Node);
929      end;
930
931      Set_Subtype_Marks (Tdef_Node, New_List);
932      Append (Identifier_For (S_Positive), Subtype_Marks (Tdef_Node));
933      Set_Type_Definition (Parent (Standard_Wide_Wide_String), Tdef_Node);
934
935      Set_Ekind            (Standard_Wide_Wide_String, E_String_Type);
936      Set_Etype            (Standard_Wide_Wide_String,
937                            Standard_Wide_Wide_String);
938      Set_Component_Type   (Standard_Wide_Wide_String,
939                            Standard_Wide_Wide_Character);
940      Set_Component_Size   (Standard_Wide_Wide_String, Uint_32);
941      Init_Size_Align      (Standard_Wide_Wide_String);
942      Set_Is_Ada_2005_Only (Standard_Wide_Wide_String);
943      Pack_String_Type     (Standard_Wide_Wide_String);
944
945      --  Set index type of Wide_Wide_String
946
947      E_Id := First
948        (Subtype_Marks (Type_Definition (Parent (Standard_Wide_Wide_String))));
949      Set_First_Index (Standard_Wide_Wide_String, E_Id);
950      Set_Entity (E_Id, Standard_Positive);
951      Set_Etype (E_Id, Standard_Positive);
952
953      --  Setup entity for Natural
954
955      Set_Ekind          (Standard_Natural, E_Signed_Integer_Subtype);
956      Set_Etype          (Standard_Natural, Base_Type (Standard_Integer));
957      Init_Esize         (Standard_Natural, Standard_Integer_Size);
958      Init_RM_Size       (Standard_Natural, Standard_Integer_Size - 1);
959      Set_Elem_Alignment (Standard_Natural);
960      Set_Size_Known_At_Compile_Time
961                         (Standard_Natural);
962      Set_Integer_Bounds (Standard_Natural,
963        Typ => Base_Type (Standard_Integer),
964        Lb  => Uint_0,
965        Hb  => Intval (High_Bound (Scalar_Range (Standard_Integer))));
966      Set_Is_Constrained (Standard_Natural);
967
968      --  Setup entity for Positive
969
970      Set_Ekind          (Standard_Positive, E_Signed_Integer_Subtype);
971      Set_Etype          (Standard_Positive, Base_Type (Standard_Integer));
972      Init_Esize         (Standard_Positive, Standard_Integer_Size);
973      Init_RM_Size       (Standard_Positive, Standard_Integer_Size - 1);
974      Set_Elem_Alignment (Standard_Positive);
975
976      Set_Size_Known_At_Compile_Time (Standard_Positive);
977
978      Set_Integer_Bounds   (Standard_Positive,
979         Typ => Base_Type (Standard_Integer),
980         Lb  => Uint_1,
981         Hb  => Intval (High_Bound (Scalar_Range (Standard_Integer))));
982      Set_Is_Constrained   (Standard_Positive);
983
984      --  Create declaration for package ASCII
985
986      Decl := New_Node (N_Package_Declaration, Stloc);
987      Append (Decl, Decl_S);
988
989      Pspec := New_Node (N_Package_Specification, Stloc);
990      Set_Specification (Decl, Pspec);
991
992      Set_Defining_Unit_Name (Pspec, Standard_Entity (S_ASCII));
993      Set_Ekind (Standard_Entity (S_ASCII), E_Package);
994      Set_Visible_Declarations (Pspec, Decl_A);
995
996      --  Create control character definitions in package ASCII. Note that
997      --  the character literal entries created here correspond to literal
998      --  values that are impossible in the source, but can be represented
999      --  internally with no difficulties.
1000
1001      Ccode := 16#00#;
1002
1003      for S in S_ASCII_Names loop
1004         Decl := New_Node (N_Object_Declaration, Staloc);
1005         Set_Constant_Present (Decl, True);
1006
1007         declare
1008            A_Char    : constant Entity_Id := Standard_Entity (S);
1009            Expr_Decl : Node_Id;
1010
1011         begin
1012            Set_Sloc                   (A_Char, Staloc);
1013            Set_Ekind                  (A_Char, E_Constant);
1014            Set_Never_Set_In_Source    (A_Char, True);
1015            Set_Is_True_Constant       (A_Char, True);
1016            Set_Etype                  (A_Char, Standard_Character);
1017            Set_Scope                  (A_Char, Standard_Entity (S_ASCII));
1018            Set_Is_Immediately_Visible (A_Char, False);
1019            Set_Is_Public              (A_Char, True);
1020            Set_Is_Known_Valid         (A_Char, True);
1021
1022            Append_Entity (A_Char, Standard_Entity (S_ASCII));
1023            Set_Defining_Identifier (Decl, A_Char);
1024
1025            Set_Object_Definition (Decl, Identifier_For (S_Character));
1026            Expr_Decl := New_Node (N_Character_Literal, Staloc);
1027            Set_Expression (Decl, Expr_Decl);
1028
1029            Set_Is_Static_Expression (Expr_Decl);
1030            Set_Chars                (Expr_Decl, No_Name);
1031            Set_Etype                (Expr_Decl, Standard_Character);
1032            Set_Char_Literal_Value   (Expr_Decl, UI_From_Int (Int (Ccode)));
1033         end;
1034
1035         Append (Decl, Decl_A);
1036
1037         --  Increment character code, dealing with non-contiguities
1038
1039         Ccode := Ccode + 1;
1040
1041         if Ccode = 16#20# then
1042            Ccode := 16#21#;
1043         elsif Ccode = 16#27# then
1044            Ccode := 16#3A#;
1045         elsif Ccode = 16#3C# then
1046            Ccode := 16#3F#;
1047         elsif Ccode = 16#41# then
1048            Ccode := 16#5B#;
1049         end if;
1050      end loop;
1051
1052      --  Create semantic phase entities
1053
1054      Standard_Void_Type := New_Standard_Entity;
1055      Set_Ekind       (Standard_Void_Type, E_Void);
1056      Set_Etype       (Standard_Void_Type, Standard_Void_Type);
1057      Set_Scope       (Standard_Void_Type, Standard_Standard);
1058      Make_Name       (Standard_Void_Type, "_void_type");
1059
1060      --  The type field of packages is set to void
1061
1062      Set_Etype (Standard_Standard, Standard_Void_Type);
1063      Set_Etype (Standard_ASCII, Standard_Void_Type);
1064
1065      --  Standard_A_String is actually used in generated code, so it has a
1066      --  type name that is reasonable, but does not overlap any Ada name.
1067
1068      Standard_A_String := New_Standard_Entity;
1069      Set_Ekind      (Standard_A_String, E_Access_Type);
1070      Set_Scope      (Standard_A_String, Standard_Standard);
1071      Set_Etype      (Standard_A_String, Standard_A_String);
1072
1073      if Debug_Flag_6 then
1074         Init_Size   (Standard_A_String, System_Address_Size);
1075      else
1076         Init_Size   (Standard_A_String, System_Address_Size * 2);
1077      end if;
1078
1079      Init_Alignment (Standard_A_String);
1080
1081      Set_Directly_Designated_Type
1082                     (Standard_A_String, Standard_String);
1083      Make_Name      (Standard_A_String, "access_string");
1084
1085      Standard_A_Char := New_Standard_Entity;
1086      Set_Ekind          (Standard_A_Char, E_Access_Type);
1087      Set_Scope          (Standard_A_Char, Standard_Standard);
1088      Set_Etype          (Standard_A_Char, Standard_A_String);
1089      Init_Size          (Standard_A_Char, System_Address_Size);
1090      Set_Elem_Alignment (Standard_A_Char);
1091
1092      Set_Directly_Designated_Type (Standard_A_Char, Standard_Character);
1093      Make_Name     (Standard_A_Char, "access_character");
1094
1095      --  Standard_Debug_Renaming_Type is used for the special objects created
1096      --  to encode the names occurring in renaming declarations for use by the
1097      --  debugger (see exp_dbug.adb). The type is a zero-sized subtype of
1098      --  Standard.Integer.
1099
1100      Standard_Debug_Renaming_Type := New_Standard_Entity;
1101
1102      Set_Ekind (Standard_Debug_Renaming_Type, E_Signed_Integer_Subtype);
1103      Set_Scope (Standard_Debug_Renaming_Type, Standard_Standard);
1104      Set_Etype (Standard_Debug_Renaming_Type, Base_Type (Standard_Integer));
1105      Init_Esize          (Standard_Debug_Renaming_Type, 0);
1106      Init_RM_Size        (Standard_Debug_Renaming_Type, 0);
1107      Set_Size_Known_At_Compile_Time (Standard_Debug_Renaming_Type);
1108      Set_Integer_Bounds  (Standard_Debug_Renaming_Type,
1109        Typ => Base_Type  (Standard_Debug_Renaming_Type),
1110        Lb  => Uint_1,
1111        Hb  => Uint_0);
1112      Set_Is_Constrained  (Standard_Debug_Renaming_Type);
1113      Set_Has_Size_Clause (Standard_Debug_Renaming_Type);
1114
1115      Make_Name           (Standard_Debug_Renaming_Type, "_renaming_type");
1116
1117      --  Note on type names. The type names for the following special types
1118      --  are constructed so that they will look reasonable should they ever
1119      --  appear in error messages etc, although in practice the use of the
1120      --  special insertion character } for types results in special handling
1121      --  of these type names in any case. The blanks in these names would
1122      --  trouble in Gigi, but that's OK here, since none of these types
1123      --  should ever get through to Gigi! Attributes of these types are
1124      --  filled out to minimize problems with cascaded errors (for example,
1125      --  Any_Integer is given reasonable and consistent type and size values)
1126
1127      Any_Type := New_Standard_Entity;
1128      Decl := New_Node (N_Full_Type_Declaration, Stloc);
1129      Set_Defining_Identifier (Decl, Any_Type);
1130      Set_Scope (Any_Type, Standard_Standard);
1131      Build_Signed_Integer_Type (Any_Type, Standard_Integer_Size);
1132      Make_Name (Any_Type, "any type");
1133
1134      Any_Id := New_Standard_Entity;
1135      Set_Ekind             (Any_Id, E_Variable);
1136      Set_Scope             (Any_Id, Standard_Standard);
1137      Set_Etype             (Any_Id, Any_Type);
1138      Init_Esize            (Any_Id);
1139      Init_Alignment        (Any_Id);
1140      Make_Name             (Any_Id, "any id");
1141
1142      Any_Access := New_Standard_Entity;
1143      Set_Ekind             (Any_Access, E_Access_Type);
1144      Set_Scope             (Any_Access, Standard_Standard);
1145      Set_Etype             (Any_Access, Any_Access);
1146      Init_Size             (Any_Access, System_Address_Size);
1147      Set_Elem_Alignment    (Any_Access);
1148      Make_Name             (Any_Access, "an access type");
1149
1150      Any_Character := New_Standard_Entity;
1151      Set_Ekind             (Any_Character, E_Enumeration_Type);
1152      Set_Scope             (Any_Character, Standard_Standard);
1153      Set_Etype             (Any_Character, Any_Character);
1154      Set_Is_Unsigned_Type  (Any_Character);
1155      Set_Is_Character_Type (Any_Character);
1156      Init_Esize            (Any_Character, Standard_Character_Size);
1157      Init_RM_Size          (Any_Character, 8);
1158      Set_Elem_Alignment    (Any_Character);
1159      Set_Scalar_Range      (Any_Character, Scalar_Range (Standard_Character));
1160      Make_Name             (Any_Character, "a character type");
1161
1162      Any_Array := New_Standard_Entity;
1163      Set_Ekind             (Any_Array, E_String_Type);
1164      Set_Scope             (Any_Array, Standard_Standard);
1165      Set_Etype             (Any_Array, Any_Array);
1166      Set_Component_Type    (Any_Array, Any_Character);
1167      Init_Size_Align       (Any_Array);
1168      Make_Name             (Any_Array, "an array type");
1169
1170      Any_Boolean := New_Standard_Entity;
1171      Set_Ekind             (Any_Boolean, E_Enumeration_Type);
1172      Set_Scope             (Any_Boolean, Standard_Standard);
1173      Set_Etype             (Any_Boolean, Standard_Boolean);
1174      Init_Esize            (Any_Boolean, Standard_Character_Size);
1175      Init_RM_Size          (Any_Boolean, 1);
1176      Set_Elem_Alignment    (Any_Boolean);
1177      Set_Is_Unsigned_Type  (Any_Boolean);
1178      Set_Scalar_Range      (Any_Boolean, Scalar_Range (Standard_Boolean));
1179      Make_Name             (Any_Boolean, "a boolean type");
1180
1181      Any_Composite := New_Standard_Entity;
1182      Set_Ekind             (Any_Composite, E_Array_Type);
1183      Set_Scope             (Any_Composite, Standard_Standard);
1184      Set_Etype             (Any_Composite, Any_Composite);
1185      Set_Component_Size    (Any_Composite, Uint_0);
1186      Set_Component_Type    (Any_Composite, Standard_Integer);
1187      Init_Size_Align       (Any_Composite);
1188      Make_Name             (Any_Composite, "a composite type");
1189
1190      Any_Discrete := New_Standard_Entity;
1191      Set_Ekind             (Any_Discrete, E_Signed_Integer_Type);
1192      Set_Scope             (Any_Discrete, Standard_Standard);
1193      Set_Etype             (Any_Discrete, Any_Discrete);
1194      Init_Size             (Any_Discrete, Standard_Integer_Size);
1195      Set_Elem_Alignment    (Any_Discrete);
1196      Make_Name             (Any_Discrete, "a discrete type");
1197
1198      Any_Fixed := New_Standard_Entity;
1199      Set_Ekind             (Any_Fixed, E_Ordinary_Fixed_Point_Type);
1200      Set_Scope             (Any_Fixed, Standard_Standard);
1201      Set_Etype             (Any_Fixed, Any_Fixed);
1202      Init_Size             (Any_Fixed, Standard_Integer_Size);
1203      Set_Elem_Alignment    (Any_Fixed);
1204      Make_Name             (Any_Fixed, "a fixed-point type");
1205
1206      Any_Integer := New_Standard_Entity;
1207      Set_Ekind             (Any_Integer, E_Signed_Integer_Type);
1208      Set_Scope             (Any_Integer, Standard_Standard);
1209      Set_Etype             (Any_Integer, Standard_Long_Long_Integer);
1210      Init_Size             (Any_Integer, Standard_Long_Long_Integer_Size);
1211      Set_Elem_Alignment    (Any_Integer);
1212
1213      Set_Integer_Bounds
1214        (Any_Integer,
1215         Typ => Base_Type (Standard_Integer),
1216         Lb  => Uint_0,
1217         Hb  => Intval (High_Bound (Scalar_Range (Standard_Integer))));
1218      Make_Name (Any_Integer, "an integer type");
1219
1220      Any_Modular := New_Standard_Entity;
1221      Set_Ekind             (Any_Modular, E_Modular_Integer_Type);
1222      Set_Scope             (Any_Modular, Standard_Standard);
1223      Set_Etype             (Any_Modular, Standard_Long_Long_Integer);
1224      Init_Size             (Any_Modular, Standard_Long_Long_Integer_Size);
1225      Set_Elem_Alignment    (Any_Modular);
1226      Set_Is_Unsigned_Type  (Any_Modular);
1227      Make_Name             (Any_Modular, "a modular type");
1228
1229      Any_Numeric := New_Standard_Entity;
1230      Set_Ekind             (Any_Numeric, E_Signed_Integer_Type);
1231      Set_Scope             (Any_Numeric, Standard_Standard);
1232      Set_Etype             (Any_Numeric, Standard_Long_Long_Integer);
1233      Init_Size             (Any_Numeric, Standard_Long_Long_Integer_Size);
1234      Set_Elem_Alignment    (Any_Numeric);
1235      Make_Name             (Any_Numeric, "a numeric type");
1236
1237      Any_Real := New_Standard_Entity;
1238      Set_Ekind             (Any_Real, E_Floating_Point_Type);
1239      Set_Scope             (Any_Real, Standard_Standard);
1240      Set_Etype             (Any_Real, Standard_Long_Long_Float);
1241      Init_Size             (Any_Real,
1242        UI_To_Int (Esize (Standard_Long_Long_Float)));
1243      Set_Elem_Alignment    (Any_Real);
1244      Make_Name             (Any_Real, "a real type");
1245
1246      Any_Scalar := New_Standard_Entity;
1247      Set_Ekind             (Any_Scalar, E_Signed_Integer_Type);
1248      Set_Scope             (Any_Scalar, Standard_Standard);
1249      Set_Etype             (Any_Scalar, Any_Scalar);
1250      Init_Size             (Any_Scalar, Standard_Integer_Size);
1251      Set_Elem_Alignment    (Any_Scalar);
1252      Make_Name             (Any_Scalar, "a scalar type");
1253
1254      Any_String := New_Standard_Entity;
1255      Set_Ekind             (Any_String, E_String_Type);
1256      Set_Scope             (Any_String, Standard_Standard);
1257      Set_Etype             (Any_String, Any_String);
1258      Set_Component_Type    (Any_String, Any_Character);
1259      Init_Size_Align       (Any_String);
1260      Make_Name             (Any_String, "a string type");
1261
1262      declare
1263         Index   : Node_Id;
1264
1265      begin
1266         Index :=
1267           Make_Range (Stloc,
1268             Low_Bound  => Make_Integer (Uint_0),
1269             High_Bound => Make_Integer (Uint_2 ** Standard_Integer_Size));
1270         Set_Etype (Index, Standard_Integer);
1271         Set_First_Index (Any_String, Index);
1272      end;
1273
1274      Standard_Integer_8 := New_Standard_Entity;
1275      Decl := New_Node (N_Full_Type_Declaration, Stloc);
1276      Set_Defining_Identifier (Decl, Standard_Integer_8);
1277      Make_Name (Standard_Integer_8, "integer_8");
1278      Set_Scope (Standard_Integer_8, Standard_Standard);
1279      Build_Signed_Integer_Type (Standard_Integer_8, 8);
1280
1281      Standard_Integer_16 := New_Standard_Entity;
1282      Decl := New_Node (N_Full_Type_Declaration, Stloc);
1283      Set_Defining_Identifier (Decl, Standard_Integer_16);
1284      Make_Name (Standard_Integer_16, "integer_16");
1285      Set_Scope (Standard_Integer_16, Standard_Standard);
1286      Build_Signed_Integer_Type (Standard_Integer_16, 16);
1287
1288      Standard_Integer_32 := New_Standard_Entity;
1289      Decl := New_Node (N_Full_Type_Declaration, Stloc);
1290      Set_Defining_Identifier (Decl, Standard_Integer_32);
1291      Make_Name (Standard_Integer_32, "integer_32");
1292      Set_Scope (Standard_Integer_32, Standard_Standard);
1293      Build_Signed_Integer_Type (Standard_Integer_32, 32);
1294
1295      Standard_Integer_64 := New_Standard_Entity;
1296      Decl := New_Node (N_Full_Type_Declaration, Stloc);
1297      Set_Defining_Identifier (Decl, Standard_Integer_64);
1298      Make_Name (Standard_Integer_64, "integer_64");
1299      Set_Scope (Standard_Integer_64, Standard_Standard);
1300      Build_Signed_Integer_Type (Standard_Integer_64, 64);
1301
1302      Standard_Unsigned := New_Standard_Entity;
1303      Decl := New_Node (N_Full_Type_Declaration, Stloc);
1304      Set_Defining_Identifier (Decl, Standard_Unsigned);
1305      Make_Name (Standard_Unsigned, "unsigned");
1306
1307      Set_Ekind             (Standard_Unsigned, E_Modular_Integer_Type);
1308      Set_Scope             (Standard_Unsigned, Standard_Standard);
1309      Set_Etype             (Standard_Unsigned, Standard_Unsigned);
1310      Init_Size             (Standard_Unsigned, Standard_Integer_Size);
1311      Set_Elem_Alignment    (Standard_Unsigned);
1312      Set_Modulus           (Standard_Unsigned,
1313                              Uint_2 ** Standard_Integer_Size);
1314      Set_Is_Unsigned_Type  (Standard_Unsigned);
1315      Set_Size_Known_At_Compile_Time
1316                            (Standard_Unsigned);
1317      Set_Is_Known_Valid    (Standard_Unsigned, True);
1318
1319      R_Node := New_Node (N_Range, Stloc);
1320      Set_Low_Bound  (R_Node, Make_Integer (Uint_0));
1321      Set_High_Bound (R_Node, Make_Integer (Modulus (Standard_Unsigned) - 1));
1322      Set_Etype (Low_Bound (R_Node), Standard_Unsigned);
1323      Set_Etype (High_Bound (R_Node), Standard_Unsigned);
1324      Set_Scalar_Range (Standard_Unsigned, R_Node);
1325
1326      --  Note: universal integer and universal real are constructed as fully
1327      --  formed signed numeric types, with parameters corresponding to the
1328      --  longest runtime types (Long_Long_Integer and Long_Long_Float). This
1329      --  allows Gigi to properly process references to universal types that
1330      --  are not folded at compile time.
1331
1332      Universal_Integer := New_Standard_Entity;
1333      Decl := New_Node (N_Full_Type_Declaration, Stloc);
1334      Set_Defining_Identifier (Decl, Universal_Integer);
1335      Make_Name (Universal_Integer, "universal_integer");
1336      Set_Scope (Universal_Integer, Standard_Standard);
1337      Build_Signed_Integer_Type
1338        (Universal_Integer, Standard_Long_Long_Integer_Size);
1339
1340      Universal_Real := New_Standard_Entity;
1341      Decl := New_Node (N_Full_Type_Declaration, Stloc);
1342      Set_Defining_Identifier (Decl, Universal_Real);
1343      Make_Name (Universal_Real, "universal_real");
1344      Set_Scope (Universal_Real, Standard_Standard);
1345      Copy_Float_Type (Universal_Real, Standard_Long_Long_Float);
1346
1347      --  Note: universal fixed, unlike universal integer and universal real,
1348      --  is never used at runtime, so it does not need to have bounds set.
1349
1350      Universal_Fixed := New_Standard_Entity;
1351      Decl := New_Node (N_Full_Type_Declaration, Stloc);
1352      Set_Defining_Identifier (Decl, Universal_Fixed);
1353      Make_Name            (Universal_Fixed, "universal_fixed");
1354      Set_Ekind            (Universal_Fixed, E_Ordinary_Fixed_Point_Type);
1355      Set_Etype            (Universal_Fixed, Universal_Fixed);
1356      Set_Scope            (Universal_Fixed, Standard_Standard);
1357      Init_Size            (Universal_Fixed, Standard_Long_Long_Integer_Size);
1358      Set_Elem_Alignment   (Universal_Fixed);
1359      Set_Size_Known_At_Compile_Time
1360                           (Universal_Fixed);
1361
1362      --  Create type declaration for Duration, using a 64-bit size. The
1363      --  delta and size values depend on the mode set in system.ads.
1364
1365      Build_Duration : declare
1366         Dlo       : Uint;
1367         Dhi       : Uint;
1368         Delta_Val : Ureal;
1369
1370      begin
1371         --  In 32 bit mode, the size is 32 bits, and the delta and
1372         --  small values are set to 20 milliseconds (20.0*(10.0**(-3)).
1373
1374         if Duration_32_Bits_On_Target then
1375            Dlo := Intval (Type_Low_Bound (Standard_Integer_32));
1376            Dhi := Intval (Type_High_Bound (Standard_Integer_32));
1377            Delta_Val := UR_From_Components (UI_From_Int (20), Uint_3, 10);
1378
1379         --  In standard 64-bit mode, the size is 64-bits and the delta and
1380         --  small values are set to nanoseconds (1.0*(10.0**(-9))
1381
1382         else
1383            Dlo := Intval (Type_Low_Bound (Standard_Integer_64));
1384            Dhi := Intval (Type_High_Bound (Standard_Integer_64));
1385            Delta_Val := UR_From_Components (Uint_1, Uint_9, 10);
1386         end if;
1387
1388         Tdef_Node := Make_Ordinary_Fixed_Point_Definition (Stloc,
1389                 Delta_Expression => Make_Real_Literal (Stloc, Delta_Val),
1390                 Real_Range_Specification =>
1391                   Make_Real_Range_Specification (Stloc,
1392                     Low_Bound  => Make_Real_Literal (Stloc,
1393                       Realval => Dlo * Delta_Val),
1394                     High_Bound => Make_Real_Literal (Stloc,
1395                       Realval => Dhi * Delta_Val)));
1396
1397         Set_Type_Definition (Parent (Standard_Duration), Tdef_Node);
1398
1399         Set_Ekind (Standard_Duration, E_Ordinary_Fixed_Point_Type);
1400         Set_Etype (Standard_Duration, Standard_Duration);
1401
1402         if Duration_32_Bits_On_Target then
1403            Init_Size (Standard_Duration, 32);
1404         else
1405            Init_Size (Standard_Duration, 64);
1406         end if;
1407
1408         Set_Elem_Alignment (Standard_Duration);
1409         Set_Delta_Value    (Standard_Duration, Delta_Val);
1410         Set_Small_Value    (Standard_Duration, Delta_Val);
1411         Set_Scalar_Range   (Standard_Duration,
1412                              Real_Range_Specification
1413                               (Type_Definition (Parent (Standard_Duration))));
1414
1415         --  Normally it does not matter that nodes in package Standard are
1416         --  not marked as analyzed. The Scalar_Range of the fixed-point
1417         --  type Standard_Duration is an exception, because of the special
1418         --  test made in Freeze.Freeze_Fixed_Point_Type.
1419
1420         Set_Analyzed (Scalar_Range (Standard_Duration));
1421
1422         Set_Etype (Type_High_Bound (Standard_Duration), Standard_Duration);
1423         Set_Etype (Type_Low_Bound  (Standard_Duration), Standard_Duration);
1424
1425         Set_Is_Static_Expression (Type_High_Bound (Standard_Duration));
1426         Set_Is_Static_Expression (Type_Low_Bound  (Standard_Duration));
1427
1428         Set_Corresponding_Integer_Value
1429           (Type_High_Bound (Standard_Duration), Dhi);
1430
1431         Set_Corresponding_Integer_Value
1432           (Type_Low_Bound  (Standard_Duration), Dlo);
1433
1434         Set_Size_Known_At_Compile_Time (Standard_Duration);
1435      end Build_Duration;
1436
1437      --  Build standard exception type. Note that the type name here is
1438      --  actually used in the generated code, so it must be set correctly
1439
1440      --  ??? Also note that the Import_Code component is now declared
1441      --  as a System.Standard_Library.Exception_Code to enforce run-time
1442      --  library implementation consistency. It's too early here to resort
1443      --  to rtsfind to get the proper node for that type, so we use the
1444      --  closest possible available type node at hand instead. We should
1445      --  probably be fixing this up at some point.
1446
1447      Standard_Exception_Type := New_Standard_Entity;
1448      Set_Ekind       (Standard_Exception_Type, E_Record_Type);
1449      Set_Etype       (Standard_Exception_Type, Standard_Exception_Type);
1450      Set_Scope       (Standard_Exception_Type, Standard_Standard);
1451      Set_Stored_Constraint
1452                      (Standard_Exception_Type, No_Elist);
1453      Init_Size_Align (Standard_Exception_Type);
1454      Set_Size_Known_At_Compile_Time
1455                      (Standard_Exception_Type, True);
1456      Make_Name       (Standard_Exception_Type, "exception");
1457
1458      Make_Component
1459        (Standard_Exception_Type, Standard_Boolean,   "Not_Handled_By_Others");
1460      Make_Component
1461        (Standard_Exception_Type, Standard_Character, "Lang");
1462      Make_Component
1463        (Standard_Exception_Type, Standard_Natural,   "Name_Length");
1464      Make_Component
1465        (Standard_Exception_Type, Standard_A_Char,    "Full_Name");
1466      Make_Component
1467        (Standard_Exception_Type, Standard_A_Char,    "HTable_Ptr");
1468      Make_Component
1469        (Standard_Exception_Type, Standard_Unsigned,  "Import_Code");
1470      Make_Component
1471        (Standard_Exception_Type, Standard_A_Char,    "Raise_Hook");
1472
1473      --  Build tree for record declaration, for use by the back-end
1474
1475      declare
1476         Comp_List : List_Id;
1477         Comp      : Entity_Id;
1478
1479      begin
1480         Comp      := First_Entity (Standard_Exception_Type);
1481         Comp_List := New_List;
1482         while Present (Comp) loop
1483            Append (
1484              Make_Component_Declaration (Stloc,
1485                Defining_Identifier => Comp,
1486                Component_Definition =>
1487                  Make_Component_Definition (Stloc,
1488                    Aliased_Present    => False,
1489                    Subtype_Indication => New_Occurrence_Of (Etype (Comp),
1490                                                             Stloc))),
1491              Comp_List);
1492
1493            Next_Entity (Comp);
1494         end loop;
1495
1496         Decl := Make_Full_Type_Declaration (Stloc,
1497           Defining_Identifier => Standard_Exception_Type,
1498           Type_Definition =>
1499             Make_Record_Definition (Stloc,
1500               End_Label => Empty,
1501               Component_List =>
1502                 Make_Component_List (Stloc,
1503                   Component_Items => Comp_List)));
1504      end;
1505
1506      Append (Decl, Decl_S);
1507
1508      Layout_Type (Standard_Exception_Type);
1509
1510      --  Create declarations of standard exceptions
1511
1512      Build_Exception (S_Constraint_Error);
1513      Build_Exception (S_Program_Error);
1514      Build_Exception (S_Storage_Error);
1515      Build_Exception (S_Tasking_Error);
1516
1517      --  Numeric_Error is a normal exception in Ada 83, but in Ada 95
1518      --  it is a renaming of Constraint_Error. Is this test too early???
1519
1520      if Ada_Version = Ada_83 then
1521         Build_Exception (S_Numeric_Error);
1522
1523      else
1524         Decl := New_Node (N_Exception_Renaming_Declaration, Stloc);
1525         E_Id := Standard_Entity (S_Numeric_Error);
1526
1527         Set_Ekind          (E_Id, E_Exception);
1528         Set_Exception_Code (E_Id, Uint_0);
1529         Set_Etype          (E_Id, Standard_Exception_Type);
1530         Set_Is_Public      (E_Id);
1531         Set_Renamed_Entity (E_Id, Standard_Entity (S_Constraint_Error));
1532
1533         Set_Defining_Identifier (Decl, E_Id);
1534         Append (Decl, Decl_S);
1535
1536         Ident_Node := New_Node (N_Identifier, Stloc);
1537         Set_Chars  (Ident_Node, Chars (Standard_Entity (S_Constraint_Error)));
1538         Set_Entity (Ident_Node, Standard_Entity (S_Constraint_Error));
1539         Set_Name   (Decl, Ident_Node);
1540      end if;
1541
1542      --  Abort_Signal is an entity that does not get made visible
1543
1544      Abort_Signal := New_Standard_Entity;
1545      Set_Chars          (Abort_Signal, Name_uAbort_Signal);
1546      Set_Ekind          (Abort_Signal, E_Exception);
1547      Set_Exception_Code (Abort_Signal, Uint_0);
1548      Set_Etype          (Abort_Signal, Standard_Exception_Type);
1549      Set_Scope          (Abort_Signal, Standard_Standard);
1550      Set_Is_Public      (Abort_Signal, True);
1551      Decl :=
1552        Make_Exception_Declaration (Stloc,
1553          Defining_Identifier => Abort_Signal);
1554
1555      --  Create defining identifiers for shift operator entities. Note
1556      --  that these entities are used only for marking shift operators
1557      --  generated internally, and hence need no structure, just a name
1558      --  and a unique identity.
1559
1560      Standard_Op_Rotate_Left := New_Standard_Entity;
1561      Set_Chars (Standard_Op_Rotate_Left, Name_Rotate_Left);
1562      Set_Ekind (Standard_Op_Rotate_Left, E_Operator);
1563
1564      Standard_Op_Rotate_Right := New_Standard_Entity;
1565      Set_Chars (Standard_Op_Rotate_Right, Name_Rotate_Right);
1566      Set_Ekind (Standard_Op_Rotate_Right, E_Operator);
1567
1568      Standard_Op_Shift_Left := New_Standard_Entity;
1569      Set_Chars (Standard_Op_Shift_Left, Name_Shift_Left);
1570      Set_Ekind (Standard_Op_Shift_Left, E_Operator);
1571
1572      Standard_Op_Shift_Right := New_Standard_Entity;
1573      Set_Chars (Standard_Op_Shift_Right, Name_Shift_Right);
1574      Set_Ekind (Standard_Op_Shift_Right, E_Operator);
1575
1576      Standard_Op_Shift_Right_Arithmetic := New_Standard_Entity;
1577      Set_Chars (Standard_Op_Shift_Right_Arithmetic,
1578                                          Name_Shift_Right_Arithmetic);
1579      Set_Ekind (Standard_Op_Shift_Right_Arithmetic,
1580                                          E_Operator);
1581
1582      --  Create standard operator declarations
1583
1584      Create_Operators;
1585
1586      --  Initialize visibility table with entities in Standard
1587
1588      for E in Standard_Entity_Type loop
1589         if Ekind (Standard_Entity (E)) /= E_Operator then
1590            Set_Name_Entity_Id
1591              (Chars (Standard_Entity (E)), Standard_Entity (E));
1592            Set_Homonym (Standard_Entity (E), Empty);
1593         end if;
1594
1595         if E not in S_ASCII_Names then
1596            Set_Scope (Standard_Entity (E), Standard_Standard);
1597            Set_Is_Immediately_Visible (Standard_Entity (E));
1598         end if;
1599      end loop;
1600
1601      --  The predefined package Standard itself does not have a scope;
1602      --  it is the only entity in the system not to have one, and this
1603      --  is what identifies the package to Gigi.
1604
1605      Set_Scope (Standard_Standard, Empty);
1606
1607      --  Set global variables indicating last Id values and version
1608
1609      Last_Standard_Node_Id := Last_Node_Id;
1610      Last_Standard_List_Id := Last_List_Id;
1611
1612      --  The Error node has an Etype of Any_Type to help error recovery
1613
1614      Set_Etype (Error, Any_Type);
1615
1616      --  Print representation of standard if switch set
1617
1618      if Opt.Print_Standard then
1619         Print_Standard;
1620      end if;
1621   end Create_Standard;
1622
1623   ------------------------------------
1624   -- Create_Unconstrained_Base_Type --
1625   ------------------------------------
1626
1627   procedure Create_Unconstrained_Base_Type
1628     (E : Entity_Id;
1629      K : Entity_Kind)
1630   is
1631      New_Ent : constant Entity_Id := New_Copy (E);
1632
1633   begin
1634      Set_Ekind            (E, K);
1635      Set_Is_Constrained   (E, True);
1636      Set_Is_First_Subtype (E, True);
1637      Set_Etype            (E, New_Ent);
1638
1639      Append_Entity (New_Ent, Standard_Standard);
1640      Set_Is_Constrained (New_Ent, False);
1641      Set_Etype          (New_Ent, New_Ent);
1642      Set_Is_Known_Valid (New_Ent, True);
1643
1644      if K = E_Signed_Integer_Subtype then
1645         Set_Etype (Low_Bound  (Scalar_Range (E)), New_Ent);
1646         Set_Etype (High_Bound (Scalar_Range (E)), New_Ent);
1647      end if;
1648
1649   end Create_Unconstrained_Base_Type;
1650
1651   --------------------
1652   -- Identifier_For --
1653   --------------------
1654
1655   function Identifier_For (S : Standard_Entity_Type) return Node_Id is
1656      Ident_Node : Node_Id;
1657   begin
1658      Ident_Node := New_Node (N_Identifier, Stloc);
1659      Set_Chars (Ident_Node, Chars (Standard_Entity (S)));
1660      Set_Entity (Ident_Node, Standard_Entity (S));
1661      return Ident_Node;
1662   end Identifier_For;
1663
1664   --------------------
1665   -- Make_Component --
1666   --------------------
1667
1668   procedure Make_Component
1669     (Rec : Entity_Id;
1670      Typ : Entity_Id;
1671      Nam : String)
1672   is
1673      Id : constant Entity_Id := New_Standard_Entity;
1674
1675   begin
1676      Set_Ekind                 (Id, E_Component);
1677      Set_Etype                 (Id, Typ);
1678      Set_Scope                 (Id, Rec);
1679      Init_Component_Location   (Id);
1680
1681      Set_Original_Record_Component (Id, Id);
1682      Make_Name (Id, Nam);
1683      Append_Entity (Id, Rec);
1684   end Make_Component;
1685
1686   -----------------
1687   -- Make_Formal --
1688   -----------------
1689
1690   function Make_Formal
1691     (Typ         : Entity_Id;
1692      Formal_Name : String) return Entity_Id
1693   is
1694      Formal : Entity_Id;
1695
1696   begin
1697      Formal := New_Standard_Entity;
1698
1699      Set_Ekind     (Formal, E_In_Parameter);
1700      Set_Mechanism (Formal, Default_Mechanism);
1701      Set_Scope     (Formal, Standard_Standard);
1702      Set_Etype     (Formal, Typ);
1703      Make_Name     (Formal, Formal_Name);
1704
1705      return Formal;
1706   end Make_Formal;
1707
1708   ------------------
1709   -- Make_Integer --
1710   ------------------
1711
1712   function Make_Integer (V : Uint) return Node_Id is
1713      N : constant Node_Id := Make_Integer_Literal (Stloc, V);
1714   begin
1715      Set_Is_Static_Expression (N);
1716      return N;
1717   end Make_Integer;
1718
1719   ---------------
1720   -- Make_Name --
1721   ---------------
1722
1723   procedure Make_Name (Id : Entity_Id; Nam : String) is
1724   begin
1725      for J in 1 .. Nam'Length loop
1726         Name_Buffer (J) := Fold_Lower (Nam (Nam'First + (J - 1)));
1727      end loop;
1728
1729      Name_Len := Nam'Length;
1730      Set_Chars (Id, Name_Find);
1731   end Make_Name;
1732
1733   ------------------
1734   -- New_Operator --
1735   ------------------
1736
1737   function New_Operator (Op : Name_Id; Typ : Entity_Id) return Entity_Id is
1738      Ident_Node : Entity_Id;
1739
1740   begin
1741      Ident_Node := Make_Defining_Identifier (Stloc, Op);
1742
1743      Set_Is_Pure    (Ident_Node, True);
1744      Set_Ekind      (Ident_Node, E_Operator);
1745      Set_Etype      (Ident_Node, Typ);
1746      Set_Scope      (Ident_Node, Standard_Standard);
1747      Set_Homonym    (Ident_Node, Get_Name_Entity_Id (Op));
1748      Set_Convention (Ident_Node, Convention_Intrinsic);
1749
1750      Set_Is_Immediately_Visible   (Ident_Node, True);
1751      Set_Is_Intrinsic_Subprogram  (Ident_Node, True);
1752
1753      Set_Name_Entity_Id (Op, Ident_Node);
1754      Append_Entity (Ident_Node, Standard_Standard);
1755      return Ident_Node;
1756   end New_Operator;
1757
1758   -------------------------
1759   -- New_Standard_Entity --
1760   -------------------------
1761
1762   function New_Standard_Entity
1763     (New_Node_Kind : Node_Kind := N_Defining_Identifier) return Entity_Id
1764   is
1765      E : constant Entity_Id := New_Entity (New_Node_Kind, Stloc);
1766
1767   begin
1768      --  All standard entities are Pure and Public
1769
1770      Set_Is_Pure (E);
1771      Set_Is_Public (E);
1772
1773      --  All standard entity names are analyzed manually, and are thus
1774      --  frozen as soon as they are created.
1775
1776      Set_Is_Frozen (E);
1777
1778      --  Set debug information required for all standard types
1779
1780      Set_Needs_Debug_Info (E);
1781
1782      --  All standard entities are built with fully qualified names, so
1783      --  set the flag to prevent an abortive attempt at requalification!
1784
1785      Set_Has_Qualified_Name (E);
1786
1787      --  Return newly created entity to be completed by caller
1788
1789      return E;
1790   end New_Standard_Entity;
1791
1792   --------------------
1793   -- Print_Standard --
1794   --------------------
1795
1796   procedure Print_Standard is
1797
1798      procedure P (Item : String) renames Output.Write_Line;
1799      --  Short-hand, since we do a lot of line writes here!
1800
1801      procedure P_Int_Range (Size : Pos);
1802      --  Prints the range of an integer based on its Size
1803
1804      procedure P_Float_Range (Id : Entity_Id);
1805      --  Prints the bounds range for the given float type entity
1806
1807      procedure P_Float_Type (Id : Entity_Id);
1808      --  Prints the type declaration of the given float type entity
1809
1810      procedure P_Mixed_Name (Id : Name_Id);
1811      --  Prints Id in mixed case
1812
1813      -------------------
1814      -- P_Float_Range --
1815      -------------------
1816
1817      procedure P_Float_Range (Id : Entity_Id) is
1818      begin
1819         Write_Str ("     range ");
1820         UR_Write (Realval (Type_Low_Bound (Id)));
1821         Write_Str (" .. ");
1822         UR_Write (Realval (Type_High_Bound (Id)));
1823         Write_Str (";");
1824         Write_Eol;
1825      end P_Float_Range;
1826
1827      ------------------
1828      -- P_Float_Type --
1829      ------------------
1830
1831      procedure P_Float_Type (Id : Entity_Id) is
1832      begin
1833         Write_Str ("   type ");
1834         P_Mixed_Name (Chars (Id));
1835         Write_Str (" is digits ");
1836         Write_Int (UI_To_Int (Digits_Value (Id)));
1837         Write_Eol;
1838         P_Float_Range (Id);
1839         Write_Str ("   for ");
1840         P_Mixed_Name (Chars (Id));
1841         Write_Str ("'Size use ");
1842         Write_Int (UI_To_Int (RM_Size (Id)));
1843         Write_Line (";");
1844         Write_Eol;
1845      end P_Float_Type;
1846
1847      -----------------
1848      -- P_Int_Range --
1849      -----------------
1850
1851      procedure P_Int_Range (Size : Pos) is
1852      begin
1853         Write_Str (" is range -(2 **");
1854         Write_Int (Size - 1);
1855         Write_Str (")");
1856         Write_Str (" .. +(2 **");
1857         Write_Int (Size - 1);
1858         Write_Str (" - 1);");
1859         Write_Eol;
1860      end P_Int_Range;
1861
1862      ------------------
1863      -- P_Mixed_Name --
1864      ------------------
1865
1866      procedure P_Mixed_Name (Id : Name_Id) is
1867      begin
1868         Get_Name_String (Id);
1869
1870         for J in 1 .. Name_Len loop
1871            if J = 1 or else Name_Buffer (J - 1) = '_' then
1872               Name_Buffer (J) := Fold_Upper (Name_Buffer (J));
1873            end if;
1874         end loop;
1875
1876         Write_Str (Name_Buffer (1 .. Name_Len));
1877      end P_Mixed_Name;
1878
1879   --  Start of processing for Print_Standard
1880
1881   begin
1882      P ("--  Representation of package Standard");
1883      Write_Eol;
1884      P ("--  This is not accurate Ada, since new base types cannot be ");
1885      P ("--  created, but the listing shows the target dependent");
1886      P ("--  characteristics of the Standard types for this compiler");
1887      Write_Eol;
1888
1889      P ("package Standard is");
1890      P ("pragma Pure (Standard);");
1891      Write_Eol;
1892
1893      P ("   type Boolean is (False, True);");
1894      P ("   for Boolean'Size use 1;");
1895      P ("   for Boolean use (False => 0, True => 1);");
1896      Write_Eol;
1897
1898      --  Integer types
1899
1900      Write_Str ("   type Integer");
1901      P_Int_Range (Standard_Integer_Size);
1902      Write_Str ("   for Integer'Size use ");
1903      Write_Int (Standard_Integer_Size);
1904      P (";");
1905      Write_Eol;
1906
1907      P ("   subtype Natural  is Integer range 0 .. Integer'Last;");
1908      P ("   subtype Positive is Integer range 1 .. Integer'Last;");
1909      Write_Eol;
1910
1911      Write_Str ("   type Short_Short_Integer");
1912      P_Int_Range (Standard_Short_Short_Integer_Size);
1913      Write_Str ("   for Short_Short_Integer'Size use ");
1914      Write_Int (Standard_Short_Short_Integer_Size);
1915      P (";");
1916      Write_Eol;
1917
1918      Write_Str ("   type Short_Integer");
1919      P_Int_Range (Standard_Short_Integer_Size);
1920      Write_Str ("   for Short_Integer'Size use ");
1921      Write_Int (Standard_Short_Integer_Size);
1922      P (";");
1923      Write_Eol;
1924
1925      Write_Str ("   type Long_Integer");
1926      P_Int_Range (Standard_Long_Integer_Size);
1927      Write_Str ("   for Long_Integer'Size use ");
1928      Write_Int (Standard_Long_Integer_Size);
1929      P (";");
1930      Write_Eol;
1931
1932      Write_Str ("   type Long_Long_Integer");
1933      P_Int_Range (Standard_Long_Long_Integer_Size);
1934      Write_Str ("   for Long_Long_Integer'Size use ");
1935      Write_Int (Standard_Long_Long_Integer_Size);
1936      P (";");
1937      Write_Eol;
1938
1939      --  Floating point types
1940
1941      P_Float_Type (Standard_Short_Float);
1942      P_Float_Type (Standard_Float);
1943      P_Float_Type (Standard_Long_Float);
1944      P_Float_Type (Standard_Long_Long_Float);
1945
1946      P ("   type Character is (...)");
1947      Write_Str ("   for Character'Size use ");
1948      Write_Int (Standard_Character_Size);
1949      P (";");
1950      P ("   --  See RM A.1(35) for details of this type");
1951      Write_Eol;
1952
1953      P ("   type Wide_Character is (...)");
1954      Write_Str ("   for Wide_Character'Size use ");
1955      Write_Int (Standard_Wide_Character_Size);
1956      P (";");
1957      P ("   --  See RM A.1(36) for details of this type");
1958      Write_Eol;
1959
1960      P ("   type Wide_Wide_Character is (...)");
1961      Write_Str ("   for Wide_Wide_Character'Size use ");
1962      Write_Int (Standard_Wide_Wide_Character_Size);
1963      P (";");
1964      P ("   --  See RM A.1(36) for details of this type");
1965
1966      P ("   type String is array (Positive range <>) of Character;");
1967      P ("   pragma Pack (String);");
1968      Write_Eol;
1969
1970      P ("   type Wide_String is array (Positive range <>)" &
1971         " of Wide_Character;");
1972      P ("   pragma Pack (Wide_String);");
1973      Write_Eol;
1974
1975      P ("   type Wide_Wide_String is array (Positive range <>)" &
1976         "  of Wide_Wide_Character;");
1977      P ("   pragma Pack (Wide_Wide_String);");
1978      Write_Eol;
1979
1980      --  We only have one representation each for 32-bit and 64-bit sizes,
1981      --  so select the right one based on Duration_32_Bits_On_Target.
1982
1983      if Duration_32_Bits_On_Target then
1984         P ("   type Duration is delta 0.020");
1985         P ("     range -((2 ** 31 - 1) * 0.020) ..");
1986         P ("           +((2 ** 31 - 1) * 0.020);");
1987         P ("   for Duration'Small use 0.020;");
1988
1989      else
1990         P ("   type Duration is delta 0.000000001");
1991         P ("     range -((2 ** 63 - 1) * 0.000000001) ..");
1992         P ("           +((2 ** 63 - 1) * 0.000000001);");
1993         P ("   for Duration'Small use 0.000000001;");
1994      end if;
1995
1996      Write_Eol;
1997
1998      P ("   Constraint_Error : exception;");
1999      P ("   Program_Error    : exception;");
2000      P ("   Storage_Error    : exception;");
2001      P ("   Tasking_Error    : exception;");
2002      P ("   Numeric_Error    : exception renames Constraint_Error;");
2003      Write_Eol;
2004
2005      P ("end Standard;");
2006   end Print_Standard;
2007
2008   -------------------------
2009   -- Register_Float_Type --
2010   -------------------------
2011
2012   procedure Register_Float_Type
2013     (Name      : C_String;
2014      Digs      : Natural;
2015      Complex   : Boolean;
2016      Count     : Natural;
2017      Float_Rep : Float_Rep_Kind;
2018      Precision : Positive;
2019      Size      : Positive;
2020      Alignment : Natural)
2021   is
2022      T    : String (1 .. Name'Length);
2023      Last : Natural := 0;
2024
2025      procedure Dump;
2026      --  Dump information given by the back end for the type to register
2027
2028      procedure Dump is
2029      begin
2030         Write_Str ("type " & T (1 .. Last) & " is ");
2031
2032         if Count > 0 then
2033            Write_Str ("array (1 .. ");
2034            Write_Int (Int (Count));
2035
2036            if Complex then
2037               Write_Str (", 1 .. 2");
2038            end if;
2039
2040            Write_Str (") of ");
2041
2042         elsif Complex then
2043            Write_Str ("array (1 .. 2) of ");
2044         end if;
2045
2046         if Digs > 0 then
2047            Write_Str ("digits ");
2048            Write_Int (Int (Digs));
2049            Write_Line (";");
2050
2051            Write_Str ("pragma Float_Representation (");
2052
2053            case Float_Rep is
2054               when IEEE_Binary =>  Write_Str ("IEEE");
2055               when VAX_Native =>
2056                  case Digs is
2057                     when  6 =>     Write_Str ("VAXF");
2058                     when  9 =>     Write_Str ("VAXD");
2059                     when 15 =>     Write_Str ("VAXG");
2060                     when others => Write_Str ("VAX_"); Write_Int (Int (Digs));
2061                  end case;
2062               when AAMP =>         Write_Str ("AAMP");
2063            end case;
2064            Write_Line (", " & T & ");");
2065
2066         else
2067            Write_Str ("mod 2**");
2068            Write_Int (Int (Precision / Positive'Max (1, Count)));
2069            Write_Line (";");
2070         end if;
2071
2072         if Precision = Size then
2073            Write_Str ("for " & T (1 .. Last) & "'Size use ");
2074            Write_Int (Int (Size));
2075            Write_Line (";");
2076
2077         else
2078            Write_Str ("for " & T (1 .. Last) & "'Value_Size use ");
2079            Write_Int (Int (Precision));
2080            Write_Line (";");
2081
2082            Write_Str ("for " & T (1 .. Last) & "'Object_Size use ");
2083            Write_Int (Int (Size));
2084            Write_Line (";");
2085         end if;
2086
2087         Write_Str ("for " & T & "'Alignment use ");
2088         Write_Int (Int (Alignment / 8));
2089         Write_Line (";");
2090      end Dump;
2091
2092   begin
2093      for J in T'Range loop
2094         T (J) := Name (Name'First + J - 1);
2095         if T (J) = ASCII.NUL then
2096            Last := J - 1;
2097            exit;
2098         end if;
2099      end loop;
2100
2101      if Debug_Flag_Dot_B then
2102         Dump;
2103      end if;
2104
2105      if Digs > 0 and then not Complex and then Count = 0 then
2106         declare
2107            Ent   : constant Entity_Id := New_Standard_Entity;
2108         begin
2109            Set_Defining_Identifier
2110              (New_Node (N_Full_Type_Declaration, Stloc), Ent);
2111            Make_Name (Ent, T (1 .. Last));
2112            Set_Scope (Ent, Standard_Standard);
2113            Build_Float_Type (Ent, Int (Size), Float_Rep, Pos (Digs));
2114            Set_RM_Size (Ent, UI_From_Int (Int (Precision)));
2115            Set_Alignment (Ent, UI_From_Int (Int (Alignment / 8)));
2116
2117            if No (Back_End_Float_Types) then
2118               Back_End_Float_Types := New_Elmt_List;
2119            end if;
2120
2121            Append_Elmt (Ent, Back_End_Float_Types);
2122         end;
2123      end if;
2124   end Register_Float_Type;
2125
2126   ----------------------
2127   -- Set_Float_Bounds --
2128   ----------------------
2129
2130   procedure Set_Float_Bounds (Id  : Entity_Id) is
2131      L : Node_Id;
2132      --  Low bound of literal value
2133
2134      H : Node_Id;
2135      --  High bound of literal value
2136
2137      R : Node_Id;
2138      --  Range specification
2139
2140      Radix       : constant Uint := Machine_Radix_Value (Id);
2141      Mantissa    : constant Uint := Machine_Mantissa_Value (Id);
2142      Emax        : constant Uint := Machine_Emax_Value (Id);
2143      Significand : constant Uint := Radix ** Mantissa - 1;
2144      Exponent    : constant Uint := Emax - Mantissa;
2145
2146   begin
2147      --  Note: for the call from Cstand to initially create the types in
2148      --  Standard, Float_Rep will never be VAX_Native. Circuitry in Sem_Vfpt
2149      --  will adjust these types appropriately VAX_Native if a pragma
2150      --  Float_Representation (VAX_Float) is used.
2151
2152      H := Make_Float_Literal (Stloc, Radix, Significand, Exponent);
2153      L := Make_Float_Literal (Stloc, Radix, -Significand, Exponent);
2154
2155      Set_Etype                (L, Id);
2156      Set_Is_Static_Expression (L);
2157
2158      Set_Etype                (H, Id);
2159      Set_Is_Static_Expression (H);
2160
2161      R := New_Node (N_Range, Stloc);
2162      Set_Low_Bound  (R, L);
2163      Set_High_Bound (R, H);
2164      Set_Includes_Infinities (R, True);
2165      Set_Scalar_Range (Id, R);
2166      Set_Etype (R, Id);
2167      Set_Parent (R, Id);
2168   end Set_Float_Bounds;
2169
2170   ------------------------
2171   -- Set_Integer_Bounds --
2172   ------------------------
2173
2174   procedure Set_Integer_Bounds
2175     (Id  : Entity_Id;
2176      Typ : Entity_Id;
2177      Lb  : Uint;
2178      Hb  : Uint)
2179   is
2180      L : Node_Id;     -- Low bound of literal value
2181      H : Node_Id;     -- High bound of literal value
2182      R : Node_Id;     -- Range specification
2183
2184   begin
2185      L := Make_Integer (Lb);
2186      H := Make_Integer (Hb);
2187
2188      Set_Etype (L, Typ);
2189      Set_Etype (H, Typ);
2190
2191      R := New_Node (N_Range, Stloc);
2192      Set_Low_Bound  (R, L);
2193      Set_High_Bound (R, H);
2194      Set_Scalar_Range (Id, R);
2195      Set_Etype (R, Typ);
2196      Set_Parent (R, Id);
2197      Set_Is_Unsigned_Type (Id, Lb >= 0);
2198   end Set_Integer_Bounds;
2199
2200end CStand;
2201