1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 1992-2011, Free Software Foundation, Inc. --
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. --
21 -- GNAT was originally developed by the GNAT team at New York University. --
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
24 ------------------------------------------------------------------------------
26 with Atree; use Atree;
27 with Casing; use Casing;
28 with Checks; use Checks;
29 with Debug; use Debug;
30 with Einfo; use Einfo;
31 with Elists; use Elists;
32 with Errout; use Errout;
33 with Exp_Aggr; use Exp_Aggr;
34 with Exp_Ch6; use Exp_Ch6;
35 with Exp_Ch7; use Exp_Ch7;
36 with Inline; use Inline;
37 with Itypes; use Itypes;
39 with Nlists; use Nlists;
40 with Nmake; use Nmake;
42 with Restrict; use Restrict;
43 with Rident; use Rident;
45 with Sem_Aux; use Sem_Aux;
46 with Sem_Ch8; use Sem_Ch8;
47 with Sem_Eval; use Sem_Eval;
48 with Sem_Prag; use Sem_Prag;
49 with Sem_Res; use Sem_Res;
50 with Sem_Type; use Sem_Type;
51 with Sem_Util; use Sem_Util;
52 with Snames; use Snames;
53 with Stand; use Stand;
54 with Stringt; use Stringt;
55 with Targparm; use Targparm;
56 with Tbuild; use Tbuild;
57 with Ttypes; use Ttypes;
58 with Urealp; use Urealp;
59 with Validsw; use Validsw;
61 package body Exp_Util is
63 -----------------------
64 -- Local Subprograms --
65 -----------------------
67 function Build_Task_Array_Image
71 Dyn : Boolean := False) return Node_Id;
72 -- Build function to generate the image string for a task that is an array
73 -- component, concatenating the images of each index. To avoid storage
74 -- leaks, the string is built with successive slice assignments. The flag
75 -- Dyn indicates whether this is called for the initialization procedure of
76 -- an array of tasks, or for the name of a dynamically created task that is
77 -- assigned to an indexed component.
79 function Build_Task_Image_Function
83 Res : Entity_Id) return Node_Id;
84 -- Common processing for Task_Array_Image and Task_Record_Image. Build
85 -- function body that computes image.
87 procedure Build_Task_Image_Prefix
96 -- Common processing for Task_Array_Image and Task_Record_Image. Create
97 -- local variables and assign prefix of name to result string.
99 function Build_Task_Record_Image
102 Dyn : Boolean := False) return Node_Id;
103 -- Build function to generate the image string for a task that is a record
104 -- component. Concatenate name of variable with that of selector. The flag
105 -- Dyn indicates whether this is called for the initialization procedure of
106 -- record with task components, or for a dynamically created task that is
107 -- assigned to a selected component.
109 function Make_CW_Equivalent_Type
111 E : Node_Id) return Entity_Id;
112 -- T is a class-wide type entity, E is the initial expression node that
113 -- constrains T in case such as: " X: T := E" or "new T'(E)". This function
114 -- returns the entity of the Equivalent type and inserts on the fly the
115 -- necessary declaration such as:
117 -- type anon is record
118 -- _parent : Root_Type (T); constrained with E discriminants (if any)
119 -- Extension : String (1 .. expr to match size of E);
122 -- This record is compatible with any object of the class of T thanks to
123 -- the first field and has the same size as E thanks to the second.
125 function Make_Literal_Range
127 Literal_Typ : Entity_Id) return Node_Id;
128 -- Produce a Range node whose bounds are:
129 -- Low_Bound (Literal_Type) ..
130 -- Low_Bound (Literal_Type) + (Length (Literal_Typ) - 1)
131 -- this is used for expanding declarations like X : String := "sdfgdfg";
133 -- If the index type of the target array is not integer, we generate:
134 -- Low_Bound (Literal_Type) ..
136 -- (Literal_Type'Pos (Low_Bound (Literal_Type))
137 -- + (Length (Literal_Typ) -1))
139 function Make_Non_Empty_Check
141 N : Node_Id) return Node_Id;
142 -- Produce a boolean expression checking that the unidimensional array
143 -- node N is not empty.
145 function New_Class_Wide_Subtype
147 N : Node_Id) return Entity_Id;
148 -- Create an implicit subtype of CW_Typ attached to node N
150 function Requires_Cleanup_Actions
152 For_Package : Boolean;
153 Nested_Constructs : Boolean) return Boolean;
154 -- Given a list L, determine whether it contains one of the following:
156 -- 1) controlled objects
157 -- 2) library-level tagged types
159 -- Flag For_Package should be set when the list comes from a package spec
160 -- or body. Flag Nested_Constructs should be set when any nested packages
161 -- declared in L must be processed.
163 ----------------------
164 -- Adjust_Condition --
165 ----------------------
167 procedure Adjust_Condition (N : Node_Id) is
174 Loc : constant Source_Ptr := Sloc (N);
175 T : constant Entity_Id := Etype (N);
179 -- Defend against a call where the argument has no type, or has a
180 -- type that is not Boolean. This can occur because of prior errors.
182 if No (T) or else not Is_Boolean_Type (T) then
186 -- Apply validity checking if needed
188 if Validity_Checks_On and Validity_Check_Tests then
192 -- Immediate return if standard boolean, the most common case,
193 -- where nothing needs to be done.
195 if Base_Type (T) = Standard_Boolean then
199 -- Case of zero/non-zero semantics or non-standard enumeration
200 -- representation. In each case, we rewrite the node as:
202 -- ityp!(N) /= False'Enum_Rep
204 -- where ityp is an integer type with large enough size to hold any
207 if Nonzero_Is_True (T) or else Has_Non_Standard_Rep (T) then
208 if Esize (T) <= Esize (Standard_Integer) then
209 Ti := Standard_Integer;
211 Ti := Standard_Long_Long_Integer;
216 Left_Opnd => Unchecked_Convert_To (Ti, N),
218 Make_Attribute_Reference (Loc,
219 Attribute_Name => Name_Enum_Rep,
221 New_Occurrence_Of (First_Literal (T), Loc))));
222 Analyze_And_Resolve (N, Standard_Boolean);
225 Rewrite (N, Convert_To (Standard_Boolean, N));
226 Analyze_And_Resolve (N, Standard_Boolean);
229 end Adjust_Condition;
231 ------------------------
232 -- Adjust_Result_Type --
233 ------------------------
235 procedure Adjust_Result_Type (N : Node_Id; T : Entity_Id) is
237 -- Ignore call if current type is not Standard.Boolean
239 if Etype (N) /= Standard_Boolean then
243 -- If result is already of correct type, nothing to do. Note that
244 -- this will get the most common case where everything has a type
245 -- of Standard.Boolean.
247 if Base_Type (T) = Standard_Boolean then
252 KP : constant Node_Kind := Nkind (Parent (N));
255 -- If result is to be used as a Condition in the syntax, no need
256 -- to convert it back, since if it was changed to Standard.Boolean
257 -- using Adjust_Condition, that is just fine for this usage.
259 if KP in N_Raise_xxx_Error or else KP in N_Has_Condition then
262 -- If result is an operand of another logical operation, no need
263 -- to reset its type, since Standard.Boolean is just fine, and
264 -- such operations always do Adjust_Condition on their operands.
266 elsif KP in N_Op_Boolean
267 or else KP in N_Short_Circuit
268 or else KP = N_Op_Not
272 -- Otherwise we perform a conversion from the current type, which
273 -- must be Standard.Boolean, to the desired type.
277 Rewrite (N, Convert_To (T, N));
278 Analyze_And_Resolve (N, T);
282 end Adjust_Result_Type;
284 --------------------------
285 -- Append_Freeze_Action --
286 --------------------------
288 procedure Append_Freeze_Action (T : Entity_Id; N : Node_Id) is
292 Ensure_Freeze_Node (T);
293 Fnode := Freeze_Node (T);
295 if No (Actions (Fnode)) then
296 Set_Actions (Fnode, New_List);
299 Append (N, Actions (Fnode));
300 end Append_Freeze_Action;
302 ---------------------------
303 -- Append_Freeze_Actions --
304 ---------------------------
306 procedure Append_Freeze_Actions (T : Entity_Id; L : List_Id) is
307 Fnode : constant Node_Id := Freeze_Node (T);
314 if No (Actions (Fnode)) then
315 Set_Actions (Fnode, L);
317 Append_List (L, Actions (Fnode));
320 end Append_Freeze_Actions;
322 ------------------------------------
323 -- Build_Allocate_Deallocate_Proc --
324 ------------------------------------
326 procedure Build_Allocate_Deallocate_Proc
328 Is_Allocate : Boolean)
330 Desig_Typ : Entity_Id;
333 Proc_To_Call : Node_Id := Empty;
336 function Find_Finalize_Address (Typ : Entity_Id) return Entity_Id;
337 -- Locate TSS primitive Finalize_Address in type Typ
339 function Find_Object (E : Node_Id) return Node_Id;
340 -- Given an arbitrary expression of an allocator, try to find an object
341 -- reference in it, otherwise return the original expression.
343 function Is_Allocate_Deallocate_Proc (Subp : Entity_Id) return Boolean;
344 -- Determine whether subprogram Subp denotes a custom allocate or
347 ---------------------------
348 -- Find_Finalize_Address --
349 ---------------------------
351 function Find_Finalize_Address (Typ : Entity_Id) return Entity_Id is
352 Utyp : Entity_Id := Typ;
355 -- Handle protected class-wide or task class-wide types
357 if Is_Class_Wide_Type (Utyp) then
358 if Is_Concurrent_Type (Root_Type (Utyp)) then
359 Utyp := Root_Type (Utyp);
361 elsif Is_Private_Type (Root_Type (Utyp))
362 and then Present (Full_View (Root_Type (Utyp)))
363 and then Is_Concurrent_Type (Full_View (Root_Type (Utyp)))
365 Utyp := Full_View (Root_Type (Utyp));
369 -- Handle private types
371 if Is_Private_Type (Utyp)
372 and then Present (Full_View (Utyp))
374 Utyp := Full_View (Utyp);
377 -- Handle protected and task types
379 if Is_Concurrent_Type (Utyp)
380 and then Present (Corresponding_Record_Type (Utyp))
382 Utyp := Corresponding_Record_Type (Utyp);
385 Utyp := Underlying_Type (Base_Type (Utyp));
387 -- Deal with non-tagged derivation of private views. If the parent is
388 -- now known to be protected, the finalization routine is the one
389 -- defined on the corresponding record of the ancestor (corresponding
390 -- records do not automatically inherit operations, but maybe they
393 if Is_Untagged_Derivation (Typ) then
394 if Is_Protected_Type (Typ) then
395 Utyp := Corresponding_Record_Type (Root_Type (Base_Type (Typ)));
397 Utyp := Underlying_Type (Root_Type (Base_Type (Typ)));
399 if Is_Protected_Type (Utyp) then
400 Utyp := Corresponding_Record_Type (Utyp);
405 -- If the underlying_type is a subtype, we are dealing with the
406 -- completion of a private type. We need to access the base type and
407 -- generate a conversion to it.
409 if Utyp /= Base_Type (Utyp) then
410 pragma Assert (Is_Private_Type (Typ));
412 Utyp := Base_Type (Utyp);
415 return TSS (Utyp, TSS_Finalize_Address);
416 end Find_Finalize_Address;
422 function Find_Object (E : Node_Id) return Node_Id is
426 pragma Assert (Is_Allocate);
430 if Nkind_In (Expr, N_Qualified_Expression,
431 N_Unchecked_Type_Conversion)
433 Expr := Expression (Expr);
435 elsif Nkind (Expr) = N_Explicit_Dereference then
436 Expr := Prefix (Expr);
446 ---------------------------------
447 -- Is_Allocate_Deallocate_Proc --
448 ---------------------------------
450 function Is_Allocate_Deallocate_Proc (Subp : Entity_Id) return Boolean is
452 -- Look for a subprogram body with only one statement which is a
453 -- call to Allocate_Any_Controlled / Deallocate_Any_Controlled.
455 if Ekind (Subp) = E_Procedure
456 and then Nkind (Parent (Parent (Subp))) = N_Subprogram_Body
459 HSS : constant Node_Id :=
460 Handled_Statement_Sequence (Parent (Parent (Subp)));
464 if Present (Statements (HSS))
465 and then Nkind (First (Statements (HSS))) =
466 N_Procedure_Call_Statement
468 Proc := Entity (Name (First (Statements (HSS))));
471 Is_RTE (Proc, RE_Allocate_Any_Controlled)
472 or else Is_RTE (Proc, RE_Deallocate_Any_Controlled);
478 end Is_Allocate_Deallocate_Proc;
480 -- Start of processing for Build_Allocate_Deallocate_Proc
483 -- Do not perform this expansion in Alfa mode because it is not
490 -- Obtain the attributes of the allocation / deallocation
492 if Nkind (N) = N_Free_Statement then
493 Expr := Expression (N);
494 Ptr_Typ := Base_Type (Etype (Expr));
495 Proc_To_Call := Procedure_To_Call (N);
498 if Nkind (N) = N_Object_Declaration then
499 Expr := Expression (N);
504 -- In certain cases an allocator with a qualified expression may
505 -- be relocated and used as the initialization expression of a
509 -- Obj : Ptr_Typ := new Desig_Typ'(...);
512 -- Tmp : Ptr_Typ := new Desig_Typ'(...);
513 -- Obj : Ptr_Typ := Tmp;
515 -- Since the allocator is always marked as analyzed to avoid infinite
516 -- expansion, it will never be processed by this routine given that
517 -- the designated type needs finalization actions. Detect this case
518 -- and complete the expansion of the allocator.
520 if Nkind (Expr) = N_Identifier
521 and then Nkind (Parent (Entity (Expr))) = N_Object_Declaration
522 and then Nkind (Expression (Parent (Entity (Expr)))) = N_Allocator
524 Build_Allocate_Deallocate_Proc (Parent (Entity (Expr)), True);
528 -- The allocator may have been rewritten into something else in which
529 -- case the expansion performed by this routine does not apply.
531 if Nkind (Expr) /= N_Allocator then
535 Ptr_Typ := Base_Type (Etype (Expr));
536 Proc_To_Call := Procedure_To_Call (Expr);
539 Pool_Id := Associated_Storage_Pool (Ptr_Typ);
540 Desig_Typ := Available_View (Designated_Type (Ptr_Typ));
542 -- Handle concurrent types
544 if Is_Concurrent_Type (Desig_Typ)
545 and then Present (Corresponding_Record_Type (Desig_Typ))
547 Desig_Typ := Corresponding_Record_Type (Desig_Typ);
550 -- Do not process allocations / deallocations without a pool
555 -- Do not process allocations on / deallocations from the secondary
558 elsif Is_RTE (Pool_Id, RE_SS_Pool) then
561 -- Do not replicate the machinery if the allocator / free has already
562 -- been expanded and has a custom Allocate / Deallocate.
564 elsif Present (Proc_To_Call)
565 and then Is_Allocate_Deallocate_Proc (Proc_To_Call)
570 if Needs_Finalization (Desig_Typ) then
572 -- Certain run-time configurations and targets do not provide support
573 -- for controlled types.
575 if Restriction_Active (No_Finalization) then
578 -- Do nothing if the access type may never allocate / deallocate
581 elsif No_Pool_Assigned (Ptr_Typ) then
584 -- Access-to-controlled types are not supported on .NET/JVM since
585 -- these targets cannot support pools and address arithmetic.
587 elsif VM_Target /= No_VM then
591 -- The allocation / deallocation of a controlled object must be
592 -- chained on / detached from a finalization master.
594 pragma Assert (Present (Finalization_Master (Ptr_Typ)));
596 -- The only other kind of allocation / deallocation supported by this
597 -- routine is on / from a subpool.
599 elsif Nkind (Expr) = N_Allocator
600 and then No (Subpool_Handle_Name (Expr))
606 Loc : constant Source_Ptr := Sloc (N);
607 Addr_Id : constant Entity_Id := Make_Temporary (Loc, 'A');
608 Alig_Id : constant Entity_Id := Make_Temporary (Loc, 'L');
609 Proc_Id : constant Entity_Id := Make_Temporary (Loc, 'P');
610 Size_Id : constant Entity_Id := Make_Temporary (Loc, 'S');
613 Fin_Addr_Id : Entity_Id;
614 Fin_Mas_Act : Node_Id;
615 Fin_Mas_Id : Entity_Id;
616 Proc_To_Call : Entity_Id;
617 Subpool : Node_Id := Empty;
620 -- Step 1: Construct all the actuals for the call to library routine
621 -- Allocate_Any_Controlled / Deallocate_Any_Controlled.
625 Actuals := New_List (New_Reference_To (Pool_Id, Loc));
631 if Nkind (Expr) = N_Allocator then
632 Subpool := Subpool_Handle_Name (Expr);
635 if Present (Subpool) then
636 Append_To (Actuals, New_Reference_To (Entity (Subpool), Loc));
638 Append_To (Actuals, Make_Null (Loc));
641 -- c) Finalization master
643 if Needs_Finalization (Desig_Typ) then
644 Fin_Mas_Id := Finalization_Master (Ptr_Typ);
645 Fin_Mas_Act := New_Reference_To (Fin_Mas_Id, Loc);
647 -- Handle the case where the master is actually a pointer to a
648 -- master. This case arises in build-in-place functions.
650 if Is_Access_Type (Etype (Fin_Mas_Id)) then
651 Append_To (Actuals, Fin_Mas_Act);
654 Make_Attribute_Reference (Loc,
655 Prefix => Fin_Mas_Act,
656 Attribute_Name => Name_Unrestricted_Access));
659 Append_To (Actuals, Make_Null (Loc));
662 -- d) Finalize_Address
664 -- Primitive Finalize_Address is never generated in CodePeer mode
665 -- since it contains an Unchecked_Conversion.
667 if Needs_Finalization (Desig_Typ)
668 and then not CodePeer_Mode
670 Fin_Addr_Id := Find_Finalize_Address (Desig_Typ);
671 pragma Assert (Present (Fin_Addr_Id));
674 Make_Attribute_Reference (Loc,
675 Prefix => New_Reference_To (Fin_Addr_Id, Loc),
676 Attribute_Name => Name_Unrestricted_Access));
678 Append_To (Actuals, Make_Null (Loc));
686 Append_To (Actuals, New_Reference_To (Addr_Id, Loc));
687 Append_To (Actuals, New_Reference_To (Size_Id, Loc));
688 Append_To (Actuals, New_Reference_To (Alig_Id, Loc));
692 -- Generate a run-time check to determine whether a class-wide object
693 -- is truly controlled.
695 if Needs_Finalization (Desig_Typ) then
696 if Is_Class_Wide_Type (Desig_Typ)
697 or else Is_Generic_Actual_Type (Desig_Typ)
700 Flag_Id : constant Entity_Id := Make_Temporary (Loc, 'F');
707 Temp := Find_Object (Expression (Expr));
712 -- Processing for generic actuals
714 if Is_Generic_Actual_Type (Desig_Typ) then
716 New_Reference_To (Boolean_Literals
717 (Needs_Finalization (Base_Type (Desig_Typ))), Loc);
719 -- Processing for subtype indications
721 elsif Nkind (Temp) in N_Has_Entity
722 and then Is_Type (Entity (Temp))
725 New_Reference_To (Boolean_Literals
726 (Needs_Finalization (Entity (Temp))), Loc);
728 -- Generate a runtime check to test the controlled state of
729 -- an object for the purposes of allocation / deallocation.
732 -- The following case arises when allocating through an
733 -- interface class-wide type, generate:
737 if Is_RTE (Etype (Temp), RE_Tag_Ptr) then
739 Make_Explicit_Dereference (Loc,
741 Relocate_Node (Temp));
748 Make_Attribute_Reference (Loc,
750 Relocate_Node (Temp),
751 Attribute_Name => Name_Tag);
755 -- Needs_Finalization (<Param>)
758 Make_Function_Call (Loc,
760 New_Reference_To (RTE (RE_Needs_Finalization), Loc),
761 Parameter_Associations => New_List (Param));
764 -- Create the temporary which represents the finalization
765 -- state of the expression. Generate:
767 -- F : constant Boolean := <Flag_Expr>;
770 Make_Object_Declaration (Loc,
771 Defining_Identifier => Flag_Id,
772 Constant_Present => True,
774 New_Reference_To (Standard_Boolean, Loc),
775 Expression => Flag_Expr));
777 -- The flag acts as the last actual
779 Append_To (Actuals, New_Reference_To (Flag_Id, Loc));
782 -- The object is statically known to be controlled
785 Append_To (Actuals, New_Reference_To (Standard_True, Loc));
788 Append_To (Actuals, New_Reference_To (Standard_False, Loc));
795 New_Reference_To (Boolean_Literals (Present (Subpool)), Loc));
798 -- Step 2: Build a wrapper Allocate / Deallocate which internally
799 -- calls Allocate_Any_Controlled / Deallocate_Any_Controlled.
801 -- Select the proper routine to call
804 Proc_To_Call := RTE (RE_Allocate_Any_Controlled);
806 Proc_To_Call := RTE (RE_Deallocate_Any_Controlled);
809 -- Create a custom Allocate / Deallocate routine which has identical
810 -- profile to that of System.Storage_Pools.
813 Make_Subprogram_Body (Loc,
818 Make_Procedure_Specification (Loc,
819 Defining_Unit_Name => Proc_Id,
820 Parameter_Specifications => New_List (
822 -- P : Root_Storage_Pool
824 Make_Parameter_Specification (Loc,
825 Defining_Identifier =>
826 Make_Temporary (Loc, 'P'),
828 New_Reference_To (RTE (RE_Root_Storage_Pool), Loc)),
832 Make_Parameter_Specification (Loc,
833 Defining_Identifier => Addr_Id,
834 Out_Present => Is_Allocate,
836 New_Reference_To (RTE (RE_Address), Loc)),
840 Make_Parameter_Specification (Loc,
841 Defining_Identifier => Size_Id,
843 New_Reference_To (RTE (RE_Storage_Count), Loc)),
847 Make_Parameter_Specification (Loc,
848 Defining_Identifier => Alig_Id,
850 New_Reference_To (RTE (RE_Storage_Count), Loc)))),
852 Declarations => No_List,
854 Handled_Statement_Sequence =>
855 Make_Handled_Sequence_Of_Statements (Loc,
856 Statements => New_List (
857 Make_Procedure_Call_Statement (Loc,
859 New_Reference_To (Proc_To_Call, Loc),
860 Parameter_Associations => Actuals)))));
862 -- The newly generated Allocate / Deallocate becomes the default
863 -- procedure to call when the back end processes the allocation /
867 Set_Procedure_To_Call (Expr, Proc_Id);
869 Set_Procedure_To_Call (N, Proc_Id);
872 end Build_Allocate_Deallocate_Proc;
874 ------------------------
875 -- Build_Runtime_Call --
876 ------------------------
878 function Build_Runtime_Call (Loc : Source_Ptr; RE : RE_Id) return Node_Id is
880 -- If entity is not available, we can skip making the call (this avoids
881 -- junk duplicated error messages in a number of cases).
883 if not RTE_Available (RE) then
884 return Make_Null_Statement (Loc);
887 Make_Procedure_Call_Statement (Loc,
888 Name => New_Reference_To (RTE (RE), Loc));
890 end Build_Runtime_Call;
892 ----------------------------
893 -- Build_Task_Array_Image --
894 ----------------------------
896 -- This function generates the body for a function that constructs the
897 -- image string for a task that is an array component. The function is
898 -- local to the init proc for the array type, and is called for each one
899 -- of the components. The constructed image has the form of an indexed
900 -- component, whose prefix is the outer variable of the array type.
901 -- The n-dimensional array type has known indexes Index, Index2...
903 -- Id_Ref is an indexed component form created by the enclosing init proc.
904 -- Its successive indexes are Val1, Val2, ... which are the loop variables
905 -- in the loops that call the individual task init proc on each component.
907 -- The generated function has the following structure:
909 -- function F return String is
910 -- Pref : string renames Task_Name;
911 -- T1 : String := Index1'Image (Val1);
913 -- Tn : String := indexn'image (Valn);
914 -- Len : Integer := T1'Length + ... + Tn'Length + n + 1;
915 -- -- Len includes commas and the end parentheses.
916 -- Res : String (1..Len);
917 -- Pos : Integer := Pref'Length;
920 -- Res (1 .. Pos) := Pref;
924 -- Res (Pos .. Pos + T1'Length - 1) := T1;
925 -- Pos := Pos + T1'Length;
929 -- Res (Pos .. Pos + Tn'Length - 1) := Tn;
935 -- Needless to say, multidimensional arrays of tasks are rare enough that
936 -- the bulkiness of this code is not really a concern.
938 function Build_Task_Array_Image
942 Dyn : Boolean := False) return Node_Id
944 Dims : constant Nat := Number_Dimensions (A_Type);
945 -- Number of dimensions for array of tasks
947 Temps : array (1 .. Dims) of Entity_Id;
948 -- Array of temporaries to hold string for each index
954 -- Total length of generated name
957 -- Running index for substring assignments
959 Pref : constant Entity_Id := Make_Temporary (Loc, 'P');
960 -- Name of enclosing variable, prefix of resulting name
963 -- String to hold result
966 -- Value of successive indexes
969 -- Expression to compute total size of string
972 -- Entity for name at one index position
974 Decls : constant List_Id := New_List;
975 Stats : constant List_Id := New_List;
978 -- For a dynamic task, the name comes from the target variable. For a
979 -- static one it is a formal of the enclosing init proc.
982 Get_Name_String (Chars (Entity (Prefix (Id_Ref))));
984 Make_Object_Declaration (Loc,
985 Defining_Identifier => Pref,
986 Object_Definition => New_Occurrence_Of (Standard_String, Loc),
988 Make_String_Literal (Loc,
989 Strval => String_From_Name_Buffer)));
993 Make_Object_Renaming_Declaration (Loc,
994 Defining_Identifier => Pref,
995 Subtype_Mark => New_Occurrence_Of (Standard_String, Loc),
996 Name => Make_Identifier (Loc, Name_uTask_Name)));
999 Indx := First_Index (A_Type);
1000 Val := First (Expressions (Id_Ref));
1002 for J in 1 .. Dims loop
1003 T := Make_Temporary (Loc, 'T');
1007 Make_Object_Declaration (Loc,
1008 Defining_Identifier => T,
1009 Object_Definition => New_Occurrence_Of (Standard_String, Loc),
1011 Make_Attribute_Reference (Loc,
1012 Attribute_Name => Name_Image,
1013 Prefix => New_Occurrence_Of (Etype (Indx), Loc),
1014 Expressions => New_List (New_Copy_Tree (Val)))));
1020 Sum := Make_Integer_Literal (Loc, Dims + 1);
1026 Make_Attribute_Reference (Loc,
1027 Attribute_Name => Name_Length,
1029 New_Occurrence_Of (Pref, Loc),
1030 Expressions => New_List (Make_Integer_Literal (Loc, 1))));
1032 for J in 1 .. Dims loop
1037 Make_Attribute_Reference (Loc,
1038 Attribute_Name => Name_Length,
1040 New_Occurrence_Of (Temps (J), Loc),
1041 Expressions => New_List (Make_Integer_Literal (Loc, 1))));
1044 Build_Task_Image_Prefix (Loc, Len, Res, Pos, Pref, Sum, Decls, Stats);
1046 Set_Character_Literal_Name (Char_Code (Character'Pos ('(')));
1049 Make_Assignment_Statement (Loc,
1050 Name => Make_Indexed_Component (Loc,
1051 Prefix => New_Occurrence_Of (Res, Loc),
1052 Expressions => New_List (New_Occurrence_Of (Pos, Loc))),
1054 Make_Character_Literal (Loc,
1056 Char_Literal_Value =>
1057 UI_From_Int (Character'Pos ('(')))));
1060 Make_Assignment_Statement (Loc,
1061 Name => New_Occurrence_Of (Pos, Loc),
1064 Left_Opnd => New_Occurrence_Of (Pos, Loc),
1065 Right_Opnd => Make_Integer_Literal (Loc, 1))));
1067 for J in 1 .. Dims loop
1070 Make_Assignment_Statement (Loc,
1071 Name => Make_Slice (Loc,
1072 Prefix => New_Occurrence_Of (Res, Loc),
1075 Low_Bound => New_Occurrence_Of (Pos, Loc),
1076 High_Bound => Make_Op_Subtract (Loc,
1079 Left_Opnd => New_Occurrence_Of (Pos, Loc),
1081 Make_Attribute_Reference (Loc,
1082 Attribute_Name => Name_Length,
1084 New_Occurrence_Of (Temps (J), Loc),
1086 New_List (Make_Integer_Literal (Loc, 1)))),
1087 Right_Opnd => Make_Integer_Literal (Loc, 1)))),
1089 Expression => New_Occurrence_Of (Temps (J), Loc)));
1093 Make_Assignment_Statement (Loc,
1094 Name => New_Occurrence_Of (Pos, Loc),
1097 Left_Opnd => New_Occurrence_Of (Pos, Loc),
1099 Make_Attribute_Reference (Loc,
1100 Attribute_Name => Name_Length,
1101 Prefix => New_Occurrence_Of (Temps (J), Loc),
1103 New_List (Make_Integer_Literal (Loc, 1))))));
1105 Set_Character_Literal_Name (Char_Code (Character'Pos (',')));
1108 Make_Assignment_Statement (Loc,
1109 Name => Make_Indexed_Component (Loc,
1110 Prefix => New_Occurrence_Of (Res, Loc),
1111 Expressions => New_List (New_Occurrence_Of (Pos, Loc))),
1113 Make_Character_Literal (Loc,
1115 Char_Literal_Value =>
1116 UI_From_Int (Character'Pos (',')))));
1119 Make_Assignment_Statement (Loc,
1120 Name => New_Occurrence_Of (Pos, Loc),
1123 Left_Opnd => New_Occurrence_Of (Pos, Loc),
1124 Right_Opnd => Make_Integer_Literal (Loc, 1))));
1128 Set_Character_Literal_Name (Char_Code (Character'Pos (')')));
1131 Make_Assignment_Statement (Loc,
1132 Name => Make_Indexed_Component (Loc,
1133 Prefix => New_Occurrence_Of (Res, Loc),
1134 Expressions => New_List (New_Occurrence_Of (Len, Loc))),
1136 Make_Character_Literal (Loc,
1138 Char_Literal_Value =>
1139 UI_From_Int (Character'Pos (')')))));
1140 return Build_Task_Image_Function (Loc, Decls, Stats, Res);
1141 end Build_Task_Array_Image;
1143 ----------------------------
1144 -- Build_Task_Image_Decls --
1145 ----------------------------
1147 function Build_Task_Image_Decls
1151 In_Init_Proc : Boolean := False) return List_Id
1153 Decls : constant List_Id := New_List;
1154 T_Id : Entity_Id := Empty;
1156 Expr : Node_Id := Empty;
1157 Fun : Node_Id := Empty;
1158 Is_Dyn : constant Boolean :=
1159 Nkind (Parent (Id_Ref)) = N_Assignment_Statement
1161 Nkind (Expression (Parent (Id_Ref))) = N_Allocator;
1164 -- If Discard_Names or No_Implicit_Heap_Allocations are in effect,
1165 -- generate a dummy declaration only.
1167 if Restriction_Active (No_Implicit_Heap_Allocations)
1168 or else Global_Discard_Names
1170 T_Id := Make_Temporary (Loc, 'J');
1175 Make_Object_Declaration (Loc,
1176 Defining_Identifier => T_Id,
1177 Object_Definition => New_Occurrence_Of (Standard_String, Loc),
1179 Make_String_Literal (Loc,
1180 Strval => String_From_Name_Buffer)));
1183 if Nkind (Id_Ref) = N_Identifier
1184 or else Nkind (Id_Ref) = N_Defining_Identifier
1186 -- For a simple variable, the image of the task is built from
1187 -- the name of the variable. To avoid possible conflict with the
1188 -- anonymous type created for a single protected object, add a
1192 Make_Defining_Identifier (Loc,
1193 New_External_Name (Chars (Id_Ref), 'T', 1));
1195 Get_Name_String (Chars (Id_Ref));
1198 Make_String_Literal (Loc,
1199 Strval => String_From_Name_Buffer);
1201 elsif Nkind (Id_Ref) = N_Selected_Component then
1203 Make_Defining_Identifier (Loc,
1204 New_External_Name (Chars (Selector_Name (Id_Ref)), 'T'));
1205 Fun := Build_Task_Record_Image (Loc, Id_Ref, Is_Dyn);
1207 elsif Nkind (Id_Ref) = N_Indexed_Component then
1209 Make_Defining_Identifier (Loc,
1210 New_External_Name (Chars (A_Type), 'N'));
1212 Fun := Build_Task_Array_Image (Loc, Id_Ref, A_Type, Is_Dyn);
1216 if Present (Fun) then
1217 Append (Fun, Decls);
1218 Expr := Make_Function_Call (Loc,
1219 Name => New_Occurrence_Of (Defining_Entity (Fun), Loc));
1221 if not In_Init_Proc and then VM_Target = No_VM then
1222 Set_Uses_Sec_Stack (Defining_Entity (Fun));
1226 Decl := Make_Object_Declaration (Loc,
1227 Defining_Identifier => T_Id,
1228 Object_Definition => New_Occurrence_Of (Standard_String, Loc),
1229 Constant_Present => True,
1230 Expression => Expr);
1232 Append (Decl, Decls);
1234 end Build_Task_Image_Decls;
1236 -------------------------------
1237 -- Build_Task_Image_Function --
1238 -------------------------------
1240 function Build_Task_Image_Function
1244 Res : Entity_Id) return Node_Id
1250 Make_Simple_Return_Statement (Loc,
1251 Expression => New_Occurrence_Of (Res, Loc)));
1253 Spec := Make_Function_Specification (Loc,
1254 Defining_Unit_Name => Make_Temporary (Loc, 'F'),
1255 Result_Definition => New_Occurrence_Of (Standard_String, Loc));
1257 -- Calls to 'Image use the secondary stack, which must be cleaned up
1258 -- after the task name is built.
1260 return Make_Subprogram_Body (Loc,
1261 Specification => Spec,
1262 Declarations => Decls,
1263 Handled_Statement_Sequence =>
1264 Make_Handled_Sequence_Of_Statements (Loc, Statements => Stats));
1265 end Build_Task_Image_Function;
1267 -----------------------------
1268 -- Build_Task_Image_Prefix --
1269 -----------------------------
1271 procedure Build_Task_Image_Prefix
1273 Len : out Entity_Id;
1274 Res : out Entity_Id;
1275 Pos : out Entity_Id;
1282 Len := Make_Temporary (Loc, 'L', Sum);
1285 Make_Object_Declaration (Loc,
1286 Defining_Identifier => Len,
1287 Object_Definition => New_Occurrence_Of (Standard_Integer, Loc),
1288 Expression => Sum));
1290 Res := Make_Temporary (Loc, 'R');
1293 Make_Object_Declaration (Loc,
1294 Defining_Identifier => Res,
1295 Object_Definition =>
1296 Make_Subtype_Indication (Loc,
1297 Subtype_Mark => New_Occurrence_Of (Standard_String, Loc),
1299 Make_Index_Or_Discriminant_Constraint (Loc,
1303 Low_Bound => Make_Integer_Literal (Loc, 1),
1304 High_Bound => New_Occurrence_Of (Len, Loc)))))));
1306 Pos := Make_Temporary (Loc, 'P');
1309 Make_Object_Declaration (Loc,
1310 Defining_Identifier => Pos,
1311 Object_Definition => New_Occurrence_Of (Standard_Integer, Loc)));
1313 -- Pos := Prefix'Length;
1316 Make_Assignment_Statement (Loc,
1317 Name => New_Occurrence_Of (Pos, Loc),
1319 Make_Attribute_Reference (Loc,
1320 Attribute_Name => Name_Length,
1321 Prefix => New_Occurrence_Of (Prefix, Loc),
1322 Expressions => New_List (Make_Integer_Literal (Loc, 1)))));
1324 -- Res (1 .. Pos) := Prefix;
1327 Make_Assignment_Statement (Loc,
1330 Prefix => New_Occurrence_Of (Res, Loc),
1333 Low_Bound => Make_Integer_Literal (Loc, 1),
1334 High_Bound => New_Occurrence_Of (Pos, Loc))),
1336 Expression => New_Occurrence_Of (Prefix, Loc)));
1339 Make_Assignment_Statement (Loc,
1340 Name => New_Occurrence_Of (Pos, Loc),
1343 Left_Opnd => New_Occurrence_Of (Pos, Loc),
1344 Right_Opnd => Make_Integer_Literal (Loc, 1))));
1345 end Build_Task_Image_Prefix;
1347 -----------------------------
1348 -- Build_Task_Record_Image --
1349 -----------------------------
1351 function Build_Task_Record_Image
1354 Dyn : Boolean := False) return Node_Id
1357 -- Total length of generated name
1360 -- Index into result
1363 -- String to hold result
1365 Pref : constant Entity_Id := Make_Temporary (Loc, 'P');
1366 -- Name of enclosing variable, prefix of resulting name
1369 -- Expression to compute total size of string
1372 -- Entity for selector name
1374 Decls : constant List_Id := New_List;
1375 Stats : constant List_Id := New_List;
1378 -- For a dynamic task, the name comes from the target variable. For a
1379 -- static one it is a formal of the enclosing init proc.
1382 Get_Name_String (Chars (Entity (Prefix (Id_Ref))));
1384 Make_Object_Declaration (Loc,
1385 Defining_Identifier => Pref,
1386 Object_Definition => New_Occurrence_Of (Standard_String, Loc),
1388 Make_String_Literal (Loc,
1389 Strval => String_From_Name_Buffer)));
1393 Make_Object_Renaming_Declaration (Loc,
1394 Defining_Identifier => Pref,
1395 Subtype_Mark => New_Occurrence_Of (Standard_String, Loc),
1396 Name => Make_Identifier (Loc, Name_uTask_Name)));
1399 Sel := Make_Temporary (Loc, 'S');
1401 Get_Name_String (Chars (Selector_Name (Id_Ref)));
1404 Make_Object_Declaration (Loc,
1405 Defining_Identifier => Sel,
1406 Object_Definition => New_Occurrence_Of (Standard_String, Loc),
1408 Make_String_Literal (Loc,
1409 Strval => String_From_Name_Buffer)));
1411 Sum := Make_Integer_Literal (Loc, Nat (Name_Len + 1));
1417 Make_Attribute_Reference (Loc,
1418 Attribute_Name => Name_Length,
1420 New_Occurrence_Of (Pref, Loc),
1421 Expressions => New_List (Make_Integer_Literal (Loc, 1))));
1423 Build_Task_Image_Prefix (Loc, Len, Res, Pos, Pref, Sum, Decls, Stats);
1425 Set_Character_Literal_Name (Char_Code (Character'Pos ('.')));
1427 -- Res (Pos) := '.';
1430 Make_Assignment_Statement (Loc,
1431 Name => Make_Indexed_Component (Loc,
1432 Prefix => New_Occurrence_Of (Res, Loc),
1433 Expressions => New_List (New_Occurrence_Of (Pos, Loc))),
1435 Make_Character_Literal (Loc,
1437 Char_Literal_Value =>
1438 UI_From_Int (Character'Pos ('.')))));
1441 Make_Assignment_Statement (Loc,
1442 Name => New_Occurrence_Of (Pos, Loc),
1445 Left_Opnd => New_Occurrence_Of (Pos, Loc),
1446 Right_Opnd => Make_Integer_Literal (Loc, 1))));
1448 -- Res (Pos .. Len) := Selector;
1451 Make_Assignment_Statement (Loc,
1452 Name => Make_Slice (Loc,
1453 Prefix => New_Occurrence_Of (Res, Loc),
1456 Low_Bound => New_Occurrence_Of (Pos, Loc),
1457 High_Bound => New_Occurrence_Of (Len, Loc))),
1458 Expression => New_Occurrence_Of (Sel, Loc)));
1460 return Build_Task_Image_Function (Loc, Decls, Stats, Res);
1461 end Build_Task_Record_Image;
1463 ----------------------------------
1464 -- Component_May_Be_Bit_Aligned --
1465 ----------------------------------
1467 function Component_May_Be_Bit_Aligned (Comp : Entity_Id) return Boolean is
1471 -- If no component clause, then everything is fine, since the back end
1472 -- never bit-misaligns by default, even if there is a pragma Packed for
1475 if No (Comp) or else No (Component_Clause (Comp)) then
1479 UT := Underlying_Type (Etype (Comp));
1481 -- It is only array and record types that cause trouble
1483 if not Is_Record_Type (UT)
1484 and then not Is_Array_Type (UT)
1488 -- If we know that we have a small (64 bits or less) record or small
1489 -- bit-packed array, then everything is fine, since the back end can
1490 -- handle these cases correctly.
1492 elsif Esize (Comp) <= 64
1493 and then (Is_Record_Type (UT)
1494 or else Is_Bit_Packed_Array (UT))
1498 -- Otherwise if the component is not byte aligned, we know we have the
1499 -- nasty unaligned case.
1501 elsif Normalized_First_Bit (Comp) /= Uint_0
1502 or else Esize (Comp) mod System_Storage_Unit /= Uint_0
1506 -- If we are large and byte aligned, then OK at this level
1511 end Component_May_Be_Bit_Aligned;
1513 -----------------------------------
1514 -- Corresponding_Runtime_Package --
1515 -----------------------------------
1517 function Corresponding_Runtime_Package (Typ : Entity_Id) return RTU_Id is
1518 Pkg_Id : RTU_Id := RTU_Null;
1521 pragma Assert (Is_Concurrent_Type (Typ));
1523 if Ekind (Typ) in Protected_Kind then
1524 if Has_Entries (Typ)
1526 -- A protected type without entries that covers an interface and
1527 -- overrides the abstract routines with protected procedures is
1528 -- considered equivalent to a protected type with entries in the
1529 -- context of dispatching select statements. It is sufficient to
1530 -- check for the presence of an interface list in the declaration
1531 -- node to recognize this case.
1533 or else Present (Interface_List (Parent (Typ)))
1535 (((Has_Attach_Handler (Typ) and then not Restricted_Profile)
1536 or else Has_Interrupt_Handler (Typ))
1537 and then not Restriction_Active (No_Dynamic_Attachment))
1540 or else Restriction_Active (No_Entry_Queue) = False
1541 or else Number_Entries (Typ) > 1
1542 or else (Has_Attach_Handler (Typ)
1543 and then not Restricted_Profile)
1545 Pkg_Id := System_Tasking_Protected_Objects_Entries;
1547 Pkg_Id := System_Tasking_Protected_Objects_Single_Entry;
1551 Pkg_Id := System_Tasking_Protected_Objects;
1556 end Corresponding_Runtime_Package;
1558 -------------------------------
1559 -- Convert_To_Actual_Subtype --
1560 -------------------------------
1562 procedure Convert_To_Actual_Subtype (Exp : Entity_Id) is
1566 Act_ST := Get_Actual_Subtype (Exp);
1568 if Act_ST = Etype (Exp) then
1571 Rewrite (Exp, Convert_To (Act_ST, Relocate_Node (Exp)));
1572 Analyze_And_Resolve (Exp, Act_ST);
1574 end Convert_To_Actual_Subtype;
1576 -----------------------------------
1577 -- Current_Sem_Unit_Declarations --
1578 -----------------------------------
1580 function Current_Sem_Unit_Declarations return List_Id is
1581 U : Node_Id := Unit (Cunit (Current_Sem_Unit));
1585 -- If the current unit is a package body, locate the visible
1586 -- declarations of the package spec.
1588 if Nkind (U) = N_Package_Body then
1589 U := Unit (Library_Unit (Cunit (Current_Sem_Unit)));
1592 if Nkind (U) = N_Package_Declaration then
1593 U := Specification (U);
1594 Decls := Visible_Declarations (U);
1598 Set_Visible_Declarations (U, Decls);
1602 Decls := Declarations (U);
1606 Set_Declarations (U, Decls);
1611 end Current_Sem_Unit_Declarations;
1613 -----------------------
1614 -- Duplicate_Subexpr --
1615 -----------------------
1617 function Duplicate_Subexpr
1619 Name_Req : Boolean := False) return Node_Id
1622 Remove_Side_Effects (Exp, Name_Req);
1623 return New_Copy_Tree (Exp);
1624 end Duplicate_Subexpr;
1626 ---------------------------------
1627 -- Duplicate_Subexpr_No_Checks --
1628 ---------------------------------
1630 function Duplicate_Subexpr_No_Checks
1632 Name_Req : Boolean := False) return Node_Id
1637 Remove_Side_Effects (Exp, Name_Req);
1638 New_Exp := New_Copy_Tree (Exp);
1639 Remove_Checks (New_Exp);
1641 end Duplicate_Subexpr_No_Checks;
1643 -----------------------------------
1644 -- Duplicate_Subexpr_Move_Checks --
1645 -----------------------------------
1647 function Duplicate_Subexpr_Move_Checks
1649 Name_Req : Boolean := False) return Node_Id
1653 Remove_Side_Effects (Exp, Name_Req);
1654 New_Exp := New_Copy_Tree (Exp);
1655 Remove_Checks (Exp);
1657 end Duplicate_Subexpr_Move_Checks;
1659 --------------------
1660 -- Ensure_Defined --
1661 --------------------
1663 procedure Ensure_Defined (Typ : Entity_Id; N : Node_Id) is
1667 -- An itype reference must only be created if this is a local itype, so
1668 -- that gigi can elaborate it on the proper objstack.
1671 and then Scope (Typ) = Current_Scope
1673 IR := Make_Itype_Reference (Sloc (N));
1674 Set_Itype (IR, Typ);
1675 Insert_Action (N, IR);
1679 --------------------
1680 -- Entry_Names_OK --
1681 --------------------
1683 function Entry_Names_OK return Boolean is
1686 not Restricted_Profile
1687 and then not Global_Discard_Names
1688 and then not Restriction_Active (No_Implicit_Heap_Allocations)
1689 and then not Restriction_Active (No_Local_Allocators);
1692 ---------------------
1693 -- Evolve_And_Then --
1694 ---------------------
1696 procedure Evolve_And_Then (Cond : in out Node_Id; Cond1 : Node_Id) is
1702 Make_And_Then (Sloc (Cond1),
1704 Right_Opnd => Cond1);
1706 end Evolve_And_Then;
1708 --------------------
1709 -- Evolve_Or_Else --
1710 --------------------
1712 procedure Evolve_Or_Else (Cond : in out Node_Id; Cond1 : Node_Id) is
1718 Make_Or_Else (Sloc (Cond1),
1720 Right_Opnd => Cond1);
1724 ------------------------------
1725 -- Expand_Subtype_From_Expr --
1726 ------------------------------
1728 -- This function is applicable for both static and dynamic allocation of
1729 -- objects which are constrained by an initial expression. Basically it
1730 -- transforms an unconstrained subtype indication into a constrained one.
1732 -- The expression may also be transformed in certain cases in order to
1733 -- avoid multiple evaluation. In the static allocation case, the general
1738 -- is transformed into
1740 -- Val : Constrained_Subtype_of_T := Maybe_Modified_Expr;
1742 -- Here are the main cases :
1744 -- <if Expr is a Slice>
1745 -- Val : T ([Index_Subtype (Expr)]) := Expr;
1747 -- <elsif Expr is a String Literal>
1748 -- Val : T (T'First .. T'First + Length (string literal) - 1) := Expr;
1750 -- <elsif Expr is Constrained>
1751 -- subtype T is Type_Of_Expr
1754 -- <elsif Expr is an entity_name>
1755 -- Val : T (constraints taken from Expr) := Expr;
1758 -- type Axxx is access all T;
1759 -- Rval : Axxx := Expr'ref;
1760 -- Val : T (constraints taken from Rval) := Rval.all;
1762 -- ??? note: when the Expression is allocated in the secondary stack
1763 -- we could use it directly instead of copying it by declaring
1764 -- Val : T (...) renames Rval.all
1766 procedure Expand_Subtype_From_Expr
1768 Unc_Type : Entity_Id;
1769 Subtype_Indic : Node_Id;
1772 Loc : constant Source_Ptr := Sloc (N);
1773 Exp_Typ : constant Entity_Id := Etype (Exp);
1777 -- In general we cannot build the subtype if expansion is disabled,
1778 -- because internal entities may not have been defined. However, to
1779 -- avoid some cascaded errors, we try to continue when the expression is
1780 -- an array (or string), because it is safe to compute the bounds. It is
1781 -- in fact required to do so even in a generic context, because there
1782 -- may be constants that depend on the bounds of a string literal, both
1783 -- standard string types and more generally arrays of characters.
1785 if not Expander_Active
1786 and then (No (Etype (Exp))
1787 or else not Is_String_Type (Etype (Exp)))
1792 if Nkind (Exp) = N_Slice then
1794 Slice_Type : constant Entity_Id := Etype (First_Index (Exp_Typ));
1797 Rewrite (Subtype_Indic,
1798 Make_Subtype_Indication (Loc,
1799 Subtype_Mark => New_Reference_To (Unc_Type, Loc),
1801 Make_Index_Or_Discriminant_Constraint (Loc,
1802 Constraints => New_List
1803 (New_Reference_To (Slice_Type, Loc)))));
1805 -- This subtype indication may be used later for constraint checks
1806 -- we better make sure that if a variable was used as a bound of
1807 -- of the original slice, its value is frozen.
1809 Force_Evaluation (Low_Bound (Scalar_Range (Slice_Type)));
1810 Force_Evaluation (High_Bound (Scalar_Range (Slice_Type)));
1813 elsif Ekind (Exp_Typ) = E_String_Literal_Subtype then
1814 Rewrite (Subtype_Indic,
1815 Make_Subtype_Indication (Loc,
1816 Subtype_Mark => New_Reference_To (Unc_Type, Loc),
1818 Make_Index_Or_Discriminant_Constraint (Loc,
1819 Constraints => New_List (
1820 Make_Literal_Range (Loc,
1821 Literal_Typ => Exp_Typ)))));
1823 elsif Is_Constrained (Exp_Typ)
1824 and then not Is_Class_Wide_Type (Unc_Type)
1826 if Is_Itype (Exp_Typ) then
1828 -- Within an initialization procedure, a selected component
1829 -- denotes a component of the enclosing record, and it appears as
1830 -- an actual in a call to its own initialization procedure. If
1831 -- this component depends on the outer discriminant, we must
1832 -- generate the proper actual subtype for it.
1834 if Nkind (Exp) = N_Selected_Component
1835 and then Within_Init_Proc
1838 Decl : constant Node_Id :=
1839 Build_Actual_Subtype_Of_Component (Exp_Typ, Exp);
1841 if Present (Decl) then
1842 Insert_Action (N, Decl);
1843 T := Defining_Identifier (Decl);
1849 -- No need to generate a new one (new what???)
1856 T := Make_Temporary (Loc, 'T');
1859 Make_Subtype_Declaration (Loc,
1860 Defining_Identifier => T,
1861 Subtype_Indication => New_Reference_To (Exp_Typ, Loc)));
1863 -- This type is marked as an itype even though it has an explicit
1864 -- declaration since otherwise Is_Generic_Actual_Type can get
1865 -- set, resulting in the generation of spurious errors. (See
1866 -- sem_ch8.Analyze_Package_Renaming and sem_type.covers)
1869 Set_Associated_Node_For_Itype (T, Exp);
1872 Rewrite (Subtype_Indic, New_Reference_To (T, Loc));
1874 -- Nothing needs to be done for private types with unknown discriminants
1875 -- if the underlying type is not an unconstrained composite type or it
1876 -- is an unchecked union.
1878 elsif Is_Private_Type (Unc_Type)
1879 and then Has_Unknown_Discriminants (Unc_Type)
1880 and then (not Is_Composite_Type (Underlying_Type (Unc_Type))
1881 or else Is_Constrained (Underlying_Type (Unc_Type))
1882 or else Is_Unchecked_Union (Underlying_Type (Unc_Type)))
1886 -- Case of derived type with unknown discriminants where the parent type
1887 -- also has unknown discriminants.
1889 elsif Is_Record_Type (Unc_Type)
1890 and then not Is_Class_Wide_Type (Unc_Type)
1891 and then Has_Unknown_Discriminants (Unc_Type)
1892 and then Has_Unknown_Discriminants (Underlying_Type (Unc_Type))
1894 -- Nothing to be done if no underlying record view available
1896 if No (Underlying_Record_View (Unc_Type)) then
1899 -- Otherwise use the Underlying_Record_View to create the proper
1900 -- constrained subtype for an object of a derived type with unknown
1904 Remove_Side_Effects (Exp);
1905 Rewrite (Subtype_Indic,
1906 Make_Subtype_From_Expr (Exp, Underlying_Record_View (Unc_Type)));
1909 -- Renamings of class-wide interface types require no equivalent
1910 -- constrained type declarations because we only need to reference
1911 -- the tag component associated with the interface. The same is
1912 -- presumably true for class-wide types in general, so this test
1913 -- is broadened to include all class-wide renamings, which also
1914 -- avoids cases of unbounded recursion in Remove_Side_Effects.
1915 -- (Is this really correct, or are there some cases of class-wide
1916 -- renamings that require action in this procedure???)
1919 and then Nkind (N) = N_Object_Renaming_Declaration
1920 and then Is_Class_Wide_Type (Unc_Type)
1924 -- In Ada95 nothing to be done if the type of the expression is limited,
1925 -- because in this case the expression cannot be copied, and its use can
1926 -- only be by reference.
1928 -- In Ada2005, the context can be an object declaration whose expression
1929 -- is a function that returns in place. If the nominal subtype has
1930 -- unknown discriminants, the call still provides constraints on the
1931 -- object, and we have to create an actual subtype from it.
1933 -- If the type is class-wide, the expression is dynamically tagged and
1934 -- we do not create an actual subtype either. Ditto for an interface.
1935 -- For now this applies only if the type is immutably limited, and the
1936 -- function being called is build-in-place. This will have to be revised
1937 -- when build-in-place functions are generalized to other types.
1939 elsif Is_Immutably_Limited_Type (Exp_Typ)
1941 (Is_Class_Wide_Type (Exp_Typ)
1942 or else Is_Interface (Exp_Typ)
1943 or else not Has_Unknown_Discriminants (Exp_Typ)
1944 or else not Is_Composite_Type (Unc_Type))
1948 -- For limited objects initialized with build in place function calls,
1949 -- nothing to be done; otherwise we prematurely introduce an N_Reference
1950 -- node in the expression initializing the object, which breaks the
1951 -- circuitry that detects and adds the additional arguments to the
1954 elsif Is_Build_In_Place_Function_Call (Exp) then
1958 Remove_Side_Effects (Exp);
1959 Rewrite (Subtype_Indic,
1960 Make_Subtype_From_Expr (Exp, Unc_Type));
1962 end Expand_Subtype_From_Expr;
1964 --------------------
1965 -- Find_Init_Call --
1966 --------------------
1968 function Find_Init_Call
1970 Rep_Clause : Node_Id) return Node_Id
1972 Typ : constant Entity_Id := Etype (Var);
1974 Init_Proc : Entity_Id;
1975 -- Initialization procedure for Typ
1977 function Find_Init_Call_In_List (From : Node_Id) return Node_Id;
1978 -- Look for init call for Var starting at From and scanning the
1979 -- enclosing list until Rep_Clause or the end of the list is reached.
1981 ----------------------------
1982 -- Find_Init_Call_In_List --
1983 ----------------------------
1985 function Find_Init_Call_In_List (From : Node_Id) return Node_Id is
1986 Init_Call : Node_Id;
1990 while Present (Init_Call) and then Init_Call /= Rep_Clause loop
1991 if Nkind (Init_Call) = N_Procedure_Call_Statement
1992 and then Is_Entity_Name (Name (Init_Call))
1993 and then Entity (Name (Init_Call)) = Init_Proc
2002 end Find_Init_Call_In_List;
2004 Init_Call : Node_Id;
2006 -- Start of processing for Find_Init_Call
2009 if not Has_Non_Null_Base_Init_Proc (Typ) then
2010 -- No init proc for the type, so obviously no call to be found
2015 Init_Proc := Base_Init_Proc (Typ);
2017 -- First scan the list containing the declaration of Var
2019 Init_Call := Find_Init_Call_In_List (From => Next (Parent (Var)));
2021 -- If not found, also look on Var's freeze actions list, if any, since
2022 -- the init call may have been moved there (case of an address clause
2023 -- applying to Var).
2025 if No (Init_Call) and then Present (Freeze_Node (Var)) then
2027 Find_Init_Call_In_List (First (Actions (Freeze_Node (Var))));
2033 ------------------------
2034 -- Find_Interface_ADT --
2035 ------------------------
2037 function Find_Interface_ADT
2039 Iface : Entity_Id) return Elmt_Id
2042 Typ : Entity_Id := T;
2045 pragma Assert (Is_Interface (Iface));
2047 -- Handle private types
2049 if Has_Private_Declaration (Typ)
2050 and then Present (Full_View (Typ))
2052 Typ := Full_View (Typ);
2055 -- Handle access types
2057 if Is_Access_Type (Typ) then
2058 Typ := Designated_Type (Typ);
2061 -- Handle task and protected types implementing interfaces
2063 if Is_Concurrent_Type (Typ) then
2064 Typ := Corresponding_Record_Type (Typ);
2068 (not Is_Class_Wide_Type (Typ)
2069 and then Ekind (Typ) /= E_Incomplete_Type);
2071 if Is_Ancestor (Iface, Typ, Use_Full_View => True) then
2072 return First_Elmt (Access_Disp_Table (Typ));
2076 Next_Elmt (Next_Elmt (First_Elmt (Access_Disp_Table (Typ))));
2078 and then Present (Related_Type (Node (ADT)))
2079 and then Related_Type (Node (ADT)) /= Iface
2080 and then not Is_Ancestor (Iface, Related_Type (Node (ADT)),
2081 Use_Full_View => True)
2086 pragma Assert (Present (Related_Type (Node (ADT))));
2089 end Find_Interface_ADT;
2091 ------------------------
2092 -- Find_Interface_Tag --
2093 ------------------------
2095 function Find_Interface_Tag
2097 Iface : Entity_Id) return Entity_Id
2100 Found : Boolean := False;
2101 Typ : Entity_Id := T;
2103 procedure Find_Tag (Typ : Entity_Id);
2104 -- Internal subprogram used to recursively climb to the ancestors
2110 procedure Find_Tag (Typ : Entity_Id) is
2115 -- This routine does not handle the case in which the interface is an
2116 -- ancestor of Typ. That case is handled by the enclosing subprogram.
2118 pragma Assert (Typ /= Iface);
2120 -- Climb to the root type handling private types
2122 if Present (Full_View (Etype (Typ))) then
2123 if Full_View (Etype (Typ)) /= Typ then
2124 Find_Tag (Full_View (Etype (Typ)));
2127 elsif Etype (Typ) /= Typ then
2128 Find_Tag (Etype (Typ));
2131 -- Traverse the list of interfaces implemented by the type
2134 and then Present (Interfaces (Typ))
2135 and then not (Is_Empty_Elmt_List (Interfaces (Typ)))
2137 -- Skip the tag associated with the primary table
2139 pragma Assert (Etype (First_Tag_Component (Typ)) = RTE (RE_Tag));
2140 AI_Tag := Next_Tag_Component (First_Tag_Component (Typ));
2141 pragma Assert (Present (AI_Tag));
2143 AI_Elmt := First_Elmt (Interfaces (Typ));
2144 while Present (AI_Elmt) loop
2145 AI := Node (AI_Elmt);
2148 or else Is_Ancestor (Iface, AI, Use_Full_View => True)
2154 AI_Tag := Next_Tag_Component (AI_Tag);
2155 Next_Elmt (AI_Elmt);
2160 -- Start of processing for Find_Interface_Tag
2163 pragma Assert (Is_Interface (Iface));
2165 -- Handle access types
2167 if Is_Access_Type (Typ) then
2168 Typ := Designated_Type (Typ);
2171 -- Handle class-wide types
2173 if Is_Class_Wide_Type (Typ) then
2174 Typ := Root_Type (Typ);
2177 -- Handle private types
2179 if Has_Private_Declaration (Typ)
2180 and then Present (Full_View (Typ))
2182 Typ := Full_View (Typ);
2185 -- Handle entities from the limited view
2187 if Ekind (Typ) = E_Incomplete_Type then
2188 pragma Assert (Present (Non_Limited_View (Typ)));
2189 Typ := Non_Limited_View (Typ);
2192 -- Handle task and protected types implementing interfaces
2194 if Is_Concurrent_Type (Typ) then
2195 Typ := Corresponding_Record_Type (Typ);
2198 -- If the interface is an ancestor of the type, then it shared the
2199 -- primary dispatch table.
2201 if Is_Ancestor (Iface, Typ, Use_Full_View => True) then
2202 pragma Assert (Etype (First_Tag_Component (Typ)) = RTE (RE_Tag));
2203 return First_Tag_Component (Typ);
2205 -- Otherwise we need to search for its associated tag component
2209 pragma Assert (Found);
2212 end Find_Interface_Tag;
2218 function Find_Prim_Op (T : Entity_Id; Name : Name_Id) return Entity_Id is
2220 Typ : Entity_Id := T;
2224 if Is_Class_Wide_Type (Typ) then
2225 Typ := Root_Type (Typ);
2228 Typ := Underlying_Type (Typ);
2230 -- Loop through primitive operations
2232 Prim := First_Elmt (Primitive_Operations (Typ));
2233 while Present (Prim) loop
2236 -- We can retrieve primitive operations by name if it is an internal
2237 -- name. For equality we must check that both of its operands have
2238 -- the same type, to avoid confusion with user-defined equalities
2239 -- than may have a non-symmetric signature.
2241 exit when Chars (Op) = Name
2244 or else Etype (First_Formal (Op)) = Etype (Last_Formal (Op)));
2248 -- Raise Program_Error if no primitive found
2251 raise Program_Error;
2262 function Find_Prim_Op
2264 Name : TSS_Name_Type) return Entity_Id
2266 Inher_Op : Entity_Id := Empty;
2267 Own_Op : Entity_Id := Empty;
2268 Prim_Elmt : Elmt_Id;
2269 Prim_Id : Entity_Id;
2270 Typ : Entity_Id := T;
2273 if Is_Class_Wide_Type (Typ) then
2274 Typ := Root_Type (Typ);
2277 Typ := Underlying_Type (Typ);
2279 -- This search is based on the assertion that the dispatching version
2280 -- of the TSS routine always precedes the real primitive.
2282 Prim_Elmt := First_Elmt (Primitive_Operations (Typ));
2283 while Present (Prim_Elmt) loop
2284 Prim_Id := Node (Prim_Elmt);
2286 if Is_TSS (Prim_Id, Name) then
2287 if Present (Alias (Prim_Id)) then
2288 Inher_Op := Prim_Id;
2294 Next_Elmt (Prim_Elmt);
2297 if Present (Own_Op) then
2299 elsif Present (Inher_Op) then
2302 raise Program_Error;
2306 ----------------------------
2307 -- Find_Protection_Object --
2308 ----------------------------
2310 function Find_Protection_Object (Scop : Entity_Id) return Entity_Id is
2315 while Present (S) loop
2316 if (Ekind (S) = E_Entry
2317 or else Ekind (S) = E_Entry_Family
2318 or else Ekind (S) = E_Function
2319 or else Ekind (S) = E_Procedure)
2320 and then Present (Protection_Object (S))
2322 return Protection_Object (S);
2328 -- If we do not find a Protection object in the scope chain, then
2329 -- something has gone wrong, most likely the object was never created.
2331 raise Program_Error;
2332 end Find_Protection_Object;
2334 --------------------------
2335 -- Find_Protection_Type --
2336 --------------------------
2338 function Find_Protection_Type (Conc_Typ : Entity_Id) return Entity_Id is
2340 Typ : Entity_Id := Conc_Typ;
2343 if Is_Concurrent_Type (Typ) then
2344 Typ := Corresponding_Record_Type (Typ);
2347 -- Since restriction violations are not considered serious errors, the
2348 -- expander remains active, but may leave the corresponding record type
2349 -- malformed. In such cases, component _object is not available so do
2352 if not Analyzed (Typ) then
2356 Comp := First_Component (Typ);
2357 while Present (Comp) loop
2358 if Chars (Comp) = Name_uObject then
2359 return Base_Type (Etype (Comp));
2362 Next_Component (Comp);
2365 -- The corresponding record of a protected type should always have an
2368 raise Program_Error;
2369 end Find_Protection_Type;
2371 ----------------------
2372 -- Force_Evaluation --
2373 ----------------------
2375 procedure Force_Evaluation (Exp : Node_Id; Name_Req : Boolean := False) is
2377 Remove_Side_Effects (Exp, Name_Req, Variable_Ref => True);
2378 end Force_Evaluation;
2380 ---------------------------------
2381 -- Fully_Qualified_Name_String --
2382 ---------------------------------
2384 function Fully_Qualified_Name_String (E : Entity_Id) return String_Id is
2385 procedure Internal_Full_Qualified_Name (E : Entity_Id);
2386 -- Compute recursively the qualified name without NUL at the end, adding
2387 -- it to the currently started string being generated
2389 ----------------------------------
2390 -- Internal_Full_Qualified_Name --
2391 ----------------------------------
2393 procedure Internal_Full_Qualified_Name (E : Entity_Id) is
2397 -- Deal properly with child units
2399 if Nkind (E) = N_Defining_Program_Unit_Name then
2400 Ent := Defining_Identifier (E);
2405 -- Compute qualification recursively (only "Standard" has no scope)
2407 if Present (Scope (Scope (Ent))) then
2408 Internal_Full_Qualified_Name (Scope (Ent));
2409 Store_String_Char (Get_Char_Code ('.'));
2412 -- Every entity should have a name except some expanded blocks
2413 -- don't bother about those.
2415 if Chars (Ent) = No_Name then
2419 -- Generates the entity name in upper case
2421 Get_Decoded_Name_String (Chars (Ent));
2423 Store_String_Chars (Name_Buffer (1 .. Name_Len));
2425 end Internal_Full_Qualified_Name;
2427 -- Start of processing for Full_Qualified_Name
2431 Internal_Full_Qualified_Name (E);
2432 Store_String_Char (Get_Char_Code (ASCII.NUL));
2434 end Fully_Qualified_Name_String;
2436 ------------------------
2437 -- Generate_Poll_Call --
2438 ------------------------
2440 procedure Generate_Poll_Call (N : Node_Id) is
2442 -- No poll call if polling not active
2444 if not Polling_Required then
2447 -- Otherwise generate require poll call
2450 Insert_Before_And_Analyze (N,
2451 Make_Procedure_Call_Statement (Sloc (N),
2452 Name => New_Occurrence_Of (RTE (RE_Poll), Sloc (N))));
2454 end Generate_Poll_Call;
2456 ---------------------------------
2457 -- Get_Current_Value_Condition --
2458 ---------------------------------
2460 -- Note: the implementation of this procedure is very closely tied to the
2461 -- implementation of Set_Current_Value_Condition. In the Get procedure, we
2462 -- interpret Current_Value fields set by the Set procedure, so the two
2463 -- procedures need to be closely coordinated.
2465 procedure Get_Current_Value_Condition
2470 Loc : constant Source_Ptr := Sloc (Var);
2471 Ent : constant Entity_Id := Entity (Var);
2473 procedure Process_Current_Value_Condition
2476 -- N is an expression which holds either True (S = True) or False (S =
2477 -- False) in the condition. This procedure digs out the expression and
2478 -- if it refers to Ent, sets Op and Val appropriately.
2480 -------------------------------------
2481 -- Process_Current_Value_Condition --
2482 -------------------------------------
2484 procedure Process_Current_Value_Condition
2495 -- Deal with NOT operators, inverting sense
2497 while Nkind (Cond) = N_Op_Not loop
2498 Cond := Right_Opnd (Cond);
2502 -- Deal with AND THEN and AND cases
2504 if Nkind (Cond) = N_And_Then
2505 or else Nkind (Cond) = N_Op_And
2507 -- Don't ever try to invert a condition that is of the form of an
2508 -- AND or AND THEN (since we are not doing sufficiently general
2509 -- processing to allow this).
2511 if Sens = False then
2517 -- Recursively process AND and AND THEN branches
2519 Process_Current_Value_Condition (Left_Opnd (Cond), True);
2521 if Op /= N_Empty then
2525 Process_Current_Value_Condition (Right_Opnd (Cond), True);
2528 -- Case of relational operator
2530 elsif Nkind (Cond) in N_Op_Compare then
2533 -- Invert sense of test if inverted test
2535 if Sens = False then
2537 when N_Op_Eq => Op := N_Op_Ne;
2538 when N_Op_Ne => Op := N_Op_Eq;
2539 when N_Op_Lt => Op := N_Op_Ge;
2540 when N_Op_Gt => Op := N_Op_Le;
2541 when N_Op_Le => Op := N_Op_Gt;
2542 when N_Op_Ge => Op := N_Op_Lt;
2543 when others => raise Program_Error;
2547 -- Case of entity op value
2549 if Is_Entity_Name (Left_Opnd (Cond))
2550 and then Ent = Entity (Left_Opnd (Cond))
2551 and then Compile_Time_Known_Value (Right_Opnd (Cond))
2553 Val := Right_Opnd (Cond);
2555 -- Case of value op entity
2557 elsif Is_Entity_Name (Right_Opnd (Cond))
2558 and then Ent = Entity (Right_Opnd (Cond))
2559 and then Compile_Time_Known_Value (Left_Opnd (Cond))
2561 Val := Left_Opnd (Cond);
2563 -- We are effectively swapping operands
2566 when N_Op_Eq => null;
2567 when N_Op_Ne => null;
2568 when N_Op_Lt => Op := N_Op_Gt;
2569 when N_Op_Gt => Op := N_Op_Lt;
2570 when N_Op_Le => Op := N_Op_Ge;
2571 when N_Op_Ge => Op := N_Op_Le;
2572 when others => raise Program_Error;
2581 -- Case of Boolean variable reference, return as though the
2582 -- reference had said var = True.
2585 if Is_Entity_Name (Cond)
2586 and then Ent = Entity (Cond)
2588 Val := New_Occurrence_Of (Standard_True, Sloc (Cond));
2590 if Sens = False then
2597 end Process_Current_Value_Condition;
2599 -- Start of processing for Get_Current_Value_Condition
2605 -- Immediate return, nothing doing, if this is not an object
2607 if Ekind (Ent) not in Object_Kind then
2611 -- Otherwise examine current value
2614 CV : constant Node_Id := Current_Value (Ent);
2619 -- If statement. Condition is known true in THEN section, known False
2620 -- in any ELSIF or ELSE part, and unknown outside the IF statement.
2622 if Nkind (CV) = N_If_Statement then
2624 -- Before start of IF statement
2626 if Loc < Sloc (CV) then
2629 -- After end of IF statement
2631 elsif Loc >= Sloc (CV) + Text_Ptr (UI_To_Int (End_Span (CV))) then
2635 -- At this stage we know that we are within the IF statement, but
2636 -- unfortunately, the tree does not record the SLOC of the ELSE so
2637 -- we cannot use a simple SLOC comparison to distinguish between
2638 -- the then/else statements, so we have to climb the tree.
2645 while Parent (N) /= CV loop
2648 -- If we fall off the top of the tree, then that's odd, but
2649 -- perhaps it could occur in some error situation, and the
2650 -- safest response is simply to assume that the outcome of
2651 -- the condition is unknown. No point in bombing during an
2652 -- attempt to optimize things.
2659 -- Now we have N pointing to a node whose parent is the IF
2660 -- statement in question, so now we can tell if we are within
2661 -- the THEN statements.
2663 if Is_List_Member (N)
2664 and then List_Containing (N) = Then_Statements (CV)
2668 -- If the variable reference does not come from source, we
2669 -- cannot reliably tell whether it appears in the else part.
2670 -- In particular, if it appears in generated code for a node
2671 -- that requires finalization, it may be attached to a list
2672 -- that has not been yet inserted into the code. For now,
2673 -- treat it as unknown.
2675 elsif not Comes_From_Source (N) then
2678 -- Otherwise we must be in ELSIF or ELSE part
2685 -- ELSIF part. Condition is known true within the referenced
2686 -- ELSIF, known False in any subsequent ELSIF or ELSE part,
2687 -- and unknown before the ELSE part or after the IF statement.
2689 elsif Nkind (CV) = N_Elsif_Part then
2691 -- if the Elsif_Part had condition_actions, the elsif has been
2692 -- rewritten as a nested if, and the original elsif_part is
2693 -- detached from the tree, so there is no way to obtain useful
2694 -- information on the current value of the variable.
2695 -- Can this be improved ???
2697 if No (Parent (CV)) then
2703 -- Before start of ELSIF part
2705 if Loc < Sloc (CV) then
2708 -- After end of IF statement
2710 elsif Loc >= Sloc (Stm) +
2711 Text_Ptr (UI_To_Int (End_Span (Stm)))
2716 -- Again we lack the SLOC of the ELSE, so we need to climb the
2717 -- tree to see if we are within the ELSIF part in question.
2724 while Parent (N) /= Stm loop
2727 -- If we fall off the top of the tree, then that's odd, but
2728 -- perhaps it could occur in some error situation, and the
2729 -- safest response is simply to assume that the outcome of
2730 -- the condition is unknown. No point in bombing during an
2731 -- attempt to optimize things.
2738 -- Now we have N pointing to a node whose parent is the IF
2739 -- statement in question, so see if is the ELSIF part we want.
2740 -- the THEN statements.
2745 -- Otherwise we must be in subsequent ELSIF or ELSE part
2752 -- Iteration scheme of while loop. The condition is known to be
2753 -- true within the body of the loop.
2755 elsif Nkind (CV) = N_Iteration_Scheme then
2757 Loop_Stmt : constant Node_Id := Parent (CV);
2760 -- Before start of body of loop
2762 if Loc < Sloc (Loop_Stmt) then
2765 -- After end of LOOP statement
2767 elsif Loc >= Sloc (End_Label (Loop_Stmt)) then
2770 -- We are within the body of the loop
2777 -- All other cases of Current_Value settings
2783 -- If we fall through here, then we have a reportable condition, Sens
2784 -- is True if the condition is true and False if it needs inverting.
2786 Process_Current_Value_Condition (Condition (CV), Sens);
2788 end Get_Current_Value_Condition;
2790 ---------------------
2791 -- Get_Stream_Size --
2792 ---------------------
2794 function Get_Stream_Size (E : Entity_Id) return Uint is
2796 -- If we have a Stream_Size clause for this type use it
2798 if Has_Stream_Size_Clause (E) then
2799 return Static_Integer (Expression (Stream_Size_Clause (E)));
2801 -- Otherwise the Stream_Size if the size of the type
2806 end Get_Stream_Size;
2808 ---------------------------
2809 -- Has_Access_Constraint --
2810 ---------------------------
2812 function Has_Access_Constraint (E : Entity_Id) return Boolean is
2814 T : constant Entity_Id := Etype (E);
2817 if Has_Per_Object_Constraint (E)
2818 and then Has_Discriminants (T)
2820 Disc := First_Discriminant (T);
2821 while Present (Disc) loop
2822 if Is_Access_Type (Etype (Disc)) then
2826 Next_Discriminant (Disc);
2833 end Has_Access_Constraint;
2835 ----------------------------------
2836 -- Has_Following_Address_Clause --
2837 ----------------------------------
2839 -- Should this function check the private part in a package ???
2841 function Has_Following_Address_Clause (D : Node_Id) return Boolean is
2842 Id : constant Entity_Id := Defining_Identifier (D);
2847 while Present (Decl) loop
2848 if Nkind (Decl) = N_At_Clause
2849 and then Chars (Identifier (Decl)) = Chars (Id)
2853 elsif Nkind (Decl) = N_Attribute_Definition_Clause
2854 and then Chars (Decl) = Name_Address
2855 and then Chars (Name (Decl)) = Chars (Id)
2864 end Has_Following_Address_Clause;
2866 --------------------
2867 -- Homonym_Number --
2868 --------------------
2870 function Homonym_Number (Subp : Entity_Id) return Nat is
2876 Hom := Homonym (Subp);
2877 while Present (Hom) loop
2878 if Scope (Hom) = Scope (Subp) then
2882 Hom := Homonym (Hom);
2888 -----------------------------------
2889 -- In_Library_Level_Package_Body --
2890 -----------------------------------
2892 function In_Library_Level_Package_Body (Id : Entity_Id) return Boolean is
2894 -- First determine whether the entity appears at the library level, then
2895 -- look at the containing unit.
2897 if Is_Library_Level_Entity (Id) then
2899 Container : constant Node_Id := Cunit (Get_Source_Unit (Id));
2902 return Nkind (Unit (Container)) = N_Package_Body;
2907 end In_Library_Level_Package_Body;
2909 ------------------------------
2910 -- In_Unconditional_Context --
2911 ------------------------------
2913 function In_Unconditional_Context (Node : Node_Id) return Boolean is
2918 while Present (P) loop
2920 when N_Subprogram_Body =>
2923 when N_If_Statement =>
2926 when N_Loop_Statement =>
2929 when N_Case_Statement =>
2938 end In_Unconditional_Context;
2944 procedure Insert_Action (Assoc_Node : Node_Id; Ins_Action : Node_Id) is
2946 if Present (Ins_Action) then
2947 Insert_Actions (Assoc_Node, New_List (Ins_Action));
2951 -- Version with check(s) suppressed
2953 procedure Insert_Action
2954 (Assoc_Node : Node_Id; Ins_Action : Node_Id; Suppress : Check_Id)
2957 Insert_Actions (Assoc_Node, New_List (Ins_Action), Suppress);
2960 -------------------------
2961 -- Insert_Action_After --
2962 -------------------------
2964 procedure Insert_Action_After
2965 (Assoc_Node : Node_Id;
2966 Ins_Action : Node_Id)
2969 Insert_Actions_After (Assoc_Node, New_List (Ins_Action));
2970 end Insert_Action_After;
2972 --------------------
2973 -- Insert_Actions --
2974 --------------------
2976 procedure Insert_Actions (Assoc_Node : Node_Id; Ins_Actions : List_Id) is
2980 Wrapped_Node : Node_Id := Empty;
2983 if No (Ins_Actions) or else Is_Empty_List (Ins_Actions) then
2987 -- Ignore insert of actions from inside default expression (or other
2988 -- similar "spec expression") in the special spec-expression analyze
2989 -- mode. Any insertions at this point have no relevance, since we are
2990 -- only doing the analyze to freeze the types of any static expressions.
2991 -- See section "Handling of Default Expressions" in the spec of package
2992 -- Sem for further details.
2994 if In_Spec_Expression then
2998 -- If the action derives from stuff inside a record, then the actions
2999 -- are attached to the current scope, to be inserted and analyzed on
3000 -- exit from the scope. The reason for this is that we may also be
3001 -- generating freeze actions at the same time, and they must eventually
3002 -- be elaborated in the correct order.
3004 if Is_Record_Type (Current_Scope)
3005 and then not Is_Frozen (Current_Scope)
3007 if No (Scope_Stack.Table
3008 (Scope_Stack.Last).Pending_Freeze_Actions)
3010 Scope_Stack.Table (Scope_Stack.Last).Pending_Freeze_Actions :=
3015 Scope_Stack.Table (Scope_Stack.Last).Pending_Freeze_Actions);
3021 -- We now intend to climb up the tree to find the right point to
3022 -- insert the actions. We start at Assoc_Node, unless this node is a
3023 -- subexpression in which case we start with its parent. We do this for
3024 -- two reasons. First it speeds things up. Second, if Assoc_Node is
3025 -- itself one of the special nodes like N_And_Then, then we assume that
3026 -- an initial request to insert actions for such a node does not expect
3027 -- the actions to get deposited in the node for later handling when the
3028 -- node is expanded, since clearly the node is being dealt with by the
3029 -- caller. Note that in the subexpression case, N is always the child we
3032 -- N_Raise_xxx_Error is an annoying special case, it is a statement if
3033 -- it has type Standard_Void_Type, and a subexpression otherwise.
3034 -- otherwise. Procedure attribute references are also statements.
3036 if Nkind (Assoc_Node) in N_Subexpr
3037 and then (Nkind (Assoc_Node) in N_Raise_xxx_Error
3038 or else Etype (Assoc_Node) /= Standard_Void_Type)
3039 and then (Nkind (Assoc_Node) /= N_Attribute_Reference
3041 not Is_Procedure_Attribute_Name
3042 (Attribute_Name (Assoc_Node)))
3044 P := Assoc_Node; -- ??? does not agree with above!
3045 N := Parent (Assoc_Node);
3047 -- Non-subexpression case. Note that N is initially Empty in this case
3048 -- (N is only guaranteed Non-Empty in the subexpr case).
3055 -- Capture root of the transient scope
3057 if Scope_Is_Transient then
3058 Wrapped_Node := Node_To_Be_Wrapped;
3062 pragma Assert (Present (P));
3066 -- Case of right operand of AND THEN or OR ELSE. Put the actions
3067 -- in the Actions field of the right operand. They will be moved
3068 -- out further when the AND THEN or OR ELSE operator is expanded.
3069 -- Nothing special needs to be done for the left operand since
3070 -- in that case the actions are executed unconditionally.
3072 when N_Short_Circuit =>
3073 if N = Right_Opnd (P) then
3075 -- We are now going to either append the actions to the
3076 -- actions field of the short-circuit operation. We will
3077 -- also analyze the actions now.
3079 -- This analysis is really too early, the proper thing would
3080 -- be to just park them there now, and only analyze them if
3081 -- we find we really need them, and to it at the proper
3082 -- final insertion point. However attempting to this proved
3083 -- tricky, so for now we just kill current values before and
3084 -- after the analyze call to make sure we avoid peculiar
3085 -- optimizations from this out of order insertion.
3087 Kill_Current_Values;
3089 if Present (Actions (P)) then
3090 Insert_List_After_And_Analyze
3091 (Last (Actions (P)), Ins_Actions);
3093 Set_Actions (P, Ins_Actions);
3094 Analyze_List (Actions (P));
3097 Kill_Current_Values;
3102 -- Then or Else operand of conditional expression. Add actions to
3103 -- Then_Actions or Else_Actions field as appropriate. The actions
3104 -- will be moved further out when the conditional is expanded.
3106 when N_Conditional_Expression =>
3108 ThenX : constant Node_Id := Next (First (Expressions (P)));
3109 ElseX : constant Node_Id := Next (ThenX);
3112 -- If the enclosing expression is already analyzed, as
3113 -- is the case for nested elaboration checks, insert the
3114 -- conditional further out.
3116 if Analyzed (P) then
3119 -- Actions belong to the then expression, temporarily place
3120 -- them as Then_Actions of the conditional expr. They will
3121 -- be moved to the proper place later when the conditional
3122 -- expression is expanded.
3124 elsif N = ThenX then
3125 if Present (Then_Actions (P)) then
3126 Insert_List_After_And_Analyze
3127 (Last (Then_Actions (P)), Ins_Actions);
3129 Set_Then_Actions (P, Ins_Actions);
3130 Analyze_List (Then_Actions (P));
3135 -- Actions belong to the else expression, temporarily
3136 -- place them as Else_Actions of the conditional expr.
3137 -- They will be moved to the proper place later when
3138 -- the conditional expression is expanded.
3140 elsif N = ElseX then
3141 if Present (Else_Actions (P)) then
3142 Insert_List_After_And_Analyze
3143 (Last (Else_Actions (P)), Ins_Actions);
3145 Set_Else_Actions (P, Ins_Actions);
3146 Analyze_List (Else_Actions (P));
3151 -- Actions belong to the condition. In this case they are
3152 -- unconditionally executed, and so we can continue the
3153 -- search for the proper insert point.
3160 -- Alternative of case expression, we place the action in the
3161 -- Actions field of the case expression alternative, this will
3162 -- be handled when the case expression is expanded.
3164 when N_Case_Expression_Alternative =>
3165 if Present (Actions (P)) then
3166 Insert_List_After_And_Analyze
3167 (Last (Actions (P)), Ins_Actions);
3169 Set_Actions (P, Ins_Actions);
3170 Analyze_List (Actions (P));
3175 -- Case of appearing within an Expressions_With_Actions node. We
3176 -- prepend the actions to the list of actions already there, if
3177 -- the node has not been analyzed yet. Otherwise find insertion
3178 -- location further up the tree.
3180 when N_Expression_With_Actions =>
3181 if not Analyzed (P) then
3182 Prepend_List (Ins_Actions, Actions (P));
3186 -- Case of appearing in the condition of a while expression or
3187 -- elsif. We insert the actions into the Condition_Actions field.
3188 -- They will be moved further out when the while loop or elsif
3191 when N_Iteration_Scheme |
3194 if N = Condition (P) then
3195 if Present (Condition_Actions (P)) then
3196 Insert_List_After_And_Analyze
3197 (Last (Condition_Actions (P)), Ins_Actions);
3199 Set_Condition_Actions (P, Ins_Actions);
3201 -- Set the parent of the insert actions explicitly. This
3202 -- is not a syntactic field, but we need the parent field
3203 -- set, in particular so that freeze can understand that
3204 -- it is dealing with condition actions, and properly
3205 -- insert the freezing actions.
3207 Set_Parent (Ins_Actions, P);
3208 Analyze_List (Condition_Actions (P));
3214 -- Statements, declarations, pragmas, representation clauses
3219 N_Procedure_Call_Statement |
3220 N_Statement_Other_Than_Procedure_Call |
3226 -- Representation_Clause
3229 N_Attribute_Definition_Clause |
3230 N_Enumeration_Representation_Clause |
3231 N_Record_Representation_Clause |
3235 N_Abstract_Subprogram_Declaration |
3237 N_Exception_Declaration |
3238 N_Exception_Renaming_Declaration |
3239 N_Expression_Function |
3240 N_Formal_Abstract_Subprogram_Declaration |
3241 N_Formal_Concrete_Subprogram_Declaration |
3242 N_Formal_Object_Declaration |
3243 N_Formal_Type_Declaration |
3244 N_Full_Type_Declaration |
3245 N_Function_Instantiation |
3246 N_Generic_Function_Renaming_Declaration |
3247 N_Generic_Package_Declaration |
3248 N_Generic_Package_Renaming_Declaration |
3249 N_Generic_Procedure_Renaming_Declaration |
3250 N_Generic_Subprogram_Declaration |
3251 N_Implicit_Label_Declaration |
3252 N_Incomplete_Type_Declaration |
3253 N_Number_Declaration |
3254 N_Object_Declaration |
3255 N_Object_Renaming_Declaration |
3257 N_Package_Body_Stub |
3258 N_Package_Declaration |
3259 N_Package_Instantiation |
3260 N_Package_Renaming_Declaration |
3261 N_Private_Extension_Declaration |
3262 N_Private_Type_Declaration |
3263 N_Procedure_Instantiation |
3265 N_Protected_Body_Stub |
3266 N_Protected_Type_Declaration |
3267 N_Single_Task_Declaration |
3269 N_Subprogram_Body_Stub |
3270 N_Subprogram_Declaration |
3271 N_Subprogram_Renaming_Declaration |
3272 N_Subtype_Declaration |
3275 N_Task_Type_Declaration |
3277 -- Use clauses can appear in lists of declarations
3279 N_Use_Package_Clause |
3282 -- Freeze entity behaves like a declaration or statement
3286 -- Do not insert here if the item is not a list member (this
3287 -- happens for example with a triggering statement, and the
3288 -- proper approach is to insert before the entire select).
3290 if not Is_List_Member (P) then
3293 -- Do not insert if parent of P is an N_Component_Association
3294 -- node (i.e. we are in the context of an N_Aggregate or
3295 -- N_Extension_Aggregate node. In this case we want to insert
3296 -- before the entire aggregate.
3298 elsif Nkind (Parent (P)) = N_Component_Association then
3301 -- Do not insert if the parent of P is either an N_Variant node
3302 -- or an N_Record_Definition node, meaning in either case that
3303 -- P is a member of a component list, and that therefore the
3304 -- actions should be inserted outside the complete record
3307 elsif Nkind (Parent (P)) = N_Variant
3308 or else Nkind (Parent (P)) = N_Record_Definition
3312 -- Do not insert freeze nodes within the loop generated for
3313 -- an aggregate, because they may be elaborated too late for
3314 -- subsequent use in the back end: within a package spec the
3315 -- loop is part of the elaboration procedure and is only
3316 -- elaborated during the second pass.
3318 -- If the loop comes from source, or the entity is local to the
3319 -- loop itself it must remain within.
3321 elsif Nkind (Parent (P)) = N_Loop_Statement
3322 and then not Comes_From_Source (Parent (P))
3323 and then Nkind (First (Ins_Actions)) = N_Freeze_Entity
3325 Scope (Entity (First (Ins_Actions))) /= Current_Scope
3329 -- Otherwise we can go ahead and do the insertion
3331 elsif P = Wrapped_Node then
3332 Store_Before_Actions_In_Scope (Ins_Actions);
3336 Insert_List_Before_And_Analyze (P, Ins_Actions);
3340 -- A special case, N_Raise_xxx_Error can act either as a statement
3341 -- or a subexpression. We tell the difference by looking at the
3342 -- Etype. It is set to Standard_Void_Type in the statement case.
3345 N_Raise_xxx_Error =>
3346 if Etype (P) = Standard_Void_Type then
3347 if P = Wrapped_Node then
3348 Store_Before_Actions_In_Scope (Ins_Actions);
3350 Insert_List_Before_And_Analyze (P, Ins_Actions);
3355 -- In the subexpression case, keep climbing
3361 -- If a component association appears within a loop created for
3362 -- an array aggregate, attach the actions to the association so
3363 -- they can be subsequently inserted within the loop. For other
3364 -- component associations insert outside of the aggregate. For
3365 -- an association that will generate a loop, its Loop_Actions
3366 -- attribute is already initialized (see exp_aggr.adb).
3368 -- The list of loop_actions can in turn generate additional ones,
3369 -- that are inserted before the associated node. If the associated
3370 -- node is outside the aggregate, the new actions are collected
3371 -- at the end of the loop actions, to respect the order in which
3372 -- they are to be elaborated.
3375 N_Component_Association =>
3376 if Nkind (Parent (P)) = N_Aggregate
3377 and then Present (Loop_Actions (P))
3379 if Is_Empty_List (Loop_Actions (P)) then
3380 Set_Loop_Actions (P, Ins_Actions);
3381 Analyze_List (Ins_Actions);
3388 -- Check whether these actions were generated by a
3389 -- declaration that is part of the loop_ actions
3390 -- for the component_association.
3393 while Present (Decl) loop
3394 exit when Parent (Decl) = P
3395 and then Is_List_Member (Decl)
3397 List_Containing (Decl) = Loop_Actions (P);
3398 Decl := Parent (Decl);
3401 if Present (Decl) then
3402 Insert_List_Before_And_Analyze
3403 (Decl, Ins_Actions);
3405 Insert_List_After_And_Analyze
3406 (Last (Loop_Actions (P)), Ins_Actions);
3417 -- Another special case, an attribute denoting a procedure call
3420 N_Attribute_Reference =>
3421 if Is_Procedure_Attribute_Name (Attribute_Name (P)) then
3422 if P = Wrapped_Node then
3423 Store_Before_Actions_In_Scope (Ins_Actions);
3425 Insert_List_Before_And_Analyze (P, Ins_Actions);
3430 -- In the subexpression case, keep climbing
3436 -- A contract node should not belong to the tree
3439 raise Program_Error;
3441 -- For all other node types, keep climbing tree
3445 N_Accept_Alternative |
3446 N_Access_Definition |
3447 N_Access_Function_Definition |
3448 N_Access_Procedure_Definition |
3449 N_Access_To_Object_Definition |
3452 N_Aspect_Specification |
3454 N_Case_Statement_Alternative |
3455 N_Character_Literal |
3456 N_Compilation_Unit |
3457 N_Compilation_Unit_Aux |
3458 N_Component_Clause |
3459 N_Component_Declaration |
3460 N_Component_Definition |
3462 N_Constrained_Array_Definition |
3463 N_Decimal_Fixed_Point_Definition |
3464 N_Defining_Character_Literal |
3465 N_Defining_Identifier |
3466 N_Defining_Operator_Symbol |
3467 N_Defining_Program_Unit_Name |
3468 N_Delay_Alternative |
3469 N_Delta_Constraint |
3470 N_Derived_Type_Definition |
3472 N_Digits_Constraint |
3473 N_Discriminant_Association |
3474 N_Discriminant_Specification |
3476 N_Entry_Body_Formal_Part |
3477 N_Entry_Call_Alternative |
3478 N_Entry_Declaration |
3479 N_Entry_Index_Specification |
3480 N_Enumeration_Type_Definition |
3482 N_Exception_Handler |
3484 N_Explicit_Dereference |
3485 N_Extension_Aggregate |
3486 N_Floating_Point_Definition |
3487 N_Formal_Decimal_Fixed_Point_Definition |
3488 N_Formal_Derived_Type_Definition |
3489 N_Formal_Discrete_Type_Definition |
3490 N_Formal_Floating_Point_Definition |
3491 N_Formal_Modular_Type_Definition |
3492 N_Formal_Ordinary_Fixed_Point_Definition |
3493 N_Formal_Package_Declaration |
3494 N_Formal_Private_Type_Definition |
3495 N_Formal_Incomplete_Type_Definition |
3496 N_Formal_Signed_Integer_Type_Definition |
3498 N_Function_Specification |
3499 N_Generic_Association |
3500 N_Handled_Sequence_Of_Statements |
3503 N_Index_Or_Discriminant_Constraint |
3504 N_Indexed_Component |
3506 N_Iterator_Specification |
3509 N_Loop_Parameter_Specification |
3511 N_Modular_Type_Definition |
3537 N_Op_Shift_Right_Arithmetic |
3541 N_Ordinary_Fixed_Point_Definition |
3543 N_Package_Specification |
3544 N_Parameter_Association |
3545 N_Parameter_Specification |
3546 N_Pop_Constraint_Error_Label |
3547 N_Pop_Program_Error_Label |
3548 N_Pop_Storage_Error_Label |
3549 N_Pragma_Argument_Association |
3550 N_Procedure_Specification |
3551 N_Protected_Definition |
3552 N_Push_Constraint_Error_Label |
3553 N_Push_Program_Error_Label |
3554 N_Push_Storage_Error_Label |
3555 N_Qualified_Expression |
3556 N_Quantified_Expression |
3558 N_Range_Constraint |
3560 N_Real_Range_Specification |
3561 N_Record_Definition |
3563 N_SCIL_Dispatch_Table_Tag_Init |
3564 N_SCIL_Dispatching_Call |
3565 N_SCIL_Membership_Test |
3566 N_Selected_Component |
3567 N_Signed_Integer_Type_Definition |
3568 N_Single_Protected_Declaration |
3572 N_Subtype_Indication |
3575 N_Terminate_Alternative |
3576 N_Triggering_Alternative |
3578 N_Unchecked_Expression |
3579 N_Unchecked_Type_Conversion |
3580 N_Unconstrained_Array_Definition |
3585 N_Validate_Unchecked_Conversion |
3592 -- Make sure that inserted actions stay in the transient scope
3594 if P = Wrapped_Node then
3595 Store_Before_Actions_In_Scope (Ins_Actions);
3599 -- If we fall through above tests, keep climbing tree
3603 if Nkind (Parent (N)) = N_Subunit then
3605 -- This is the proper body corresponding to a stub. Insertion must
3606 -- be done at the point of the stub, which is in the declarative
3607 -- part of the parent unit.
3609 P := Corresponding_Stub (Parent (N));
3617 -- Version with check(s) suppressed
3619 procedure Insert_Actions
3620 (Assoc_Node : Node_Id;
3621 Ins_Actions : List_Id;
3622 Suppress : Check_Id)
3625 if Suppress = All_Checks then
3627 Svg : constant Suppress_Array := Scope_Suppress;
3629 Scope_Suppress := (others => True);
3630 Insert_Actions (Assoc_Node, Ins_Actions);
3631 Scope_Suppress := Svg;
3636 Svg : constant Boolean := Scope_Suppress (Suppress);
3638 Scope_Suppress (Suppress) := True;
3639 Insert_Actions (Assoc_Node, Ins_Actions);
3640 Scope_Suppress (Suppress) := Svg;
3645 --------------------------
3646 -- Insert_Actions_After --
3647 --------------------------
3649 procedure Insert_Actions_After
3650 (Assoc_Node : Node_Id;
3651 Ins_Actions : List_Id)
3654 if Scope_Is_Transient
3655 and then Assoc_Node = Node_To_Be_Wrapped
3657 Store_After_Actions_In_Scope (Ins_Actions);
3659 Insert_List_After_And_Analyze (Assoc_Node, Ins_Actions);
3661 end Insert_Actions_After;
3663 ---------------------------------
3664 -- Insert_Library_Level_Action --
3665 ---------------------------------
3667 procedure Insert_Library_Level_Action (N : Node_Id) is
3668 Aux : constant Node_Id := Aux_Decls_Node (Cunit (Main_Unit));
3671 Push_Scope (Cunit_Entity (Main_Unit));
3672 -- ??? should this be Current_Sem_Unit instead of Main_Unit?
3674 if No (Actions (Aux)) then
3675 Set_Actions (Aux, New_List (N));
3677 Append (N, Actions (Aux));
3682 end Insert_Library_Level_Action;
3684 ----------------------------------
3685 -- Insert_Library_Level_Actions --
3686 ----------------------------------
3688 procedure Insert_Library_Level_Actions (L : List_Id) is
3689 Aux : constant Node_Id := Aux_Decls_Node (Cunit (Main_Unit));
3692 if Is_Non_Empty_List (L) then
3693 Push_Scope (Cunit_Entity (Main_Unit));
3694 -- ??? should this be Current_Sem_Unit instead of Main_Unit?
3696 if No (Actions (Aux)) then
3697 Set_Actions (Aux, L);
3700 Insert_List_After_And_Analyze (Last (Actions (Aux)), L);
3705 end Insert_Library_Level_Actions;
3707 ----------------------
3708 -- Inside_Init_Proc --
3709 ----------------------
3711 function Inside_Init_Proc return Boolean is
3717 and then S /= Standard_Standard
3719 if Is_Init_Proc (S) then
3727 end Inside_Init_Proc;
3729 ----------------------------
3730 -- Is_All_Null_Statements --
3731 ----------------------------
3733 function Is_All_Null_Statements (L : List_Id) return Boolean is
3738 while Present (Stm) loop
3739 if Nkind (Stm) /= N_Null_Statement then
3747 end Is_All_Null_Statements;
3749 ------------------------------
3750 -- Is_Finalizable_Transient --
3751 ------------------------------
3753 function Is_Finalizable_Transient
3755 Rel_Node : Node_Id) return Boolean
3757 Obj_Id : constant Entity_Id := Defining_Identifier (Decl);
3758 Obj_Typ : constant Entity_Id := Base_Type (Etype (Obj_Id));
3759 Desig : Entity_Id := Obj_Typ;
3761 function Initialized_By_Access (Trans_Id : Entity_Id) return Boolean;
3762 -- Determine whether transient object Trans_Id is initialized either
3763 -- by a function call which returns an access type or simply renames
3766 function Initialized_By_Aliased_BIP_Func_Call
3767 (Trans_Id : Entity_Id) return Boolean;
3768 -- Determine whether transient object Trans_Id is initialized by a
3769 -- build-in-place function call where the BIPalloc parameter is of
3770 -- value 1 and BIPaccess is not null. This case creates an aliasing
3771 -- between the returned value and the value denoted by BIPaccess.
3774 (Trans_Id : Entity_Id;
3775 First_Stmt : Node_Id) return Boolean;
3776 -- Determine whether transient object Trans_Id has been renamed or
3777 -- aliased through 'reference in the statement list starting from
3780 function Is_Allocated (Trans_Id : Entity_Id) return Boolean;
3781 -- Determine whether transient object Trans_Id is allocated on the heap
3783 ---------------------------
3784 -- Initialized_By_Access --
3785 ---------------------------
3787 function Initialized_By_Access (Trans_Id : Entity_Id) return Boolean is
3788 Expr : constant Node_Id := Expression (Parent (Trans_Id));
3793 and then Nkind (Expr) /= N_Reference
3794 and then Is_Access_Type (Etype (Expr));
3795 end Initialized_By_Access;
3797 ------------------------------------------
3798 -- Initialized_By_Aliased_BIP_Func_Call --
3799 ------------------------------------------
3801 function Initialized_By_Aliased_BIP_Func_Call
3802 (Trans_Id : Entity_Id) return Boolean
3804 Call : Node_Id := Expression (Parent (Trans_Id));
3807 -- Build-in-place calls usually appear in 'reference format
3809 if Nkind (Call) = N_Reference then
3810 Call := Prefix (Call);
3813 if Is_Build_In_Place_Function_Call (Call) then
3815 Access_Nam : Name_Id := No_Name;
3816 Access_OK : Boolean := False;
3818 Alloc_Nam : Name_Id := No_Name;
3819 Alloc_OK : Boolean := False;
3821 Func_Id : Entity_Id;
3825 -- Examine all parameter associations of the function call
3827 Param := First (Parameter_Associations (Call));
3828 while Present (Param) loop
3829 if Nkind (Param) = N_Parameter_Association
3830 and then Nkind (Selector_Name (Param)) = N_Identifier
3832 Actual := Explicit_Actual_Parameter (Param);
3833 Formal := Selector_Name (Param);
3835 -- Construct the names of formals BIPaccess and BIPalloc
3836 -- using the function name retrieved from an arbitrary
3839 if Access_Nam = No_Name
3840 and then Alloc_Nam = No_Name
3841 and then Present (Entity (Formal))
3843 Func_Id := Scope (Entity (Formal));
3846 New_External_Name (Chars (Func_Id),
3847 BIP_Formal_Suffix (BIP_Object_Access));
3850 New_External_Name (Chars (Func_Id),
3851 BIP_Formal_Suffix (BIP_Alloc_Form));
3854 -- A match for BIPaccess => Temp has been found
3856 if Chars (Formal) = Access_Nam
3857 and then Nkind (Actual) /= N_Null
3862 -- A match for BIPalloc => 1 has been found
3864 if Chars (Formal) = Alloc_Nam
3865 and then Nkind (Actual) = N_Integer_Literal
3866 and then Intval (Actual) = Uint_1
3875 return Access_OK and then Alloc_OK;
3880 end Initialized_By_Aliased_BIP_Func_Call;
3887 (Trans_Id : Entity_Id;
3888 First_Stmt : Node_Id) return Boolean
3890 function Find_Renamed_Object (Ren_Decl : Node_Id) return Entity_Id;
3891 -- Given an object renaming declaration, retrieve the entity of the
3892 -- renamed name. Return Empty if the renamed name is anything other
3893 -- than a variable or a constant.
3895 -------------------------
3896 -- Find_Renamed_Object --
3897 -------------------------
3899 function Find_Renamed_Object (Ren_Decl : Node_Id) return Entity_Id is
3900 Ren_Obj : Node_Id := Empty;
3902 function Find_Object (N : Node_Id) return Traverse_Result;
3903 -- Try to detect an object which is either a constant or a
3910 function Find_Object (N : Node_Id) return Traverse_Result is
3912 -- Stop the search once a constant or a variable has been
3915 if Nkind (N) = N_Identifier
3916 and then Present (Entity (N))
3917 and then Ekind_In (Entity (N), E_Constant, E_Variable)
3919 Ren_Obj := Entity (N);
3926 procedure Search is new Traverse_Proc (Find_Object);
3930 Typ : constant Entity_Id := Etype (Defining_Identifier (Ren_Decl));
3932 -- Start of processing for Find_Renamed_Object
3935 -- Actions related to dispatching calls may appear as renamings of
3936 -- tags. Do not process this type of renaming because it does not
3937 -- use the actual value of the object.
3939 if not Is_RTE (Typ, RE_Tag_Ptr) then
3940 Search (Name (Ren_Decl));
3944 end Find_Renamed_Object;
3949 Ren_Obj : Entity_Id;
3952 -- Start of processing for Is_Aliased
3956 while Present (Stmt) loop
3957 if Nkind (Stmt) = N_Object_Declaration then
3958 Expr := Expression (Stmt);
3961 and then Nkind (Expr) = N_Reference
3962 and then Nkind (Prefix (Expr)) = N_Identifier
3963 and then Entity (Prefix (Expr)) = Trans_Id
3968 elsif Nkind (Stmt) = N_Object_Renaming_Declaration then
3969 Ren_Obj := Find_Renamed_Object (Stmt);
3971 if Present (Ren_Obj)
3972 and then Ren_Obj = Trans_Id
3988 function Is_Allocated (Trans_Id : Entity_Id) return Boolean is
3989 Expr : constant Node_Id := Expression (Parent (Trans_Id));
3992 Is_Access_Type (Etype (Trans_Id))
3993 and then Present (Expr)
3994 and then Nkind (Expr) = N_Allocator;
3997 -- Start of processing for Is_Finalizable_Transient
4000 -- Handle access types
4002 if Is_Access_Type (Desig) then
4003 Desig := Available_View (Designated_Type (Desig));
4007 Ekind_In (Obj_Id, E_Constant, E_Variable)
4008 and then Needs_Finalization (Desig)
4009 and then Requires_Transient_Scope (Desig)
4010 and then Nkind (Rel_Node) /= N_Simple_Return_Statement
4012 -- Do not consider renamed or 'reference-d transient objects because
4013 -- the act of renaming extends the object's lifetime.
4015 and then not Is_Aliased (Obj_Id, Decl)
4017 -- Do not consider transient objects allocated on the heap since
4018 -- they are attached to a finalization master.
4020 and then not Is_Allocated (Obj_Id)
4022 -- If the transient object is a pointer, check that it is not
4023 -- initialized by a function which returns a pointer or acts as a
4024 -- renaming of another pointer.
4027 (not Is_Access_Type (Obj_Typ)
4028 or else not Initialized_By_Access (Obj_Id))
4030 -- Do not consider transient objects which act as indirect aliases
4031 -- of build-in-place function results.
4033 and then not Initialized_By_Aliased_BIP_Func_Call (Obj_Id)
4035 -- Do not consider conversions of tags to class-wide types
4037 and then not Is_Tag_To_CW_Conversion (Obj_Id);
4038 end Is_Finalizable_Transient;
4040 ---------------------------------
4041 -- Is_Fully_Repped_Tagged_Type --
4042 ---------------------------------
4044 function Is_Fully_Repped_Tagged_Type (T : Entity_Id) return Boolean is
4045 U : constant Entity_Id := Underlying_Type (T);
4049 if No (U) or else not Is_Tagged_Type (U) then
4051 elsif Has_Discriminants (U) then
4053 elsif not Has_Specified_Layout (U) then
4057 -- Here we have a tagged type, see if it has any unlayed out fields
4058 -- other than a possible tag and parent fields. If so, we return False.
4060 Comp := First_Component (U);
4061 while Present (Comp) loop
4062 if not Is_Tag (Comp)
4063 and then Chars (Comp) /= Name_uParent
4064 and then No (Component_Clause (Comp))
4068 Next_Component (Comp);
4072 -- All components are layed out
4075 end Is_Fully_Repped_Tagged_Type;
4077 ----------------------------------
4078 -- Is_Library_Level_Tagged_Type --
4079 ----------------------------------
4081 function Is_Library_Level_Tagged_Type (Typ : Entity_Id) return Boolean is
4083 return Is_Tagged_Type (Typ)
4084 and then Is_Library_Level_Entity (Typ);
4085 end Is_Library_Level_Tagged_Type;
4087 ----------------------------------
4088 -- Is_Null_Access_BIP_Func_Call --
4089 ----------------------------------
4091 function Is_Null_Access_BIP_Func_Call (Expr : Node_Id) return Boolean is
4092 Call : Node_Id := Expr;
4095 -- Build-in-place calls usually appear in 'reference format
4097 if Nkind (Call) = N_Reference then
4098 Call := Prefix (Call);
4101 if Nkind_In (Call, N_Qualified_Expression,
4102 N_Unchecked_Type_Conversion)
4104 Call := Expression (Call);
4107 if Is_Build_In_Place_Function_Call (Call) then
4109 Access_Nam : Name_Id := No_Name;
4115 -- Examine all parameter associations of the function call
4117 Param := First (Parameter_Associations (Call));
4118 while Present (Param) loop
4119 if Nkind (Param) = N_Parameter_Association
4120 and then Nkind (Selector_Name (Param)) = N_Identifier
4122 Formal := Selector_Name (Param);
4123 Actual := Explicit_Actual_Parameter (Param);
4125 -- Construct the name of formal BIPaccess. It is much easier
4126 -- to extract the name of the function using an arbitrary
4127 -- formal's scope rather than the Name field of Call.
4129 if Access_Nam = No_Name
4130 and then Present (Entity (Formal))
4134 (Chars (Scope (Entity (Formal))),
4135 BIP_Formal_Suffix (BIP_Object_Access));
4138 -- A match for BIPaccess => null has been found
4140 if Chars (Formal) = Access_Nam
4141 and then Nkind (Actual) = N_Null
4153 end Is_Null_Access_BIP_Func_Call;
4155 --------------------------
4156 -- Is_Non_BIP_Func_Call --
4157 --------------------------
4159 function Is_Non_BIP_Func_Call (Expr : Node_Id) return Boolean is
4161 -- The expected call is of the format
4163 -- Func_Call'reference
4166 Nkind (Expr) = N_Reference
4167 and then Nkind (Prefix (Expr)) = N_Function_Call
4168 and then not Is_Build_In_Place_Function_Call (Prefix (Expr));
4169 end Is_Non_BIP_Func_Call;
4171 ----------------------------------
4172 -- Is_Possibly_Unaligned_Object --
4173 ----------------------------------
4175 function Is_Possibly_Unaligned_Object (N : Node_Id) return Boolean is
4176 T : constant Entity_Id := Etype (N);
4179 -- If renamed object, apply test to underlying object
4181 if Is_Entity_Name (N)
4182 and then Is_Object (Entity (N))
4183 and then Present (Renamed_Object (Entity (N)))
4185 return Is_Possibly_Unaligned_Object (Renamed_Object (Entity (N)));
4188 -- Tagged and controlled types and aliased types are always aligned, as
4189 -- are concurrent types.
4192 or else Has_Controlled_Component (T)
4193 or else Is_Concurrent_Type (T)
4194 or else Is_Tagged_Type (T)
4195 or else Is_Controlled (T)
4200 -- If this is an element of a packed array, may be unaligned
4202 if Is_Ref_To_Bit_Packed_Array (N) then
4206 -- Case of component reference
4208 if Nkind (N) = N_Selected_Component then
4210 P : constant Node_Id := Prefix (N);
4211 C : constant Entity_Id := Entity (Selector_Name (N));
4216 -- If component reference is for an array with non-static bounds,
4217 -- then it is always aligned: we can only process unaligned arrays
4218 -- with static bounds (more precisely compile time known bounds).
4220 if Is_Array_Type (T)
4221 and then not Compile_Time_Known_Bounds (T)
4226 -- If component is aliased, it is definitely properly aligned
4228 if Is_Aliased (C) then
4232 -- If component is for a type implemented as a scalar, and the
4233 -- record is packed, and the component is other than the first
4234 -- component of the record, then the component may be unaligned.
4236 if Is_Packed (Etype (P))
4237 and then Represented_As_Scalar (Etype (C))
4238 and then First_Entity (Scope (C)) /= C
4243 -- Compute maximum possible alignment for T
4245 -- If alignment is known, then that settles things
4247 if Known_Alignment (T) then
4248 M := UI_To_Int (Alignment (T));
4250 -- If alignment is not known, tentatively set max alignment
4253 M := Ttypes.Maximum_Alignment;
4255 -- We can reduce this if the Esize is known since the default
4256 -- alignment will never be more than the smallest power of 2
4257 -- that does not exceed this Esize value.
4259 if Known_Esize (T) then
4260 S := UI_To_Int (Esize (T));
4262 while (M / 2) >= S loop
4268 -- The following code is historical, it used to be present but it
4269 -- is too cautious, because the front-end does not know the proper
4270 -- default alignments for the target. Also, if the alignment is
4271 -- not known, the front end can't know in any case! If a copy is
4272 -- needed, the back-end will take care of it. This whole section
4273 -- including this comment can be removed later ???
4275 -- If the component reference is for a record that has a specified
4276 -- alignment, and we either know it is too small, or cannot tell,
4277 -- then the component may be unaligned.
4279 -- What is the following commented out code ???
4281 -- if Known_Alignment (Etype (P))
4282 -- and then Alignment (Etype (P)) < Ttypes.Maximum_Alignment
4283 -- and then M > Alignment (Etype (P))
4288 -- Case of component clause present which may specify an
4289 -- unaligned position.
4291 if Present (Component_Clause (C)) then
4293 -- Otherwise we can do a test to make sure that the actual
4294 -- start position in the record, and the length, are both
4295 -- consistent with the required alignment. If not, we know
4296 -- that we are unaligned.
4299 Align_In_Bits : constant Nat := M * System_Storage_Unit;
4301 if Component_Bit_Offset (C) mod Align_In_Bits /= 0
4302 or else Esize (C) mod Align_In_Bits /= 0
4309 -- Otherwise, for a component reference, test prefix
4311 return Is_Possibly_Unaligned_Object (P);
4314 -- If not a component reference, must be aligned
4319 end Is_Possibly_Unaligned_Object;
4321 ---------------------------------
4322 -- Is_Possibly_Unaligned_Slice --
4323 ---------------------------------
4325 function Is_Possibly_Unaligned_Slice (N : Node_Id) return Boolean is
4327 -- Go to renamed object
4329 if Is_Entity_Name (N)
4330 and then Is_Object (Entity (N))
4331 and then Present (Renamed_Object (Entity (N)))
4333 return Is_Possibly_Unaligned_Slice (Renamed_Object (Entity (N)));
4336 -- The reference must be a slice
4338 if Nkind (N) /= N_Slice then
4342 -- Always assume the worst for a nested record component with a
4343 -- component clause, which gigi/gcc does not appear to handle well.
4344 -- It is not clear why this special test is needed at all ???
4346 if Nkind (Prefix (N)) = N_Selected_Component
4347 and then Nkind (Prefix (Prefix (N))) = N_Selected_Component
4349 Present (Component_Clause (Entity (Selector_Name (Prefix (N)))))
4354 -- We only need to worry if the target has strict alignment
4356 if not Target_Strict_Alignment then
4360 -- If it is a slice, then look at the array type being sliced
4363 Sarr : constant Node_Id := Prefix (N);
4364 -- Prefix of the slice, i.e. the array being sliced
4366 Styp : constant Entity_Id := Etype (Prefix (N));
4367 -- Type of the array being sliced
4373 -- The problems arise if the array object that is being sliced
4374 -- is a component of a record or array, and we cannot guarantee
4375 -- the alignment of the array within its containing object.
4377 -- To investigate this, we look at successive prefixes to see
4378 -- if we have a worrisome indexed or selected component.
4382 -- Case of array is part of an indexed component reference
4384 if Nkind (Pref) = N_Indexed_Component then
4385 Ptyp := Etype (Prefix (Pref));
4387 -- The only problematic case is when the array is packed, in
4388 -- which case we really know nothing about the alignment of
4389 -- individual components.
4391 if Is_Bit_Packed_Array (Ptyp) then
4395 -- Case of array is part of a selected component reference
4397 elsif Nkind (Pref) = N_Selected_Component then
4398 Ptyp := Etype (Prefix (Pref));
4400 -- We are definitely in trouble if the record in question
4401 -- has an alignment, and either we know this alignment is
4402 -- inconsistent with the alignment of the slice, or we don't
4403 -- know what the alignment of the slice should be.
4405 if Known_Alignment (Ptyp)
4406 and then (Unknown_Alignment (Styp)
4407 or else Alignment (Styp) > Alignment (Ptyp))
4412 -- We are in potential trouble if the record type is packed.
4413 -- We could special case when we know that the array is the
4414 -- first component, but that's not such a simple case ???
4416 if Is_Packed (Ptyp) then
4420 -- We are in trouble if there is a component clause, and
4421 -- either we do not know the alignment of the slice, or
4422 -- the alignment of the slice is inconsistent with the
4423 -- bit position specified by the component clause.
4426 Field : constant Entity_Id := Entity (Selector_Name (Pref));
4428 if Present (Component_Clause (Field))
4430 (Unknown_Alignment (Styp)
4432 (Component_Bit_Offset (Field) mod
4433 (System_Storage_Unit * Alignment (Styp))) /= 0)
4439 -- For cases other than selected or indexed components we know we
4440 -- are OK, since no issues arise over alignment.
4446 -- We processed an indexed component or selected component
4447 -- reference that looked safe, so keep checking prefixes.
4449 Pref := Prefix (Pref);
4452 end Is_Possibly_Unaligned_Slice;
4454 -------------------------------
4455 -- Is_Related_To_Func_Return --
4456 -------------------------------
4458 function Is_Related_To_Func_Return (Id : Entity_Id) return Boolean is
4459 Expr : constant Node_Id := Related_Expression (Id);
4463 and then Nkind (Expr) = N_Explicit_Dereference
4464 and then Nkind (Parent (Expr)) = N_Simple_Return_Statement;
4465 end Is_Related_To_Func_Return;
4467 --------------------------------
4468 -- Is_Ref_To_Bit_Packed_Array --
4469 --------------------------------
4471 function Is_Ref_To_Bit_Packed_Array (N : Node_Id) return Boolean is
4476 if Is_Entity_Name (N)
4477 and then Is_Object (Entity (N))
4478 and then Present (Renamed_Object (Entity (N)))
4480 return Is_Ref_To_Bit_Packed_Array (Renamed_Object (Entity (N)));
4483 if Nkind (N) = N_Indexed_Component
4485 Nkind (N) = N_Selected_Component
4487 if Is_Bit_Packed_Array (Etype (Prefix (N))) then
4490 Result := Is_Ref_To_Bit_Packed_Array (Prefix (N));
4493 if Result and then Nkind (N) = N_Indexed_Component then
4494 Expr := First (Expressions (N));
4495 while Present (Expr) loop
4496 Force_Evaluation (Expr);
4506 end Is_Ref_To_Bit_Packed_Array;
4508 --------------------------------
4509 -- Is_Ref_To_Bit_Packed_Slice --
4510 --------------------------------
4512 function Is_Ref_To_Bit_Packed_Slice (N : Node_Id) return Boolean is
4514 if Nkind (N) = N_Type_Conversion then
4515 return Is_Ref_To_Bit_Packed_Slice (Expression (N));
4517 elsif Is_Entity_Name (N)
4518 and then Is_Object (Entity (N))
4519 and then Present (Renamed_Object (Entity (N)))
4521 return Is_Ref_To_Bit_Packed_Slice (Renamed_Object (Entity (N)));
4523 elsif Nkind (N) = N_Slice
4524 and then Is_Bit_Packed_Array (Etype (Prefix (N)))
4528 elsif Nkind (N) = N_Indexed_Component
4530 Nkind (N) = N_Selected_Component
4532 return Is_Ref_To_Bit_Packed_Slice (Prefix (N));
4537 end Is_Ref_To_Bit_Packed_Slice;
4539 -----------------------
4540 -- Is_Renamed_Object --
4541 -----------------------
4543 function Is_Renamed_Object (N : Node_Id) return Boolean is
4544 Pnod : constant Node_Id := Parent (N);
4545 Kind : constant Node_Kind := Nkind (Pnod);
4547 if Kind = N_Object_Renaming_Declaration then
4549 elsif Nkind_In (Kind, N_Indexed_Component, N_Selected_Component) then
4550 return Is_Renamed_Object (Pnod);
4554 end Is_Renamed_Object;
4556 -----------------------------
4557 -- Is_Tag_To_CW_Conversion --
4558 -----------------------------
4560 function Is_Tag_To_CW_Conversion (Obj_Id : Entity_Id) return Boolean is
4561 Expr : constant Node_Id := Expression (Parent (Obj_Id));
4565 Is_Class_Wide_Type (Etype (Obj_Id))
4566 and then Present (Expr)
4567 and then Nkind (Expr) = N_Unchecked_Type_Conversion
4568 and then Etype (Expression (Expr)) = RTE (RE_Tag);
4569 end Is_Tag_To_CW_Conversion;
4571 ----------------------------
4572 -- Is_Untagged_Derivation --
4573 ----------------------------
4575 function Is_Untagged_Derivation (T : Entity_Id) return Boolean is
4577 return (not Is_Tagged_Type (T) and then Is_Derived_Type (T))
4579 (Is_Private_Type (T) and then Present (Full_View (T))
4580 and then not Is_Tagged_Type (Full_View (T))
4581 and then Is_Derived_Type (Full_View (T))
4582 and then Etype (Full_View (T)) /= T);
4583 end Is_Untagged_Derivation;
4585 ---------------------------
4586 -- Is_Volatile_Reference --
4587 ---------------------------
4589 function Is_Volatile_Reference (N : Node_Id) return Boolean is
4591 if Nkind (N) in N_Has_Etype
4592 and then Present (Etype (N))
4593 and then Treat_As_Volatile (Etype (N))
4597 elsif Is_Entity_Name (N) then
4598 return Treat_As_Volatile (Entity (N));
4600 elsif Nkind (N) = N_Slice then
4601 return Is_Volatile_Reference (Prefix (N));
4603 elsif Nkind_In (N, N_Indexed_Component, N_Selected_Component) then
4604 if (Is_Entity_Name (Prefix (N))
4605 and then Has_Volatile_Components (Entity (Prefix (N))))
4606 or else (Present (Etype (Prefix (N)))
4607 and then Has_Volatile_Components (Etype (Prefix (N))))
4611 return Is_Volatile_Reference (Prefix (N));
4617 end Is_Volatile_Reference;
4619 --------------------------
4620 -- Is_VM_By_Copy_Actual --
4621 --------------------------
4623 function Is_VM_By_Copy_Actual (N : Node_Id) return Boolean is
4625 return VM_Target /= No_VM
4626 and then (Nkind (N) = N_Slice
4628 (Nkind (N) = N_Identifier
4629 and then Present (Renamed_Object (Entity (N)))
4630 and then Nkind (Renamed_Object (Entity (N)))
4632 end Is_VM_By_Copy_Actual;
4634 --------------------
4635 -- Kill_Dead_Code --
4636 --------------------
4638 procedure Kill_Dead_Code (N : Node_Id; Warn : Boolean := False) is
4639 W : Boolean := Warn;
4640 -- Set False if warnings suppressed
4644 Remove_Warning_Messages (N);
4646 -- Generate warning if appropriate
4650 -- We suppress the warning if this code is under control of an
4651 -- if statement, whose condition is a simple identifier, and
4652 -- either we are in an instance, or warnings off is set for this
4653 -- identifier. The reason for killing it in the instance case is
4654 -- that it is common and reasonable for code to be deleted in
4655 -- instances for various reasons.
4657 if Nkind (Parent (N)) = N_If_Statement then
4659 C : constant Node_Id := Condition (Parent (N));
4661 if Nkind (C) = N_Identifier
4664 or else (Present (Entity (C))
4665 and then Has_Warnings_Off (Entity (C))))
4672 -- Generate warning if not suppressed
4676 ("?this code can never be executed and has been deleted!", N);
4680 -- Recurse into block statements and bodies to process declarations
4683 if Nkind (N) = N_Block_Statement
4684 or else Nkind (N) = N_Subprogram_Body
4685 or else Nkind (N) = N_Package_Body
4687 Kill_Dead_Code (Declarations (N), False);
4688 Kill_Dead_Code (Statements (Handled_Statement_Sequence (N)));
4690 if Nkind (N) = N_Subprogram_Body then
4691 Set_Is_Eliminated (Defining_Entity (N));
4694 elsif Nkind (N) = N_Package_Declaration then
4695 Kill_Dead_Code (Visible_Declarations (Specification (N)));
4696 Kill_Dead_Code (Private_Declarations (Specification (N)));
4698 -- ??? After this point, Delete_Tree has been called on all
4699 -- declarations in Specification (N), so references to entities
4700 -- therein look suspicious.
4703 E : Entity_Id := First_Entity (Defining_Entity (N));
4705 while Present (E) loop
4706 if Ekind (E) = E_Operator then
4707 Set_Is_Eliminated (E);
4714 -- Recurse into composite statement to kill individual statements in
4715 -- particular instantiations.
4717 elsif Nkind (N) = N_If_Statement then
4718 Kill_Dead_Code (Then_Statements (N));
4719 Kill_Dead_Code (Elsif_Parts (N));
4720 Kill_Dead_Code (Else_Statements (N));
4722 elsif Nkind (N) = N_Loop_Statement then
4723 Kill_Dead_Code (Statements (N));
4725 elsif Nkind (N) = N_Case_Statement then
4729 Alt := First (Alternatives (N));
4730 while Present (Alt) loop
4731 Kill_Dead_Code (Statements (Alt));
4736 elsif Nkind (N) = N_Case_Statement_Alternative then
4737 Kill_Dead_Code (Statements (N));
4739 -- Deal with dead instances caused by deleting instantiations
4741 elsif Nkind (N) in N_Generic_Instantiation then
4742 Remove_Dead_Instance (N);
4747 -- Case where argument is a list of nodes to be killed
4749 procedure Kill_Dead_Code (L : List_Id; Warn : Boolean := False) is
4754 if Is_Non_Empty_List (L) then
4756 while Present (N) loop
4757 Kill_Dead_Code (N, W);
4764 ------------------------
4765 -- Known_Non_Negative --
4766 ------------------------
4768 function Known_Non_Negative (Opnd : Node_Id) return Boolean is
4770 if Is_OK_Static_Expression (Opnd)
4771 and then Expr_Value (Opnd) >= 0
4777 Lo : constant Node_Id := Type_Low_Bound (Etype (Opnd));
4781 Is_OK_Static_Expression (Lo) and then Expr_Value (Lo) >= 0;
4784 end Known_Non_Negative;
4786 --------------------
4787 -- Known_Non_Null --
4788 --------------------
4790 function Known_Non_Null (N : Node_Id) return Boolean is
4792 -- Checks for case where N is an entity reference
4794 if Is_Entity_Name (N) and then Present (Entity (N)) then
4796 E : constant Entity_Id := Entity (N);
4801 -- First check if we are in decisive conditional
4803 Get_Current_Value_Condition (N, Op, Val);
4805 if Known_Null (Val) then
4806 if Op = N_Op_Eq then
4808 elsif Op = N_Op_Ne then
4813 -- If OK to do replacement, test Is_Known_Non_Null flag
4815 if OK_To_Do_Constant_Replacement (E) then
4816 return Is_Known_Non_Null (E);
4818 -- Otherwise if not safe to do replacement, then say so
4825 -- True if access attribute
4827 elsif Nkind (N) = N_Attribute_Reference
4828 and then (Attribute_Name (N) = Name_Access
4830 Attribute_Name (N) = Name_Unchecked_Access
4832 Attribute_Name (N) = Name_Unrestricted_Access)
4836 -- True if allocator
4838 elsif Nkind (N) = N_Allocator then
4841 -- For a conversion, true if expression is known non-null
4843 elsif Nkind (N) = N_Type_Conversion then
4844 return Known_Non_Null (Expression (N));
4846 -- Above are all cases where the value could be determined to be
4847 -- non-null. In all other cases, we don't know, so return False.
4858 function Known_Null (N : Node_Id) return Boolean is
4860 -- Checks for case where N is an entity reference
4862 if Is_Entity_Name (N) and then Present (Entity (N)) then
4864 E : constant Entity_Id := Entity (N);
4869 -- Constant null value is for sure null
4871 if Ekind (E) = E_Constant
4872 and then Known_Null (Constant_Value (E))
4877 -- First check if we are in decisive conditional
4879 Get_Current_Value_Condition (N, Op, Val);
4881 if Known_Null (Val) then
4882 if Op = N_Op_Eq then
4884 elsif Op = N_Op_Ne then
4889 -- If OK to do replacement, test Is_Known_Null flag
4891 if OK_To_Do_Constant_Replacement (E) then
4892 return Is_Known_Null (E);
4894 -- Otherwise if not safe to do replacement, then say so
4901 -- True if explicit reference to null
4903 elsif Nkind (N) = N_Null then
4906 -- For a conversion, true if expression is known null
4908 elsif Nkind (N) = N_Type_Conversion then
4909 return Known_Null (Expression (N));
4911 -- Above are all cases where the value could be determined to be null.
4912 -- In all other cases, we don't know, so return False.
4919 -----------------------------
4920 -- Make_CW_Equivalent_Type --
4921 -----------------------------
4923 -- Create a record type used as an equivalent of any member of the class
4924 -- which takes its size from exp.
4926 -- Generate the following code:
4928 -- type Equiv_T is record
4929 -- _parent : T (List of discriminant constraints taken from Exp);
4930 -- Ext__50 : Storage_Array (1 .. (Exp'size - Typ'object_size)/8);
4933 -- ??? Note that this type does not guarantee same alignment as all
4936 function Make_CW_Equivalent_Type
4938 E : Node_Id) return Entity_Id
4940 Loc : constant Source_Ptr := Sloc (E);
4941 Root_Typ : constant Entity_Id := Root_Type (T);
4942 List_Def : constant List_Id := Empty_List;
4943 Comp_List : constant List_Id := New_List;
4944 Equiv_Type : Entity_Id;
4945 Range_Type : Entity_Id;
4946 Str_Type : Entity_Id;
4947 Constr_Root : Entity_Id;
4951 -- If the root type is already constrained, there are no discriminants
4952 -- in the expression.
4954 if not Has_Discriminants (Root_Typ)
4955 or else Is_Constrained (Root_Typ)
4957 Constr_Root := Root_Typ;
4959 Constr_Root := Make_Temporary (Loc, 'R');
4961 -- subtype cstr__n is T (List of discr constraints taken from Exp)
4963 Append_To (List_Def,
4964 Make_Subtype_Declaration (Loc,
4965 Defining_Identifier => Constr_Root,
4966 Subtype_Indication => Make_Subtype_From_Expr (E, Root_Typ)));
4969 -- Generate the range subtype declaration
4971 Range_Type := Make_Temporary (Loc, 'G');
4973 if not Is_Interface (Root_Typ) then
4975 -- subtype rg__xx is
4976 -- Storage_Offset range 1 .. (Expr'size - typ'size) / Storage_Unit
4979 Make_Op_Subtract (Loc,
4981 Make_Attribute_Reference (Loc,
4983 OK_Convert_To (T, Duplicate_Subexpr_No_Checks (E)),
4984 Attribute_Name => Name_Size),
4986 Make_Attribute_Reference (Loc,
4987 Prefix => New_Reference_To (Constr_Root, Loc),
4988 Attribute_Name => Name_Object_Size));
4990 -- subtype rg__xx is
4991 -- Storage_Offset range 1 .. Expr'size / Storage_Unit
4994 Make_Attribute_Reference (Loc,
4996 OK_Convert_To (T, Duplicate_Subexpr_No_Checks (E)),
4997 Attribute_Name => Name_Size);
5000 Set_Paren_Count (Sizexpr, 1);
5002 Append_To (List_Def,
5003 Make_Subtype_Declaration (Loc,
5004 Defining_Identifier => Range_Type,
5005 Subtype_Indication =>
5006 Make_Subtype_Indication (Loc,
5007 Subtype_Mark => New_Reference_To (RTE (RE_Storage_Offset), Loc),
5008 Constraint => Make_Range_Constraint (Loc,
5011 Low_Bound => Make_Integer_Literal (Loc, 1),
5013 Make_Op_Divide (Loc,
5014 Left_Opnd => Sizexpr,
5015 Right_Opnd => Make_Integer_Literal (Loc,
5016 Intval => System_Storage_Unit)))))));
5018 -- subtype str__nn is Storage_Array (rg__x);
5020 Str_Type := Make_Temporary (Loc, 'S');
5021 Append_To (List_Def,
5022 Make_Subtype_Declaration (Loc,
5023 Defining_Identifier => Str_Type,
5024 Subtype_Indication =>
5025 Make_Subtype_Indication (Loc,
5026 Subtype_Mark => New_Reference_To (RTE (RE_Storage_Array), Loc),
5028 Make_Index_Or_Discriminant_Constraint (Loc,
5030 New_List (New_Reference_To (Range_Type, Loc))))));
5032 -- type Equiv_T is record
5033 -- [ _parent : Tnn; ]
5037 Equiv_Type := Make_Temporary (Loc, 'T');
5038 Set_Ekind (Equiv_Type, E_Record_Type);
5039 Set_Parent_Subtype (Equiv_Type, Constr_Root);
5041 -- Set Is_Class_Wide_Equivalent_Type very early to trigger the special
5042 -- treatment for this type. In particular, even though _parent's type
5043 -- is a controlled type or contains controlled components, we do not
5044 -- want to set Has_Controlled_Component on it to avoid making it gain
5045 -- an unwanted _controller component.
5047 Set_Is_Class_Wide_Equivalent_Type (Equiv_Type);
5049 if not Is_Interface (Root_Typ) then
5050 Append_To (Comp_List,
5051 Make_Component_Declaration (Loc,
5052 Defining_Identifier =>
5053 Make_Defining_Identifier (Loc, Name_uParent),
5054 Component_Definition =>
5055 Make_Component_Definition (Loc,
5056 Aliased_Present => False,
5057 Subtype_Indication => New_Reference_To (Constr_Root, Loc))));
5060 Append_To (Comp_List,
5061 Make_Component_Declaration (Loc,
5062 Defining_Identifier => Make_Temporary (Loc, 'C'),
5063 Component_Definition =>
5064 Make_Component_Definition (Loc,
5065 Aliased_Present => False,
5066 Subtype_Indication => New_Reference_To (Str_Type, Loc))));
5068 Append_To (List_Def,
5069 Make_Full_Type_Declaration (Loc,
5070 Defining_Identifier => Equiv_Type,
5072 Make_Record_Definition (Loc,
5074 Make_Component_List (Loc,
5075 Component_Items => Comp_List,
5076 Variant_Part => Empty))));
5078 -- Suppress all checks during the analysis of the expanded code to avoid
5079 -- the generation of spurious warnings under ZFP run-time.
5081 Insert_Actions (E, List_Def, Suppress => All_Checks);
5083 end Make_CW_Equivalent_Type;
5085 -------------------------
5086 -- Make_Invariant_Call --
5087 -------------------------
5089 function Make_Invariant_Call (Expr : Node_Id) return Node_Id is
5090 Loc : constant Source_Ptr := Sloc (Expr);
5091 Typ : constant Entity_Id := Etype (Expr);
5095 (Has_Invariants (Typ) and then Present (Invariant_Procedure (Typ)));
5097 if Check_Enabled (Name_Invariant)
5099 Check_Enabled (Name_Assertion)
5102 Make_Procedure_Call_Statement (Loc,
5104 New_Occurrence_Of (Invariant_Procedure (Typ), Loc),
5105 Parameter_Associations => New_List (Relocate_Node (Expr)));
5109 Make_Null_Statement (Loc);
5111 end Make_Invariant_Call;
5113 ------------------------
5114 -- Make_Literal_Range --
5115 ------------------------
5117 function Make_Literal_Range
5119 Literal_Typ : Entity_Id) return Node_Id
5121 Lo : constant Node_Id :=
5122 New_Copy_Tree (String_Literal_Low_Bound (Literal_Typ));
5123 Index : constant Entity_Id := Etype (Lo);
5126 Length_Expr : constant Node_Id :=
5127 Make_Op_Subtract (Loc,
5129 Make_Integer_Literal (Loc,
5130 Intval => String_Literal_Length (Literal_Typ)),
5132 Make_Integer_Literal (Loc, 1));
5135 Set_Analyzed (Lo, False);
5137 if Is_Integer_Type (Index) then
5140 Left_Opnd => New_Copy_Tree (Lo),
5141 Right_Opnd => Length_Expr);
5144 Make_Attribute_Reference (Loc,
5145 Attribute_Name => Name_Val,
5146 Prefix => New_Occurrence_Of (Index, Loc),
5147 Expressions => New_List (
5150 Make_Attribute_Reference (Loc,
5151 Attribute_Name => Name_Pos,
5152 Prefix => New_Occurrence_Of (Index, Loc),
5153 Expressions => New_List (New_Copy_Tree (Lo))),
5154 Right_Opnd => Length_Expr)));
5161 end Make_Literal_Range;
5163 --------------------------
5164 -- Make_Non_Empty_Check --
5165 --------------------------
5167 function Make_Non_Empty_Check
5169 N : Node_Id) return Node_Id
5175 Make_Attribute_Reference (Loc,
5176 Attribute_Name => Name_Length,
5177 Prefix => Duplicate_Subexpr_No_Checks (N, Name_Req => True)),
5179 Make_Integer_Literal (Loc, 0));
5180 end Make_Non_Empty_Check;
5182 -------------------------
5183 -- Make_Predicate_Call --
5184 -------------------------
5186 function Make_Predicate_Call
5188 Expr : Node_Id) return Node_Id
5190 Loc : constant Source_Ptr := Sloc (Expr);
5193 pragma Assert (Present (Predicate_Function (Typ)));
5196 Make_Function_Call (Loc,
5198 New_Occurrence_Of (Predicate_Function (Typ), Loc),
5199 Parameter_Associations => New_List (Relocate_Node (Expr)));
5200 end Make_Predicate_Call;
5202 --------------------------
5203 -- Make_Predicate_Check --
5204 --------------------------
5206 function Make_Predicate_Check
5208 Expr : Node_Id) return Node_Id
5210 Loc : constant Source_Ptr := Sloc (Expr);
5215 Pragma_Identifier => Make_Identifier (Loc, Name_Check),
5216 Pragma_Argument_Associations => New_List (
5217 Make_Pragma_Argument_Association (Loc,
5218 Expression => Make_Identifier (Loc, Name_Predicate)),
5219 Make_Pragma_Argument_Association (Loc,
5220 Expression => Make_Predicate_Call (Typ, Expr))));
5221 end Make_Predicate_Check;
5223 ----------------------------
5224 -- Make_Subtype_From_Expr --
5225 ----------------------------
5227 -- 1. If Expr is an unconstrained array expression, creates
5228 -- Unc_Type(Expr'first(1)..Expr'last(1),..., Expr'first(n)..Expr'last(n))
5230 -- 2. If Expr is a unconstrained discriminated type expression, creates
5231 -- Unc_Type(Expr.Discr1, ... , Expr.Discr_n)
5233 -- 3. If Expr is class-wide, creates an implicit class wide subtype
5235 function Make_Subtype_From_Expr
5237 Unc_Typ : Entity_Id) return Node_Id
5239 Loc : constant Source_Ptr := Sloc (E);
5240 List_Constr : constant List_Id := New_List;
5243 Full_Subtyp : Entity_Id;
5244 Priv_Subtyp : Entity_Id;
5249 if Is_Private_Type (Unc_Typ)
5250 and then Has_Unknown_Discriminants (Unc_Typ)
5252 -- Prepare the subtype completion, Go to base type to
5253 -- find underlying type, because the type may be a generic
5254 -- actual or an explicit subtype.
5256 Utyp := Underlying_Type (Base_Type (Unc_Typ));
5257 Full_Subtyp := Make_Temporary (Loc, 'C');
5259 Unchecked_Convert_To (Utyp, Duplicate_Subexpr_No_Checks (E));
5260 Set_Parent (Full_Exp, Parent (E));
5262 Priv_Subtyp := Make_Temporary (Loc, 'P');
5265 Make_Subtype_Declaration (Loc,
5266 Defining_Identifier => Full_Subtyp,
5267 Subtype_Indication => Make_Subtype_From_Expr (Full_Exp, Utyp)));
5269 -- Define the dummy private subtype
5271 Set_Ekind (Priv_Subtyp, Subtype_Kind (Ekind (Unc_Typ)));
5272 Set_Etype (Priv_Subtyp, Base_Type (Unc_Typ));
5273 Set_Scope (Priv_Subtyp, Full_Subtyp);
5274 Set_Is_Constrained (Priv_Subtyp);
5275 Set_Is_Tagged_Type (Priv_Subtyp, Is_Tagged_Type (Unc_Typ));
5276 Set_Is_Itype (Priv_Subtyp);
5277 Set_Associated_Node_For_Itype (Priv_Subtyp, E);
5279 if Is_Tagged_Type (Priv_Subtyp) then
5281 (Base_Type (Priv_Subtyp), Class_Wide_Type (Unc_Typ));
5282 Set_Direct_Primitive_Operations (Priv_Subtyp,
5283 Direct_Primitive_Operations (Unc_Typ));
5286 Set_Full_View (Priv_Subtyp, Full_Subtyp);
5288 return New_Reference_To (Priv_Subtyp, Loc);
5290 elsif Is_Array_Type (Unc_Typ) then
5291 for J in 1 .. Number_Dimensions (Unc_Typ) loop
5292 Append_To (List_Constr,
5295 Make_Attribute_Reference (Loc,
5296 Prefix => Duplicate_Subexpr_No_Checks (E),
5297 Attribute_Name => Name_First,
5298 Expressions => New_List (
5299 Make_Integer_Literal (Loc, J))),
5302 Make_Attribute_Reference (Loc,
5303 Prefix => Duplicate_Subexpr_No_Checks (E),
5304 Attribute_Name => Name_Last,
5305 Expressions => New_List (
5306 Make_Integer_Literal (Loc, J)))));
5309 elsif Is_Class_Wide_Type (Unc_Typ) then
5311 CW_Subtype : Entity_Id;
5312 EQ_Typ : Entity_Id := Empty;
5315 -- A class-wide equivalent type is not needed when VM_Target
5316 -- because the VM back-ends handle the class-wide object
5317 -- initialization itself (and doesn't need or want the
5318 -- additional intermediate type to handle the assignment).
5320 if Expander_Active and then Tagged_Type_Expansion then
5322 -- If this is the class_wide type of a completion that is a
5323 -- record subtype, set the type of the class_wide type to be
5324 -- the full base type, for use in the expanded code for the
5325 -- equivalent type. Should this be done earlier when the
5326 -- completion is analyzed ???
5328 if Is_Private_Type (Etype (Unc_Typ))
5330 Ekind (Full_View (Etype (Unc_Typ))) = E_Record_Subtype
5332 Set_Etype (Unc_Typ, Base_Type (Full_View (Etype (Unc_Typ))));
5335 EQ_Typ := Make_CW_Equivalent_Type (Unc_Typ, E);
5338 CW_Subtype := New_Class_Wide_Subtype (Unc_Typ, E);
5339 Set_Equivalent_Type (CW_Subtype, EQ_Typ);
5340 Set_Cloned_Subtype (CW_Subtype, Base_Type (Unc_Typ));
5342 return New_Occurrence_Of (CW_Subtype, Loc);
5345 -- Indefinite record type with discriminants
5348 D := First_Discriminant (Unc_Typ);
5349 while Present (D) loop
5350 Append_To (List_Constr,
5351 Make_Selected_Component (Loc,
5352 Prefix => Duplicate_Subexpr_No_Checks (E),
5353 Selector_Name => New_Reference_To (D, Loc)));
5355 Next_Discriminant (D);
5360 Make_Subtype_Indication (Loc,
5361 Subtype_Mark => New_Reference_To (Unc_Typ, Loc),
5363 Make_Index_Or_Discriminant_Constraint (Loc,
5364 Constraints => List_Constr));
5365 end Make_Subtype_From_Expr;
5367 -----------------------------
5368 -- May_Generate_Large_Temp --
5369 -----------------------------
5371 -- At the current time, the only types that we return False for (i.e. where
5372 -- we decide we know they cannot generate large temps) are ones where we
5373 -- know the size is 256 bits or less at compile time, and we are still not
5374 -- doing a thorough job on arrays and records ???
5376 function May_Generate_Large_Temp (Typ : Entity_Id) return Boolean is
5378 if not Size_Known_At_Compile_Time (Typ) then
5381 elsif Esize (Typ) /= 0 and then Esize (Typ) <= 256 then
5384 elsif Is_Array_Type (Typ)
5385 and then Present (Packed_Array_Type (Typ))
5387 return May_Generate_Large_Temp (Packed_Array_Type (Typ));
5389 -- We could do more here to find other small types ???
5394 end May_Generate_Large_Temp;
5396 ------------------------
5397 -- Needs_Finalization --
5398 ------------------------
5400 function Needs_Finalization (T : Entity_Id) return Boolean is
5401 function Has_Some_Controlled_Component (Rec : Entity_Id) return Boolean;
5402 -- If type is not frozen yet, check explicitly among its components,
5403 -- because the Has_Controlled_Component flag is not necessarily set.
5405 -----------------------------------
5406 -- Has_Some_Controlled_Component --
5407 -----------------------------------
5409 function Has_Some_Controlled_Component
5410 (Rec : Entity_Id) return Boolean
5415 if Has_Controlled_Component (Rec) then
5418 elsif not Is_Frozen (Rec) then
5419 if Is_Record_Type (Rec) then
5420 Comp := First_Entity (Rec);
5422 while Present (Comp) loop
5423 if not Is_Type (Comp)
5424 and then Needs_Finalization (Etype (Comp))
5434 elsif Is_Array_Type (Rec) then
5435 return Needs_Finalization (Component_Type (Rec));
5438 return Has_Controlled_Component (Rec);
5443 end Has_Some_Controlled_Component;
5445 -- Start of processing for Needs_Finalization
5448 -- Certain run-time configurations and targets do not provide support
5449 -- for controlled types.
5451 if Restriction_Active (No_Finalization) then
5454 -- C, C++, CIL and Java types are not considered controlled. It is
5455 -- assumed that the non-Ada side will handle their clean up.
5457 elsif Convention (T) = Convention_C
5458 or else Convention (T) = Convention_CIL
5459 or else Convention (T) = Convention_CPP
5460 or else Convention (T) = Convention_Java
5465 -- Class-wide types are treated as controlled because derivations
5466 -- from the root type can introduce controlled components.
5469 Is_Class_Wide_Type (T)
5470 or else Is_Controlled (T)
5471 or else Has_Controlled_Component (T)
5472 or else Has_Some_Controlled_Component (T)
5474 (Is_Concurrent_Type (T)
5475 and then Present (Corresponding_Record_Type (T))
5476 and then Needs_Finalization (Corresponding_Record_Type (T)));
5478 end Needs_Finalization;
5480 ----------------------------
5481 -- Needs_Constant_Address --
5482 ----------------------------
5484 function Needs_Constant_Address
5486 Typ : Entity_Id) return Boolean
5490 -- If we have no initialization of any kind, then we don't need to place
5491 -- any restrictions on the address clause, because the object will be
5492 -- elaborated after the address clause is evaluated. This happens if the
5493 -- declaration has no initial expression, or the type has no implicit
5494 -- initialization, or the object is imported.
5496 -- The same holds for all initialized scalar types and all access types.
5497 -- Packed bit arrays of size up to 64 are represented using a modular
5498 -- type with an initialization (to zero) and can be processed like other
5499 -- initialized scalar types.
5501 -- If the type is controlled, code to attach the object to a
5502 -- finalization chain is generated at the point of declaration, and
5503 -- therefore the elaboration of the object cannot be delayed: the
5504 -- address expression must be a constant.
5506 if No (Expression (Decl))
5507 and then not Needs_Finalization (Typ)
5509 (not Has_Non_Null_Base_Init_Proc (Typ)
5510 or else Is_Imported (Defining_Identifier (Decl)))
5514 elsif (Present (Expression (Decl)) and then Is_Scalar_Type (Typ))
5515 or else Is_Access_Type (Typ)
5517 (Is_Bit_Packed_Array (Typ)
5518 and then Is_Modular_Integer_Type (Packed_Array_Type (Typ)))
5524 -- Otherwise, we require the address clause to be constant because
5525 -- the call to the initialization procedure (or the attach code) has
5526 -- to happen at the point of the declaration.
5528 -- Actually the IP call has been moved to the freeze actions anyway,
5529 -- so maybe we can relax this restriction???
5533 end Needs_Constant_Address;
5535 ----------------------------
5536 -- New_Class_Wide_Subtype --
5537 ----------------------------
5539 function New_Class_Wide_Subtype
5540 (CW_Typ : Entity_Id;
5541 N : Node_Id) return Entity_Id
5543 Res : constant Entity_Id := Create_Itype (E_Void, N);
5544 Res_Name : constant Name_Id := Chars (Res);
5545 Res_Scope : constant Entity_Id := Scope (Res);
5548 Copy_Node (CW_Typ, Res);
5549 Set_Comes_From_Source (Res, False);
5550 Set_Sloc (Res, Sloc (N));
5552 Set_Associated_Node_For_Itype (Res, N);
5553 Set_Is_Public (Res, False); -- By default, may be changed below.
5554 Set_Public_Status (Res);
5555 Set_Chars (Res, Res_Name);
5556 Set_Scope (Res, Res_Scope);
5557 Set_Ekind (Res, E_Class_Wide_Subtype);
5558 Set_Next_Entity (Res, Empty);
5559 Set_Etype (Res, Base_Type (CW_Typ));
5560 Set_Is_Frozen (Res, False);
5561 Set_Freeze_Node (Res, Empty);
5563 end New_Class_Wide_Subtype;
5565 --------------------------------
5566 -- Non_Limited_Designated_Type --
5567 ---------------------------------
5569 function Non_Limited_Designated_Type (T : Entity_Id) return Entity_Id is
5570 Desig : constant Entity_Id := Designated_Type (T);
5572 if Ekind (Desig) = E_Incomplete_Type
5573 and then Present (Non_Limited_View (Desig))
5575 return Non_Limited_View (Desig);
5579 end Non_Limited_Designated_Type;
5581 -----------------------------------
5582 -- OK_To_Do_Constant_Replacement --
5583 -----------------------------------
5585 function OK_To_Do_Constant_Replacement (E : Entity_Id) return Boolean is
5586 ES : constant Entity_Id := Scope (E);
5590 -- Do not replace statically allocated objects, because they may be
5591 -- modified outside the current scope.
5593 if Is_Statically_Allocated (E) then
5596 -- Do not replace aliased or volatile objects, since we don't know what
5597 -- else might change the value.
5599 elsif Is_Aliased (E) or else Treat_As_Volatile (E) then
5602 -- Debug flag -gnatdM disconnects this optimization
5604 elsif Debug_Flag_MM then
5607 -- Otherwise check scopes
5610 CS := Current_Scope;
5613 -- If we are in right scope, replacement is safe
5618 -- Packages do not affect the determination of safety
5620 elsif Ekind (CS) = E_Package then
5621 exit when CS = Standard_Standard;
5624 -- Blocks do not affect the determination of safety
5626 elsif Ekind (CS) = E_Block then
5629 -- Loops do not affect the determination of safety. Note that we
5630 -- kill all current values on entry to a loop, so we are just
5631 -- talking about processing within a loop here.
5633 elsif Ekind (CS) = E_Loop then
5636 -- Otherwise, the reference is dubious, and we cannot be sure that
5637 -- it is safe to do the replacement.
5646 end OK_To_Do_Constant_Replacement;
5648 ------------------------------------
5649 -- Possible_Bit_Aligned_Component --
5650 ------------------------------------
5652 function Possible_Bit_Aligned_Component (N : Node_Id) return Boolean is
5656 -- Case of indexed component
5658 when N_Indexed_Component =>
5660 P : constant Node_Id := Prefix (N);
5661 Ptyp : constant Entity_Id := Etype (P);
5664 -- If we know the component size and it is less than 64, then
5665 -- we are definitely OK. The back end always does assignment of
5666 -- misaligned small objects correctly.
5668 if Known_Static_Component_Size (Ptyp)
5669 and then Component_Size (Ptyp) <= 64
5673 -- Otherwise, we need to test the prefix, to see if we are
5674 -- indexing from a possibly unaligned component.
5677 return Possible_Bit_Aligned_Component (P);
5681 -- Case of selected component
5683 when N_Selected_Component =>
5685 P : constant Node_Id := Prefix (N);
5686 Comp : constant Entity_Id := Entity (Selector_Name (N));
5689 -- If there is no component clause, then we are in the clear
5690 -- since the back end will never misalign a large component
5691 -- unless it is forced to do so. In the clear means we need
5692 -- only the recursive test on the prefix.
5694 if Component_May_Be_Bit_Aligned (Comp) then
5697 return Possible_Bit_Aligned_Component (P);
5701 -- For a slice, test the prefix, if that is possibly misaligned,
5702 -- then for sure the slice is!
5705 return Possible_Bit_Aligned_Component (Prefix (N));
5707 -- For an unchecked conversion, check whether the expression may
5710 when N_Unchecked_Type_Conversion =>
5711 return Possible_Bit_Aligned_Component (Expression (N));
5713 -- If we have none of the above, it means that we have fallen off the
5714 -- top testing prefixes recursively, and we now have a stand alone
5715 -- object, where we don't have a problem.
5721 end Possible_Bit_Aligned_Component;
5723 -----------------------------------------------
5724 -- Process_Statements_For_Controlled_Objects --
5725 -----------------------------------------------
5727 procedure Process_Statements_For_Controlled_Objects (N : Node_Id) is
5728 Loc : constant Source_Ptr := Sloc (N);
5730 function Are_Wrapped (L : List_Id) return Boolean;
5731 -- Determine whether list L contains only one statement which is a block
5733 function Wrap_Statements_In_Block (L : List_Id) return Node_Id;
5734 -- Given a list of statements L, wrap it in a block statement and return
5735 -- the generated node.
5741 function Are_Wrapped (L : List_Id) return Boolean is
5742 Stmt : constant Node_Id := First (L);
5746 and then No (Next (Stmt))
5747 and then Nkind (Stmt) = N_Block_Statement;
5750 ------------------------------
5751 -- Wrap_Statements_In_Block --
5752 ------------------------------
5754 function Wrap_Statements_In_Block (L : List_Id) return Node_Id is
5757 Make_Block_Statement (Loc,
5758 Declarations => No_List,
5759 Handled_Statement_Sequence =>
5760 Make_Handled_Sequence_Of_Statements (Loc,
5762 end Wrap_Statements_In_Block;
5768 -- Start of processing for Process_Statements_For_Controlled_Objects
5771 -- Whenever a non-handled statement list is wrapped in a block, the
5772 -- block must be explicitly analyzed to redecorate all entities in the
5773 -- list and ensure that a finalizer is properly built.
5778 N_Conditional_Entry_Call |
5779 N_Selective_Accept =>
5781 -- Check the "then statements" for elsif parts and if statements
5783 if Nkind_In (N, N_Elsif_Part, N_If_Statement)
5784 and then not Is_Empty_List (Then_Statements (N))
5785 and then not Are_Wrapped (Then_Statements (N))
5786 and then Requires_Cleanup_Actions
5787 (Then_Statements (N), False, False)
5789 Block := Wrap_Statements_In_Block (Then_Statements (N));
5790 Set_Then_Statements (N, New_List (Block));
5795 -- Check the "else statements" for conditional entry calls, if
5796 -- statements and selective accepts.
5798 if Nkind_In (N, N_Conditional_Entry_Call,
5801 and then not Is_Empty_List (Else_Statements (N))
5802 and then not Are_Wrapped (Else_Statements (N))
5803 and then Requires_Cleanup_Actions
5804 (Else_Statements (N), False, False)
5806 Block := Wrap_Statements_In_Block (Else_Statements (N));
5807 Set_Else_Statements (N, New_List (Block));
5812 when N_Abortable_Part |
5813 N_Accept_Alternative |
5814 N_Case_Statement_Alternative |
5815 N_Delay_Alternative |
5816 N_Entry_Call_Alternative |
5817 N_Exception_Handler |
5819 N_Triggering_Alternative =>
5821 if not Is_Empty_List (Statements (N))
5822 and then not Are_Wrapped (Statements (N))
5823 and then Requires_Cleanup_Actions (Statements (N), False, False)
5825 Block := Wrap_Statements_In_Block (Statements (N));
5826 Set_Statements (N, New_List (Block));
5834 end Process_Statements_For_Controlled_Objects;
5836 -------------------------
5837 -- Remove_Side_Effects --
5838 -------------------------
5840 procedure Remove_Side_Effects
5842 Name_Req : Boolean := False;
5843 Variable_Ref : Boolean := False)
5845 Loc : constant Source_Ptr := Sloc (Exp);
5846 Exp_Type : constant Entity_Id := Etype (Exp);
5847 Svg_Suppress : constant Suppress_Array := Scope_Suppress;
5849 Ref_Type : Entity_Id;
5851 Ptr_Typ_Decl : Node_Id;
5855 function Side_Effect_Free (N : Node_Id) return Boolean;
5856 -- Determines if the tree N represents an expression that is known not
5857 -- to have side effects, and for which no processing is required.
5859 function Side_Effect_Free (L : List_Id) return Boolean;
5860 -- Determines if all elements of the list L are side effect free
5862 function Safe_Prefixed_Reference (N : Node_Id) return Boolean;
5863 -- The argument N is a construct where the Prefix is dereferenced if it
5864 -- is an access type and the result is a variable. The call returns True
5865 -- if the construct is side effect free (not considering side effects in
5866 -- other than the prefix which are to be tested by the caller).
5868 function Within_In_Parameter (N : Node_Id) return Boolean;
5869 -- Determines if N is a subcomponent of a composite in-parameter. If so,
5870 -- N is not side-effect free when the actual is global and modifiable
5871 -- indirectly from within a subprogram, because it may be passed by
5872 -- reference. The front-end must be conservative here and assume that
5873 -- this may happen with any array or record type. On the other hand, we
5874 -- cannot create temporaries for all expressions for which this
5875 -- condition is true, for various reasons that might require clearing up
5876 -- ??? For example, discriminant references that appear out of place, or
5877 -- spurious type errors with class-wide expressions. As a result, we
5878 -- limit the transformation to loop bounds, which is so far the only
5879 -- case that requires it.
5881 -----------------------------
5882 -- Safe_Prefixed_Reference --
5883 -----------------------------
5885 function Safe_Prefixed_Reference (N : Node_Id) return Boolean is
5887 -- If prefix is not side effect free, definitely not safe
5889 if not Side_Effect_Free (Prefix (N)) then
5892 -- If the prefix is of an access type that is not access-to-constant,
5893 -- then this construct is a variable reference, which means it is to
5894 -- be considered to have side effects if Variable_Ref is set True.
5896 elsif Is_Access_Type (Etype (Prefix (N)))
5897 and then not Is_Access_Constant (Etype (Prefix (N)))
5898 and then Variable_Ref
5900 -- Exception is a prefix that is the result of a previous removal
5903 return Is_Entity_Name (Prefix (N))
5904 and then not Comes_From_Source (Prefix (N))
5905 and then Ekind (Entity (Prefix (N))) = E_Constant
5906 and then Is_Internal_Name (Chars (Entity (Prefix (N))));
5908 -- If the prefix is an explicit dereference then this construct is a
5909 -- variable reference, which means it is to be considered to have
5910 -- side effects if Variable_Ref is True.
5912 -- We do NOT exclude dereferences of access-to-constant types because
5913 -- we handle them as constant view of variables.
5915 elsif Nkind (Prefix (N)) = N_Explicit_Dereference
5916 and then Variable_Ref
5920 -- Note: The following test is the simplest way of solving a complex
5921 -- problem uncovered by the following test (Side effect on loop bound
5922 -- that is a subcomponent of a global variable:
5924 -- with Text_Io; use Text_Io;
5925 -- procedure Tloop is
5928 -- V : Natural := 4;
5929 -- S : String (1..5) := (others => 'a');
5936 -- with procedure Action;
5937 -- procedure Loop_G (Arg : X; Msg : String)
5939 -- procedure Loop_G (Arg : X; Msg : String) is
5941 -- Put_Line ("begin loop_g " & Msg & " will loop till: "
5942 -- & Natural'Image (Arg.V));
5943 -- for Index in 1 .. Arg.V loop
5945 -- (Natural'Image (Index) & " " & Arg.S (Index));
5946 -- if Index > 2 then
5950 -- Put_Line ("end loop_g " & Msg);
5953 -- procedure Loop1 is new Loop_G (Modi);
5954 -- procedure Modi is
5957 -- Loop1 (X1, "from modi");
5961 -- Loop1 (X1, "initial");
5964 -- The output of the above program should be:
5966 -- begin loop_g initial will loop till: 4
5970 -- begin loop_g from modi will loop till: 1
5972 -- end loop_g from modi
5974 -- begin loop_g from modi will loop till: 1
5976 -- end loop_g from modi
5977 -- end loop_g initial
5979 -- If a loop bound is a subcomponent of a global variable, a
5980 -- modification of that variable within the loop may incorrectly
5981 -- affect the execution of the loop.
5983 elsif Nkind (Parent (Parent (N))) = N_Loop_Parameter_Specification
5984 and then Within_In_Parameter (Prefix (N))
5985 and then Variable_Ref
5989 -- All other cases are side effect free
5994 end Safe_Prefixed_Reference;
5996 ----------------------
5997 -- Side_Effect_Free --
5998 ----------------------
6000 function Side_Effect_Free (N : Node_Id) return Boolean is
6002 -- Note on checks that could raise Constraint_Error. Strictly, if we
6003 -- take advantage of 11.6, these checks do not count as side effects.
6004 -- However, we would prefer to consider that they are side effects,
6005 -- since the backend CSE does not work very well on expressions which
6006 -- can raise Constraint_Error. On the other hand if we don't consider
6007 -- them to be side effect free, then we get some awkward expansions
6008 -- in -gnato mode, resulting in code insertions at a point where we
6009 -- do not have a clear model for performing the insertions.
6011 -- Special handling for entity names
6013 if Is_Entity_Name (N) then
6015 -- Variables are considered to be a side effect if Variable_Ref
6016 -- is set or if we have a volatile reference and Name_Req is off.
6017 -- If Name_Req is True then we can't help returning a name which
6018 -- effectively allows multiple references in any case.
6020 if Is_Variable (N, Use_Original_Node => False) then
6021 return not Variable_Ref
6022 and then (not Is_Volatile_Reference (N) or else Name_Req);
6024 -- Any other entity (e.g. a subtype name) is definitely side
6031 -- A value known at compile time is always side effect free
6033 elsif Compile_Time_Known_Value (N) then
6036 -- A variable renaming is not side-effect free, because the renaming
6037 -- will function like a macro in the front-end in some cases, and an
6038 -- assignment can modify the component designated by N, so we need to
6039 -- create a temporary for it.
6041 -- The guard testing for Entity being present is needed at least in
6042 -- the case of rewritten predicate expressions, and may well also be
6043 -- appropriate elsewhere. Obviously we can't go testing the entity
6044 -- field if it does not exist, so it's reasonable to say that this is
6045 -- not the renaming case if it does not exist.
6047 elsif Is_Entity_Name (Original_Node (N))
6048 and then Present (Entity (Original_Node (N)))
6049 and then Is_Renaming_Of_Object (Entity (Original_Node (N)))
6050 and then Ekind (Entity (Original_Node (N))) /= E_Constant
6054 -- Remove_Side_Effects generates an object renaming declaration to
6055 -- capture the expression of a class-wide expression. In VM targets
6056 -- the frontend performs no expansion for dispatching calls to
6057 -- class- wide types since they are handled by the VM. Hence, we must
6058 -- locate here if this node corresponds to a previous invocation of
6059 -- Remove_Side_Effects to avoid a never ending loop in the frontend.
6061 elsif VM_Target /= No_VM
6062 and then not Comes_From_Source (N)
6063 and then Nkind (Parent (N)) = N_Object_Renaming_Declaration
6064 and then Is_Class_Wide_Type (Etype (N))
6069 -- For other than entity names and compile time known values,
6070 -- check the node kind for special processing.
6074 -- An attribute reference is side effect free if its expressions
6075 -- are side effect free and its prefix is side effect free or
6076 -- is an entity reference.
6078 -- Is this right? what about x'first where x is a variable???
6080 when N_Attribute_Reference =>
6081 return Side_Effect_Free (Expressions (N))
6082 and then Attribute_Name (N) /= Name_Input
6083 and then (Is_Entity_Name (Prefix (N))
6084 or else Side_Effect_Free (Prefix (N)));
6086 -- A binary operator is side effect free if and both operands are
6087 -- side effect free. For this purpose binary operators include
6088 -- membership tests and short circuit forms
6090 when N_Binary_Op | N_Membership_Test | N_Short_Circuit =>
6091 return Side_Effect_Free (Left_Opnd (N))
6093 Side_Effect_Free (Right_Opnd (N));
6095 -- An explicit dereference is side effect free only if it is
6096 -- a side effect free prefixed reference.
6098 when N_Explicit_Dereference =>
6099 return Safe_Prefixed_Reference (N);
6101 -- A call to _rep_to_pos is side effect free, since we generate
6102 -- this pure function call ourselves. Moreover it is critically
6103 -- important to make this exception, since otherwise we can have
6104 -- discriminants in array components which don't look side effect
6105 -- free in the case of an array whose index type is an enumeration
6106 -- type with an enumeration rep clause.
6108 -- All other function calls are not side effect free
6110 when N_Function_Call =>
6111 return Nkind (Name (N)) = N_Identifier
6112 and then Is_TSS (Name (N), TSS_Rep_To_Pos)
6114 Side_Effect_Free (First (Parameter_Associations (N)));
6116 -- An indexed component is side effect free if it is a side
6117 -- effect free prefixed reference and all the indexing
6118 -- expressions are side effect free.
6120 when N_Indexed_Component =>
6121 return Side_Effect_Free (Expressions (N))
6122 and then Safe_Prefixed_Reference (N);
6124 -- A type qualification is side effect free if the expression
6125 -- is side effect free.
6127 when N_Qualified_Expression =>
6128 return Side_Effect_Free (Expression (N));
6130 -- A selected component is side effect free only if it is a side
6131 -- effect free prefixed reference. If it designates a component
6132 -- with a rep. clause it must be treated has having a potential
6133 -- side effect, because it may be modified through a renaming, and
6134 -- a subsequent use of the renaming as a macro will yield the
6135 -- wrong value. This complex interaction between renaming and
6136 -- removing side effects is a reminder that the latter has become
6137 -- a headache to maintain, and that it should be removed in favor
6138 -- of the gcc mechanism to capture values ???
6140 when N_Selected_Component =>
6141 if Nkind (Parent (N)) = N_Explicit_Dereference
6142 and then Has_Non_Standard_Rep (Designated_Type (Etype (N)))
6146 return Safe_Prefixed_Reference (N);
6149 -- A range is side effect free if the bounds are side effect free
6152 return Side_Effect_Free (Low_Bound (N))
6153 and then Side_Effect_Free (High_Bound (N));
6155 -- A slice is side effect free if it is a side effect free
6156 -- prefixed reference and the bounds are side effect free.
6159 return Side_Effect_Free (Discrete_Range (N))
6160 and then Safe_Prefixed_Reference (N);
6162 -- A type conversion is side effect free if the expression to be
6163 -- converted is side effect free.
6165 when N_Type_Conversion =>
6166 return Side_Effect_Free (Expression (N));
6168 -- A unary operator is side effect free if the operand
6169 -- is side effect free.
6172 return Side_Effect_Free (Right_Opnd (N));
6174 -- An unchecked type conversion is side effect free only if it
6175 -- is safe and its argument is side effect free.
6177 when N_Unchecked_Type_Conversion =>
6178 return Safe_Unchecked_Type_Conversion (N)
6179 and then Side_Effect_Free (Expression (N));
6181 -- An unchecked expression is side effect free if its expression
6182 -- is side effect free.
6184 when N_Unchecked_Expression =>
6185 return Side_Effect_Free (Expression (N));
6187 -- A literal is side effect free
6189 when N_Character_Literal |
6195 -- We consider that anything else has side effects. This is a bit
6196 -- crude, but we are pretty close for most common cases, and we
6197 -- are certainly correct (i.e. we never return True when the
6198 -- answer should be False).
6203 end Side_Effect_Free;
6205 -- A list is side effect free if all elements of the list are side
6208 function Side_Effect_Free (L : List_Id) return Boolean is
6212 if L = No_List or else L = Error_List then
6217 while Present (N) loop
6218 if not Side_Effect_Free (N) then
6227 end Side_Effect_Free;
6229 -------------------------
6230 -- Within_In_Parameter --
6231 -------------------------
6233 function Within_In_Parameter (N : Node_Id) return Boolean is
6235 if not Comes_From_Source (N) then
6238 elsif Is_Entity_Name (N) then
6239 return Ekind (Entity (N)) = E_In_Parameter;
6241 elsif Nkind (N) = N_Indexed_Component
6242 or else Nkind (N) = N_Selected_Component
6244 return Within_In_Parameter (Prefix (N));
6249 end Within_In_Parameter;
6251 -- Start of processing for Remove_Side_Effects
6254 -- Handle cases in which there is nothing to do
6256 if not Expander_Active then
6259 -- Cannot generate temporaries if the invocation to remove side effects
6260 -- was issued too early and the type of the expression is not resolved
6261 -- (this happens because routines Duplicate_Subexpr_XX implicitly invoke
6262 -- Remove_Side_Effects).
6265 or else Ekind (Exp_Type) = E_Access_Attribute_Type
6269 -- No action needed for side-effect free expressions
6271 elsif Side_Effect_Free (Exp) then
6275 -- All this must not have any checks
6277 Scope_Suppress := (others => True);
6279 -- If it is a scalar type and we need to capture the value, just make
6280 -- a copy. Likewise for a function call, an attribute reference, an
6281 -- allocator, or an operator. And if we have a volatile reference and
6282 -- Name_Req is not set (see comments above for Side_Effect_Free).
6284 if Is_Elementary_Type (Exp_Type)
6285 and then (Variable_Ref
6286 or else Nkind (Exp) = N_Function_Call
6287 or else Nkind (Exp) = N_Attribute_Reference
6288 or else Nkind (Exp) = N_Allocator
6289 or else Nkind (Exp) in N_Op
6290 or else (not Name_Req and then Is_Volatile_Reference (Exp)))
6292 Def_Id := Make_Temporary (Loc, 'R', Exp);
6293 Set_Etype (Def_Id, Exp_Type);
6294 Res := New_Reference_To (Def_Id, Loc);
6296 -- If the expression is a packed reference, it must be reanalyzed and
6297 -- expanded, depending on context. This is the case for actuals where
6298 -- a constraint check may capture the actual before expansion of the
6299 -- call is complete.
6301 if Nkind (Exp) = N_Indexed_Component
6302 and then Is_Packed (Etype (Prefix (Exp)))
6304 Set_Analyzed (Exp, False);
6305 Set_Analyzed (Prefix (Exp), False);
6309 Make_Object_Declaration (Loc,
6310 Defining_Identifier => Def_Id,
6311 Object_Definition => New_Reference_To (Exp_Type, Loc),
6312 Constant_Present => True,
6313 Expression => Relocate_Node (Exp));
6315 Set_Assignment_OK (E);
6316 Insert_Action (Exp, E);
6318 -- If the expression has the form v.all then we can just capture the
6319 -- pointer, and then do an explicit dereference on the result.
6321 elsif Nkind (Exp) = N_Explicit_Dereference then
6322 Def_Id := Make_Temporary (Loc, 'R', Exp);
6324 Make_Explicit_Dereference (Loc, New_Reference_To (Def_Id, Loc));
6327 Make_Object_Declaration (Loc,
6328 Defining_Identifier => Def_Id,
6329 Object_Definition =>
6330 New_Reference_To (Etype (Prefix (Exp)), Loc),
6331 Constant_Present => True,
6332 Expression => Relocate_Node (Prefix (Exp))));
6334 -- Similar processing for an unchecked conversion of an expression of
6335 -- the form v.all, where we want the same kind of treatment.
6337 elsif Nkind (Exp) = N_Unchecked_Type_Conversion
6338 and then Nkind (Expression (Exp)) = N_Explicit_Dereference
6340 Remove_Side_Effects (Expression (Exp), Name_Req, Variable_Ref);
6341 Scope_Suppress := Svg_Suppress;
6344 -- If this is a type conversion, leave the type conversion and remove
6345 -- the side effects in the expression. This is important in several
6346 -- circumstances: for change of representations, and also when this is a
6347 -- view conversion to a smaller object, where gigi can end up creating
6348 -- its own temporary of the wrong size.
6350 elsif Nkind (Exp) = N_Type_Conversion then
6351 Remove_Side_Effects (Expression (Exp), Name_Req, Variable_Ref);
6352 Scope_Suppress := Svg_Suppress;
6355 -- If this is an unchecked conversion that Gigi can't handle, make
6356 -- a copy or a use a renaming to capture the value.
6358 elsif Nkind (Exp) = N_Unchecked_Type_Conversion
6359 and then not Safe_Unchecked_Type_Conversion (Exp)
6361 if CW_Or_Has_Controlled_Part (Exp_Type) then
6363 -- Use a renaming to capture the expression, rather than create
6364 -- a controlled temporary.
6366 Def_Id := Make_Temporary (Loc, 'R', Exp);
6367 Res := New_Reference_To (Def_Id, Loc);
6370 Make_Object_Renaming_Declaration (Loc,
6371 Defining_Identifier => Def_Id,
6372 Subtype_Mark => New_Reference_To (Exp_Type, Loc),
6373 Name => Relocate_Node (Exp)));
6376 Def_Id := Make_Temporary (Loc, 'R', Exp);
6377 Set_Etype (Def_Id, Exp_Type);
6378 Res := New_Reference_To (Def_Id, Loc);
6381 Make_Object_Declaration (Loc,
6382 Defining_Identifier => Def_Id,
6383 Object_Definition => New_Reference_To (Exp_Type, Loc),
6384 Constant_Present => not Is_Variable (Exp),
6385 Expression => Relocate_Node (Exp));
6387 Set_Assignment_OK (E);
6388 Insert_Action (Exp, E);
6391 -- For expressions that denote objects, we can use a renaming scheme.
6392 -- This is needed for correctness in the case of a volatile object of a
6393 -- non-volatile type because the Make_Reference call of the "default"
6394 -- approach would generate an illegal access value (an access value
6395 -- cannot designate such an object - see Analyze_Reference). We skip
6396 -- using this scheme if we have an object of a volatile type and we do
6397 -- not have Name_Req set true (see comments above for Side_Effect_Free).
6399 elsif Is_Object_Reference (Exp)
6400 and then Nkind (Exp) /= N_Function_Call
6401 and then (Name_Req or else not Treat_As_Volatile (Exp_Type))
6403 Def_Id := Make_Temporary (Loc, 'R', Exp);
6405 if Nkind (Exp) = N_Selected_Component
6406 and then Nkind (Prefix (Exp)) = N_Function_Call
6407 and then Is_Array_Type (Exp_Type)
6409 -- Avoid generating a variable-sized temporary, by generating
6410 -- the renaming declaration just for the function call. The
6411 -- transformation could be refined to apply only when the array
6412 -- component is constrained by a discriminant???
6415 Make_Selected_Component (Loc,
6416 Prefix => New_Occurrence_Of (Def_Id, Loc),
6417 Selector_Name => Selector_Name (Exp));
6420 Make_Object_Renaming_Declaration (Loc,
6421 Defining_Identifier => Def_Id,
6423 New_Reference_To (Base_Type (Etype (Prefix (Exp))), Loc),
6424 Name => Relocate_Node (Prefix (Exp))));
6427 Res := New_Reference_To (Def_Id, Loc);
6430 Make_Object_Renaming_Declaration (Loc,
6431 Defining_Identifier => Def_Id,
6432 Subtype_Mark => New_Reference_To (Exp_Type, Loc),
6433 Name => Relocate_Node (Exp)));
6436 -- If this is a packed reference, or a selected component with
6437 -- a non-standard representation, a reference to the temporary
6438 -- will be replaced by a copy of the original expression (see
6439 -- Exp_Ch2.Expand_Renaming). Otherwise the temporary must be
6440 -- elaborated by gigi, and is of course not to be replaced in-line
6441 -- by the expression it renames, which would defeat the purpose of
6442 -- removing the side-effect.
6444 if (Nkind (Exp) = N_Selected_Component
6445 or else Nkind (Exp) = N_Indexed_Component)
6446 and then Has_Non_Standard_Rep (Etype (Prefix (Exp)))
6450 Set_Is_Renaming_Of_Object (Def_Id, False);
6453 -- Otherwise we generate a reference to the value
6456 -- Special processing for function calls that return a limited type.
6457 -- We need to build a declaration that will enable build-in-place
6458 -- expansion of the call. This is not done if the context is already
6459 -- an object declaration, to prevent infinite recursion.
6461 -- This is relevant only in Ada 2005 mode. In Ada 95 programs we have
6462 -- to accommodate functions returning limited objects by reference.
6464 if Nkind (Exp) = N_Function_Call
6465 and then Is_Immutably_Limited_Type (Etype (Exp))
6466 and then Nkind (Parent (Exp)) /= N_Object_Declaration
6467 and then Ada_Version >= Ada_2005
6470 Obj : constant Entity_Id := Make_Temporary (Loc, 'F', Exp);
6475 Make_Object_Declaration (Loc,
6476 Defining_Identifier => Obj,
6477 Object_Definition => New_Occurrence_Of (Exp_Type, Loc),
6478 Expression => Relocate_Node (Exp));
6480 Insert_Action (Exp, Decl);
6481 Set_Etype (Obj, Exp_Type);
6482 Rewrite (Exp, New_Occurrence_Of (Obj, Loc));
6487 Ref_Type := Make_Temporary (Loc, 'A');
6490 Make_Full_Type_Declaration (Loc,
6491 Defining_Identifier => Ref_Type,
6493 Make_Access_To_Object_Definition (Loc,
6494 All_Present => True,
6495 Subtype_Indication =>
6496 New_Reference_To (Exp_Type, Loc)));
6499 Insert_Action (Exp, Ptr_Typ_Decl);
6501 Def_Id := Make_Temporary (Loc, 'R', Exp);
6502 Set_Etype (Def_Id, Exp_Type);
6505 Make_Explicit_Dereference (Loc,
6506 Prefix => New_Reference_To (Def_Id, Loc));
6508 if Nkind (E) = N_Explicit_Dereference then
6509 New_Exp := Relocate_Node (Prefix (E));
6511 E := Relocate_Node (E);
6512 New_Exp := Make_Reference (Loc, E);
6515 if Is_Delayed_Aggregate (E) then
6517 -- The expansion of nested aggregates is delayed until the
6518 -- enclosing aggregate is expanded. As aggregates are often
6519 -- qualified, the predicate applies to qualified expressions as
6520 -- well, indicating that the enclosing aggregate has not been
6521 -- expanded yet. At this point the aggregate is part of a
6522 -- stand-alone declaration, and must be fully expanded.
6524 if Nkind (E) = N_Qualified_Expression then
6525 Set_Expansion_Delayed (Expression (E), False);
6526 Set_Analyzed (Expression (E), False);
6528 Set_Expansion_Delayed (E, False);
6531 Set_Analyzed (E, False);
6535 Make_Object_Declaration (Loc,
6536 Defining_Identifier => Def_Id,
6537 Object_Definition => New_Reference_To (Ref_Type, Loc),
6538 Constant_Present => True,
6539 Expression => New_Exp));
6542 -- Preserve the Assignment_OK flag in all copies, since at least one
6543 -- copy may be used in a context where this flag must be set (otherwise
6544 -- why would the flag be set in the first place).
6546 Set_Assignment_OK (Res, Assignment_OK (Exp));
6548 -- Finally rewrite the original expression and we are done
6551 Analyze_And_Resolve (Exp, Exp_Type);
6552 Scope_Suppress := Svg_Suppress;
6553 end Remove_Side_Effects;
6555 ---------------------------
6556 -- Represented_As_Scalar --
6557 ---------------------------
6559 function Represented_As_Scalar (T : Entity_Id) return Boolean is
6560 UT : constant Entity_Id := Underlying_Type (T);
6562 return Is_Scalar_Type (UT)
6563 or else (Is_Bit_Packed_Array (UT)
6564 and then Is_Scalar_Type (Packed_Array_Type (UT)));
6565 end Represented_As_Scalar;
6567 ------------------------------
6568 -- Requires_Cleanup_Actions --
6569 ------------------------------
6571 function Requires_Cleanup_Actions (N : Node_Id) return Boolean is
6572 For_Pkg : constant Boolean :=
6573 Nkind_In (N, N_Package_Body, N_Package_Specification);
6577 when N_Accept_Statement |
6585 Requires_Cleanup_Actions (Declarations (N), For_Pkg, True)
6587 (Present (Handled_Statement_Sequence (N))
6589 Requires_Cleanup_Actions (Statements
6590 (Handled_Statement_Sequence (N)), For_Pkg, True));
6592 when N_Package_Specification =>
6594 Requires_Cleanup_Actions
6595 (Visible_Declarations (N), For_Pkg, True)
6597 Requires_Cleanup_Actions
6598 (Private_Declarations (N), For_Pkg, True);
6603 end Requires_Cleanup_Actions;
6605 ------------------------------
6606 -- Requires_Cleanup_Actions --
6607 ------------------------------
6609 function Requires_Cleanup_Actions
6611 For_Package : Boolean;
6612 Nested_Constructs : Boolean) return Boolean
6617 Obj_Typ : Entity_Id;
6618 Pack_Id : Entity_Id;
6623 or else Is_Empty_List (L)
6629 while Present (Decl) loop
6631 -- Library-level tagged types
6633 if Nkind (Decl) = N_Full_Type_Declaration then
6634 Typ := Defining_Identifier (Decl);
6636 if Is_Tagged_Type (Typ)
6637 and then Is_Library_Level_Entity (Typ)
6638 and then Convention (Typ) = Convention_Ada
6639 and then Present (Access_Disp_Table (Typ))
6640 and then RTE_Available (RE_Unregister_Tag)
6641 and then not No_Run_Time_Mode
6642 and then not Is_Abstract_Type (Typ)
6647 -- Regular object declarations
6649 elsif Nkind (Decl) = N_Object_Declaration then
6650 Obj_Id := Defining_Identifier (Decl);
6651 Obj_Typ := Base_Type (Etype (Obj_Id));
6652 Expr := Expression (Decl);
6654 -- Bypass any form of processing for objects which have their
6655 -- finalization disabled. This applies only to objects at the
6659 and then Finalize_Storage_Only (Obj_Typ)
6663 -- Transient variables are treated separately in order to minimize
6664 -- the size of the generated code. See Exp_Ch7.Process_Transient_
6667 elsif Is_Processed_Transient (Obj_Id) then
6670 -- The object is of the form:
6671 -- Obj : Typ [:= Expr];
6673 -- Do not process the incomplete view of a deferred constant. Do
6674 -- not consider tag-to-class-wide conversions.
6676 elsif not Is_Imported (Obj_Id)
6677 and then Needs_Finalization (Obj_Typ)
6678 and then not (Ekind (Obj_Id) = E_Constant
6679 and then not Has_Completion (Obj_Id))
6680 and then not Is_Tag_To_CW_Conversion (Obj_Id)
6684 -- The object is of the form:
6685 -- Obj : Access_Typ := Non_BIP_Function_Call'reference;
6687 -- Obj : Access_Typ :=
6688 -- BIP_Function_Call
6689 -- (..., BIPaccess => null, ...)'reference;
6691 elsif Is_Access_Type (Obj_Typ)
6692 and then Needs_Finalization
6693 (Available_View (Designated_Type (Obj_Typ)))
6694 and then Present (Expr)
6696 (Is_Null_Access_BIP_Func_Call (Expr)
6698 (Is_Non_BIP_Func_Call (Expr)
6699 and then not Is_Related_To_Func_Return (Obj_Id)))
6703 -- Processing for "hook" objects generated for controlled
6704 -- transients declared inside an Expression_With_Actions.
6706 elsif Is_Access_Type (Obj_Typ)
6707 and then Present (Return_Flag_Or_Transient_Decl (Obj_Id))
6708 and then Nkind (Return_Flag_Or_Transient_Decl (Obj_Id)) =
6709 N_Object_Declaration
6710 and then Is_Finalizable_Transient
6711 (Return_Flag_Or_Transient_Decl (Obj_Id), Decl)
6715 -- Simple protected objects which use type System.Tasking.
6716 -- Protected_Objects.Protection to manage their locks should be
6717 -- treated as controlled since they require manual cleanup.
6719 elsif Ekind (Obj_Id) = E_Variable
6721 (Is_Simple_Protected_Type (Obj_Typ)
6722 or else Has_Simple_Protected_Object (Obj_Typ))
6727 -- Specific cases of object renamings
6729 elsif Nkind (Decl) = N_Object_Renaming_Declaration
6730 and then Nkind (Name (Decl)) = N_Explicit_Dereference
6731 and then Nkind (Prefix (Name (Decl))) = N_Identifier
6733 Obj_Id := Defining_Identifier (Decl);
6734 Obj_Typ := Base_Type (Etype (Obj_Id));
6736 -- Bypass any form of processing for objects which have their
6737 -- finalization disabled. This applies only to objects at the
6741 and then Finalize_Storage_Only (Obj_Typ)
6745 -- Return object of a build-in-place function. This case is
6746 -- recognized and marked by the expansion of an extended return
6747 -- statement (see Expand_N_Extended_Return_Statement).
6749 elsif Needs_Finalization (Obj_Typ)
6750 and then Is_Return_Object (Obj_Id)
6751 and then Present (Return_Flag_Or_Transient_Decl (Obj_Id))
6756 -- Inspect the freeze node of an access-to-controlled type and look
6757 -- for a delayed finalization master. This case arises when the
6758 -- freeze actions are inserted at a later time than the expansion of
6759 -- the context. Since Build_Finalizer is never called on a single
6760 -- construct twice, the master will be ultimately left out and never
6761 -- finalized. This is also needed for freeze actions of designated
6762 -- types themselves, since in some cases the finalization master is
6763 -- associated with a designated type's freeze node rather than that
6764 -- of the access type (see handling for freeze actions in
6765 -- Build_Finalization_Master).
6767 elsif Nkind (Decl) = N_Freeze_Entity
6768 and then Present (Actions (Decl))
6770 Typ := Entity (Decl);
6772 if ((Is_Access_Type (Typ)
6773 and then not Is_Access_Subprogram_Type (Typ)
6774 and then Needs_Finalization
6775 (Available_View (Designated_Type (Typ))))
6778 and then Needs_Finalization (Typ)))
6779 and then Requires_Cleanup_Actions
6780 (Actions (Decl), For_Package, Nested_Constructs)
6785 -- Nested package declarations
6787 elsif Nested_Constructs
6788 and then Nkind (Decl) = N_Package_Declaration
6790 Pack_Id := Defining_Unit_Name (Specification (Decl));
6792 if Nkind (Pack_Id) = N_Defining_Program_Unit_Name then
6793 Pack_Id := Defining_Identifier (Pack_Id);
6796 if Ekind (Pack_Id) /= E_Generic_Package
6797 and then Requires_Cleanup_Actions (Specification (Decl))
6802 -- Nested package bodies
6804 elsif Nested_Constructs
6805 and then Nkind (Decl) = N_Package_Body
6807 Pack_Id := Corresponding_Spec (Decl);
6809 if Ekind (Pack_Id) /= E_Generic_Package
6810 and then Requires_Cleanup_Actions (Decl)
6820 end Requires_Cleanup_Actions;
6822 ------------------------------------
6823 -- Safe_Unchecked_Type_Conversion --
6824 ------------------------------------
6826 -- Note: this function knows quite a bit about the exact requirements of
6827 -- Gigi with respect to unchecked type conversions, and its code must be
6828 -- coordinated with any changes in Gigi in this area.
6830 -- The above requirements should be documented in Sinfo ???
6832 function Safe_Unchecked_Type_Conversion (Exp : Node_Id) return Boolean is
6837 Pexp : constant Node_Id := Parent (Exp);
6840 -- If the expression is the RHS of an assignment or object declaration
6841 -- we are always OK because there will always be a target.
6843 -- Object renaming declarations, (generated for view conversions of
6844 -- actuals in inlined calls), like object declarations, provide an
6845 -- explicit type, and are safe as well.
6847 if (Nkind (Pexp) = N_Assignment_Statement
6848 and then Expression (Pexp) = Exp)
6849 or else Nkind (Pexp) = N_Object_Declaration
6850 or else Nkind (Pexp) = N_Object_Renaming_Declaration
6854 -- If the expression is the prefix of an N_Selected_Component we should
6855 -- also be OK because GCC knows to look inside the conversion except if
6856 -- the type is discriminated. We assume that we are OK anyway if the
6857 -- type is not set yet or if it is controlled since we can't afford to
6858 -- introduce a temporary in this case.
6860 elsif Nkind (Pexp) = N_Selected_Component
6861 and then Prefix (Pexp) = Exp
6863 if No (Etype (Pexp)) then
6867 not Has_Discriminants (Etype (Pexp))
6868 or else Is_Constrained (Etype (Pexp));
6872 -- Set the output type, this comes from Etype if it is set, otherwise we
6873 -- take it from the subtype mark, which we assume was already fully
6876 if Present (Etype (Exp)) then
6877 Otyp := Etype (Exp);
6879 Otyp := Entity (Subtype_Mark (Exp));
6882 -- The input type always comes from the expression, and we assume
6883 -- this is indeed always analyzed, so we can simply get the Etype.
6885 Ityp := Etype (Expression (Exp));
6887 -- Initialize alignments to unknown so far
6892 -- Replace a concurrent type by its corresponding record type and each
6893 -- type by its underlying type and do the tests on those. The original
6894 -- type may be a private type whose completion is a concurrent type, so
6895 -- find the underlying type first.
6897 if Present (Underlying_Type (Otyp)) then
6898 Otyp := Underlying_Type (Otyp);
6901 if Present (Underlying_Type (Ityp)) then
6902 Ityp := Underlying_Type (Ityp);
6905 if Is_Concurrent_Type (Otyp) then
6906 Otyp := Corresponding_Record_Type (Otyp);
6909 if Is_Concurrent_Type (Ityp) then
6910 Ityp := Corresponding_Record_Type (Ityp);
6913 -- If the base types are the same, we know there is no problem since
6914 -- this conversion will be a noop.
6916 if Implementation_Base_Type (Otyp) = Implementation_Base_Type (Ityp) then
6919 -- Same if this is an upwards conversion of an untagged type, and there
6920 -- are no constraints involved (could be more general???)
6922 elsif Etype (Ityp) = Otyp
6923 and then not Is_Tagged_Type (Ityp)
6924 and then not Has_Discriminants (Ityp)
6925 and then No (First_Rep_Item (Base_Type (Ityp)))
6929 -- If the expression has an access type (object or subprogram) we assume
6930 -- that the conversion is safe, because the size of the target is safe,
6931 -- even if it is a record (which might be treated as having unknown size
6934 elsif Is_Access_Type (Ityp) then
6937 -- If the size of output type is known at compile time, there is never
6938 -- a problem. Note that unconstrained records are considered to be of
6939 -- known size, but we can't consider them that way here, because we are
6940 -- talking about the actual size of the object.
6942 -- We also make sure that in addition to the size being known, we do not
6943 -- have a case which might generate an embarrassingly large temp in
6944 -- stack checking mode.
6946 elsif Size_Known_At_Compile_Time (Otyp)
6948 (not Stack_Checking_Enabled
6949 or else not May_Generate_Large_Temp (Otyp))
6950 and then not (Is_Record_Type (Otyp) and then not Is_Constrained (Otyp))
6954 -- If either type is tagged, then we know the alignment is OK so
6955 -- Gigi will be able to use pointer punning.
6957 elsif Is_Tagged_Type (Otyp) or else Is_Tagged_Type (Ityp) then
6960 -- If either type is a limited record type, we cannot do a copy, so say
6961 -- safe since there's nothing else we can do.
6963 elsif Is_Limited_Record (Otyp) or else Is_Limited_Record (Ityp) then
6966 -- Conversions to and from packed array types are always ignored and
6969 elsif Is_Packed_Array_Type (Otyp)
6970 or else Is_Packed_Array_Type (Ityp)
6975 -- The only other cases known to be safe is if the input type's
6976 -- alignment is known to be at least the maximum alignment for the
6977 -- target or if both alignments are known and the output type's
6978 -- alignment is no stricter than the input's. We can use the component
6979 -- type alignement for an array if a type is an unpacked array type.
6981 if Present (Alignment_Clause (Otyp)) then
6982 Oalign := Expr_Value (Expression (Alignment_Clause (Otyp)));
6984 elsif Is_Array_Type (Otyp)
6985 and then Present (Alignment_Clause (Component_Type (Otyp)))
6987 Oalign := Expr_Value (Expression (Alignment_Clause
6988 (Component_Type (Otyp))));
6991 if Present (Alignment_Clause (Ityp)) then
6992 Ialign := Expr_Value (Expression (Alignment_Clause (Ityp)));
6994 elsif Is_Array_Type (Ityp)
6995 and then Present (Alignment_Clause (Component_Type (Ityp)))
6997 Ialign := Expr_Value (Expression (Alignment_Clause
6998 (Component_Type (Ityp))));
7001 if Ialign /= No_Uint and then Ialign > Maximum_Alignment then
7004 elsif Ialign /= No_Uint and then Oalign /= No_Uint
7005 and then Ialign <= Oalign
7009 -- Otherwise, Gigi cannot handle this and we must make a temporary
7014 end Safe_Unchecked_Type_Conversion;
7016 ---------------------------------
7017 -- Set_Current_Value_Condition --
7018 ---------------------------------
7020 -- Note: the implementation of this procedure is very closely tied to the
7021 -- implementation of Get_Current_Value_Condition. Here we set required
7022 -- Current_Value fields, and in Get_Current_Value_Condition, we interpret
7023 -- them, so they must have a consistent view.
7025 procedure Set_Current_Value_Condition (Cnode : Node_Id) is
7027 procedure Set_Entity_Current_Value (N : Node_Id);
7028 -- If N is an entity reference, where the entity is of an appropriate
7029 -- kind, then set the current value of this entity to Cnode, unless
7030 -- there is already a definite value set there.
7032 procedure Set_Expression_Current_Value (N : Node_Id);
7033 -- If N is of an appropriate form, sets an appropriate entry in current
7034 -- value fields of relevant entities. Multiple entities can be affected
7035 -- in the case of an AND or AND THEN.
7037 ------------------------------
7038 -- Set_Entity_Current_Value --
7039 ------------------------------
7041 procedure Set_Entity_Current_Value (N : Node_Id) is
7043 if Is_Entity_Name (N) then
7045 Ent : constant Entity_Id := Entity (N);
7048 -- Don't capture if not safe to do so
7050 if not Safe_To_Capture_Value (N, Ent, Cond => True) then
7054 -- Here we have a case where the Current_Value field may need
7055 -- to be set. We set it if it is not already set to a compile
7056 -- time expression value.
7058 -- Note that this represents a decision that one condition
7059 -- blots out another previous one. That's certainly right if
7060 -- they occur at the same level. If the second one is nested,
7061 -- then the decision is neither right nor wrong (it would be
7062 -- equally OK to leave the outer one in place, or take the new
7063 -- inner one. Really we should record both, but our data
7064 -- structures are not that elaborate.
7066 if Nkind (Current_Value (Ent)) not in N_Subexpr then
7067 Set_Current_Value (Ent, Cnode);
7071 end Set_Entity_Current_Value;
7073 ----------------------------------
7074 -- Set_Expression_Current_Value --
7075 ----------------------------------
7077 procedure Set_Expression_Current_Value (N : Node_Id) is
7083 -- Loop to deal with (ignore for now) any NOT operators present. The
7084 -- presence of NOT operators will be handled properly when we call
7085 -- Get_Current_Value_Condition.
7087 while Nkind (Cond) = N_Op_Not loop
7088 Cond := Right_Opnd (Cond);
7091 -- For an AND or AND THEN, recursively process operands
7093 if Nkind (Cond) = N_Op_And or else Nkind (Cond) = N_And_Then then
7094 Set_Expression_Current_Value (Left_Opnd (Cond));
7095 Set_Expression_Current_Value (Right_Opnd (Cond));
7099 -- Check possible relational operator
7101 if Nkind (Cond) in N_Op_Compare then
7102 if Compile_Time_Known_Value (Right_Opnd (Cond)) then
7103 Set_Entity_Current_Value (Left_Opnd (Cond));
7104 elsif Compile_Time_Known_Value (Left_Opnd (Cond)) then
7105 Set_Entity_Current_Value (Right_Opnd (Cond));
7108 -- Check possible boolean variable reference
7111 Set_Entity_Current_Value (Cond);
7113 end Set_Expression_Current_Value;
7115 -- Start of processing for Set_Current_Value_Condition
7118 Set_Expression_Current_Value (Condition (Cnode));
7119 end Set_Current_Value_Condition;
7121 --------------------------
7122 -- Set_Elaboration_Flag --
7123 --------------------------
7125 procedure Set_Elaboration_Flag (N : Node_Id; Spec_Id : Entity_Id) is
7126 Loc : constant Source_Ptr := Sloc (N);
7127 Ent : constant Entity_Id := Elaboration_Entity (Spec_Id);
7131 if Present (Ent) then
7133 -- Nothing to do if at the compilation unit level, because in this
7134 -- case the flag is set by the binder generated elaboration routine.
7136 if Nkind (Parent (N)) = N_Compilation_Unit then
7139 -- Here we do need to generate an assignment statement
7142 Check_Restriction (No_Elaboration_Code, N);
7144 Make_Assignment_Statement (Loc,
7145 Name => New_Occurrence_Of (Ent, Loc),
7146 Expression => Make_Integer_Literal (Loc, Uint_1));
7148 if Nkind (Parent (N)) = N_Subunit then
7149 Insert_After (Corresponding_Stub (Parent (N)), Asn);
7151 Insert_After (N, Asn);
7156 -- Kill current value indication. This is necessary because the
7157 -- tests of this flag are inserted out of sequence and must not
7158 -- pick up bogus indications of the wrong constant value.
7160 Set_Current_Value (Ent, Empty);
7163 end Set_Elaboration_Flag;
7165 ----------------------------
7166 -- Set_Renamed_Subprogram --
7167 ----------------------------
7169 procedure Set_Renamed_Subprogram (N : Node_Id; E : Entity_Id) is
7171 -- If input node is an identifier, we can just reset it
7173 if Nkind (N) = N_Identifier then
7174 Set_Chars (N, Chars (E));
7177 -- Otherwise we have to do a rewrite, preserving Comes_From_Source
7181 CS : constant Boolean := Comes_From_Source (N);
7183 Rewrite (N, Make_Identifier (Sloc (N), Chars (E)));
7185 Set_Comes_From_Source (N, CS);
7186 Set_Analyzed (N, True);
7189 end Set_Renamed_Subprogram;
7191 ----------------------------------
7192 -- Silly_Boolean_Array_Not_Test --
7193 ----------------------------------
7195 -- This procedure implements an odd and silly test. We explicitly check
7196 -- for the case where the 'First of the component type is equal to the
7197 -- 'Last of this component type, and if this is the case, we make sure
7198 -- that constraint error is raised. The reason is that the NOT is bound
7199 -- to cause CE in this case, and we will not otherwise catch it.
7201 -- No such check is required for AND and OR, since for both these cases
7202 -- False op False = False, and True op True = True. For the XOR case,
7203 -- see Silly_Boolean_Array_Xor_Test.
7205 -- Believe it or not, this was reported as a bug. Note that nearly always,
7206 -- the test will evaluate statically to False, so the code will be
7207 -- statically removed, and no extra overhead caused.
7209 procedure Silly_Boolean_Array_Not_Test (N : Node_Id; T : Entity_Id) is
7210 Loc : constant Source_Ptr := Sloc (N);
7211 CT : constant Entity_Id := Component_Type (T);
7214 -- The check we install is
7216 -- constraint_error when
7217 -- component_type'first = component_type'last
7218 -- and then array_type'Length /= 0)
7220 -- We need the last guard because we don't want to raise CE for empty
7221 -- arrays since no out of range values result. (Empty arrays with a
7222 -- component type of True .. True -- very useful -- even the ACATS
7223 -- does not test that marginal case!)
7226 Make_Raise_Constraint_Error (Loc,
7232 Make_Attribute_Reference (Loc,
7233 Prefix => New_Occurrence_Of (CT, Loc),
7234 Attribute_Name => Name_First),
7237 Make_Attribute_Reference (Loc,
7238 Prefix => New_Occurrence_Of (CT, Loc),
7239 Attribute_Name => Name_Last)),
7241 Right_Opnd => Make_Non_Empty_Check (Loc, Right_Opnd (N))),
7242 Reason => CE_Range_Check_Failed));
7243 end Silly_Boolean_Array_Not_Test;
7245 ----------------------------------
7246 -- Silly_Boolean_Array_Xor_Test --
7247 ----------------------------------
7249 -- This procedure implements an odd and silly test. We explicitly check
7250 -- for the XOR case where the component type is True .. True, since this
7251 -- will raise constraint error. A special check is required since CE
7252 -- will not be generated otherwise (cf Expand_Packed_Not).
7254 -- No such check is required for AND and OR, since for both these cases
7255 -- False op False = False, and True op True = True, and no check is
7256 -- required for the case of False .. False, since False xor False = False.
7257 -- See also Silly_Boolean_Array_Not_Test
7259 procedure Silly_Boolean_Array_Xor_Test (N : Node_Id; T : Entity_Id) is
7260 Loc : constant Source_Ptr := Sloc (N);
7261 CT : constant Entity_Id := Component_Type (T);
7264 -- The check we install is
7266 -- constraint_error when
7267 -- Boolean (component_type'First)
7268 -- and then Boolean (component_type'Last)
7269 -- and then array_type'Length /= 0)
7271 -- We need the last guard because we don't want to raise CE for empty
7272 -- arrays since no out of range values result (Empty arrays with a
7273 -- component type of True .. True -- very useful -- even the ACATS
7274 -- does not test that marginal case!).
7277 Make_Raise_Constraint_Error (Loc,
7283 Convert_To (Standard_Boolean,
7284 Make_Attribute_Reference (Loc,
7285 Prefix => New_Occurrence_Of (CT, Loc),
7286 Attribute_Name => Name_First)),
7289 Convert_To (Standard_Boolean,
7290 Make_Attribute_Reference (Loc,
7291 Prefix => New_Occurrence_Of (CT, Loc),
7292 Attribute_Name => Name_Last))),
7294 Right_Opnd => Make_Non_Empty_Check (Loc, Right_Opnd (N))),
7295 Reason => CE_Range_Check_Failed));
7296 end Silly_Boolean_Array_Xor_Test;
7298 --------------------------
7299 -- Target_Has_Fixed_Ops --
7300 --------------------------
7302 Integer_Sized_Small : Ureal;
7303 -- Set to 2.0 ** -(Integer'Size - 1) the first time that this function is
7304 -- called (we don't want to compute it more than once!)
7306 Long_Integer_Sized_Small : Ureal;
7307 -- Set to 2.0 ** -(Long_Integer'Size - 1) the first time that this function
7308 -- is called (we don't want to compute it more than once)
7310 First_Time_For_THFO : Boolean := True;
7311 -- Set to False after first call (if Fractional_Fixed_Ops_On_Target)
7313 function Target_Has_Fixed_Ops
7314 (Left_Typ : Entity_Id;
7315 Right_Typ : Entity_Id;
7316 Result_Typ : Entity_Id) return Boolean
7318 function Is_Fractional_Type (Typ : Entity_Id) return Boolean;
7319 -- Return True if the given type is a fixed-point type with a small
7320 -- value equal to 2 ** (-(T'Object_Size - 1)) and whose values have
7321 -- an absolute value less than 1.0. This is currently limited to
7322 -- fixed-point types that map to Integer or Long_Integer.
7324 ------------------------
7325 -- Is_Fractional_Type --
7326 ------------------------
7328 function Is_Fractional_Type (Typ : Entity_Id) return Boolean is
7330 if Esize (Typ) = Standard_Integer_Size then
7331 return Small_Value (Typ) = Integer_Sized_Small;
7333 elsif Esize (Typ) = Standard_Long_Integer_Size then
7334 return Small_Value (Typ) = Long_Integer_Sized_Small;
7339 end Is_Fractional_Type;
7341 -- Start of processing for Target_Has_Fixed_Ops
7344 -- Return False if Fractional_Fixed_Ops_On_Target is false
7346 if not Fractional_Fixed_Ops_On_Target then
7350 -- Here the target has Fractional_Fixed_Ops, if first time, compute
7351 -- standard constants used by Is_Fractional_Type.
7353 if First_Time_For_THFO then
7354 First_Time_For_THFO := False;
7356 Integer_Sized_Small :=
7359 Den => UI_From_Int (Standard_Integer_Size - 1),
7362 Long_Integer_Sized_Small :=
7365 Den => UI_From_Int (Standard_Long_Integer_Size - 1),
7369 -- Return True if target supports fixed-by-fixed multiply/divide for
7370 -- fractional fixed-point types (see Is_Fractional_Type) and the operand
7371 -- and result types are equivalent fractional types.
7373 return Is_Fractional_Type (Base_Type (Left_Typ))
7374 and then Is_Fractional_Type (Base_Type (Right_Typ))
7375 and then Is_Fractional_Type (Base_Type (Result_Typ))
7376 and then Esize (Left_Typ) = Esize (Right_Typ)
7377 and then Esize (Left_Typ) = Esize (Result_Typ);
7378 end Target_Has_Fixed_Ops;
7380 ------------------------------------------
7381 -- Type_May_Have_Bit_Aligned_Components --
7382 ------------------------------------------
7384 function Type_May_Have_Bit_Aligned_Components
7385 (Typ : Entity_Id) return Boolean
7388 -- Array type, check component type
7390 if Is_Array_Type (Typ) then
7392 Type_May_Have_Bit_Aligned_Components (Component_Type (Typ));
7394 -- Record type, check components
7396 elsif Is_Record_Type (Typ) then
7401 E := First_Component_Or_Discriminant (Typ);
7402 while Present (E) loop
7403 if Component_May_Be_Bit_Aligned (E)
7404 or else Type_May_Have_Bit_Aligned_Components (Etype (E))
7409 Next_Component_Or_Discriminant (E);
7415 -- Type other than array or record is always OK
7420 end Type_May_Have_Bit_Aligned_Components;
7422 ----------------------------
7423 -- Wrap_Cleanup_Procedure --
7424 ----------------------------
7426 procedure Wrap_Cleanup_Procedure (N : Node_Id) is
7427 Loc : constant Source_Ptr := Sloc (N);
7428 Stseq : constant Node_Id := Handled_Statement_Sequence (N);
7429 Stmts : constant List_Id := Statements (Stseq);
7432 if Abort_Allowed then
7433 Prepend_To (Stmts, Build_Runtime_Call (Loc, RE_Abort_Defer));
7434 Append_To (Stmts, Build_Runtime_Call (Loc, RE_Abort_Undefer));
7436 end Wrap_Cleanup_Procedure;