1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
9 -- Copyright (C) 1997-2017, 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 Debug
; use Debug
;
28 with Einfo
; use Einfo
;
29 with Elists
; use Elists
;
30 with Errout
; use Errout
;
31 with Exp_Ch11
; use Exp_Ch11
;
32 with Exp_Tss
; use Exp_Tss
;
33 with Exp_Util
; use Exp_Util
;
35 with Lib
.Load
; use Lib
.Load
;
36 with Namet
; use Namet
;
37 with Nlists
; use Nlists
;
38 with Nmake
; use Nmake
;
40 with Restrict
; use Restrict
;
41 with Rident
; use Rident
;
42 with Rtsfind
; use Rtsfind
;
44 with Sem_Aux
; use Sem_Aux
;
45 with Sem_Ch7
; use Sem_Ch7
;
46 with Sem_Ch8
; use Sem_Ch8
;
47 with Sem_Prag
; use Sem_Prag
;
48 with Sem_Util
; use Sem_Util
;
49 with Sinfo
; use Sinfo
;
50 with Snames
; use Snames
;
51 with Stand
; use Stand
;
53 with Tbuild
; use Tbuild
;
54 with Uintp
; use Uintp
;
55 with Uname
; use Uname
;
57 with GNAT
.HTable
; use GNAT
.HTable
;
59 package body Sem_Elab
is
61 -----------------------------------------
62 -- Access-before-elaboration mechanism --
63 -----------------------------------------
65 -- The access-before-elaboration (ABE) mechanism implemented in this unit
66 -- has the following objectives:
68 -- * Diagnose at compile-time or install run-time checks to prevent ABE
69 -- access to data and behaviour.
71 -- The high-level idea is to accurately diagnose ABE issues within a
72 -- single unit because the ABE mechanism can inspect the whole unit.
73 -- As soon as the elaboration graph extends to an external unit, the
74 -- diagnostics stop because the body of the unit may not be available.
75 -- Due to control and data flow, the ABE mechanism cannot accurately
76 -- determine whether a particular scenario will be elaborated or not.
77 -- Conditional ABE checks are therefore used to verify the elaboration
78 -- status of a local and external target at run time.
80 -- * Supply elaboration dependencies for a unit to binde
82 -- The ABE mechanism registers each outgoing elaboration edge for the
83 -- main unit in its ALI file. GNATbind and binde can then reconstruct
84 -- the full elaboration graph and determine the proper elaboration
85 -- order for all units in the compilation.
87 -- The ABE mechanism supports three models of elaboration:
89 -- * Dynamic model - This is the most permissive of the three models.
90 -- When the dynamic model is in effect, the mechanism performs very
91 -- little diagnostics and generates run-time checks to detect ABE
92 -- issues. The behaviour of this model is identical to that specified
93 -- by the Ada RM. This model is enabled with switch -gnatE.
95 -- * Static model - This is the middle ground of the three models. When
96 -- the static model is in effect, the mechanism diagnoses and installs
97 -- run-time checks to detect ABE issues in the main unit. In addition,
98 -- the mechanism generates implicit Elaborate or Elaborate_All pragmas
99 -- to ensure the prior elaboration of withed units. The model employs
100 -- textual order, with clause context, and elaboration-related source
101 -- pragmas. This is the default model.
103 -- * SPARK model - This is the most conservative of the three models and
104 -- impelements the semantics defined in SPARK RM 7.7. The SPARK model
105 -- is in effect only when a context resides in a SPARK_Mode On region,
106 -- otherwise the mechanism falls back to one of the previous models.
108 -- The ABE mechanism consists of a "recording" phase and a "processing"
115 -- * Bridge target - A type of target. A bridge target is a link between
116 -- scenarios. It is usually a byproduct of expansion and does not have
117 -- any direct ABE ramifications.
119 -- * Call marker - A special node used to indicate the presence of a call
120 -- in the tree in case expansion transforms or eliminates the original
121 -- call. N_Call_Marker nodes do not have static and run-time semantics.
123 -- * Conditional ABE - A type of ABE. A conditional ABE occurs when the
124 -- elaboration or invocation of a target by a scenario within the main
125 -- unit causes an ABE, but does not cause an ABE for another scenarios
126 -- within the main unit.
128 -- * Declaration level - A type of enclosing level. A scenario or target is
129 -- at the declaration level when it appears within the declarations of a
130 -- block statement, entry body, subprogram body, or task body, ignoring
131 -- enclosing packages.
133 -- * Generic library level - A type of enclosing level. A scenario or
134 -- target is at the generic library level if it appears in a generic
135 -- package library unit, ignoring enclosing packages.
137 -- * Guaranteed ABE - A type of ABE. A guaranteed ABE occurs when the
138 -- elaboration or invocation of a target by all scenarios within the
139 -- main unit causes an ABE.
141 -- * Instantiation library level - A type of enclosing level. A scenario
142 -- or target is at the instantiation library level if it appears in an
143 -- instantiation library unit, ignoring enclosing packages.
145 -- * Library level - A type of enclosing level. A scenario or target is at
146 -- the library level if it appears in a package library unit, ignoring
147 -- enclosng packages.
149 -- * Non-library-level encapsulator - A construct that cannot be elaborated
150 -- on its own and requires elaboration by a top-level scenario.
152 -- * Scenario - A construct or context which may be elaborated or executed
153 -- by elaboration code. The scenarios recognized by the ABE mechanism are
156 -- - '[Unrestricted_]Access of entries, operators, and subprograms
158 -- - Assignments to variables
160 -- - Calls to entries, operators, and subprograms
164 -- - Reads of variables
168 -- * Target - A construct referenced by a scenario. The targets recognized
169 -- by the ABE mechanism are as follows:
171 -- - For '[Unrestricted_]Access of entries, operators, and subprograms,
172 -- the target is the entry, operator, or subprogram.
174 -- - For assignments to variables, the target is the variable
176 -- - For calls, the target is the entry, operator, or subprogram
178 -- - For instantiations, the target is the generic template
180 -- - For reads of variables, the target is the variable
182 -- - For task activation, the target is the task body
184 -- * Top-level scenario - A scenario which appears in a non-generic main
185 -- unit. Depending on the elaboration model is in effect, the following
186 -- addotional restrictions apply:
188 -- - Dynamic model - No restrictions
190 -- - SPARK model - Falls back to either the dynamic or static model
192 -- - Static model - The scenario must be at the library level
194 ---------------------
195 -- Recording phase --
196 ---------------------
198 -- The Recording phase coincides with the analysis/resolution phase of the
199 -- compiler. It has the following objectives:
201 -- * Record all top-level scenarios for examination by the Processing
204 -- Saving only a certain number of nodes improves the performance of
205 -- the ABE mechanism. This eliminates the need to examine the whole
206 -- tree in a separate pass.
208 -- * Detect and diagnose calls in preelaborable or pure units, including
211 -- This diagnostic is carried out during the Recording phase because it
212 -- does not need the heavy recursive traversal done by the Processing
215 -- * Detect and diagnose guaranteed ABEs caused by instantiations,
216 -- calls, and task activation.
218 -- The issues detected by the ABE mechanism are reported as warnings
219 -- because they do not violate Ada semantics. Forward instantiations
220 -- may thus reach gigi, however gigi cannot handle certain kinds of
221 -- premature instantiations and may crash. To avoid this limitation,
222 -- the ABE mechanism must identify forward instantiations as early as
223 -- possible and suppress their bodies. Calls and task activations are
224 -- included in this category for completeness.
226 ----------------------
227 -- Processing phase --
228 ----------------------
230 -- The Processing phase is a separate pass which starts after instantiating
231 -- and/or inlining of bodies, but before the removal of Ghost code. It has
232 -- the following objectives:
234 -- * Examine all top-level scenarios saved during the Recording phase
236 -- The top-level scenarios act as roots for depth-first traversal of
237 -- the call/instantiation/task activation graph. The traversal stops
238 -- when an outgoing edge leaves the main unit.
240 -- * Depending on the elaboration model in effect, perform the following
243 -- - Dynamic model - Diagnose guaranteed ABEs and install run-time
244 -- conditional ABE checks.
246 -- - SPARK model - Enforce the SPARK elaboration rules
248 -- - Static model - Diagnose conditional/guaranteed ABEs, install
249 -- run-time conditional ABE checks, and guarantee the elaboration
250 -- of external units.
252 -- * Examine nested scenarios
254 -- Nested scenarios discovered during the depth-first traversal are
255 -- in turn subjected to the same actions outlined above and examined
256 -- for the next level of nested scenarios.
262 -- +------------------------ Recording phase ---------------------------+
264 -- | Record_Elaboration_Scenario |
266 -- | +--> Check_Preelaborated_Call |
268 -- | +--> Process_Guaranteed_ABE |
270 -- +------------------------- | --------------------------------------+
274 -- Top_Level_Scenarios
275 -- +-----------+-----------+ .. +-----------+
276 -- | Scenario1 | Scenario2 | .. | ScenarioN |
277 -- +-----------+-----------+ .. +-----------+
280 -- +------------------------- | --------------------------------------+
282 -- | Check_Elaboration_Scenarios |
285 -- | +----------- Process_Scenario <-----------+ |
287 -- | +--> Process_Access Is_Suitable_Scenario |
289 -- | +--> Process_Activation_Call --+ | |
290 -- | | +---> Traverse_Body |
291 -- | +--> Process_Call -------------+ |
293 -- | +--> Process_Instantiation |
295 -- | +--> Process_Variable_Assignment |
297 -- | +--> Process_Variable_Reference |
299 -- +------------------------- Processing phase -------------------------+
301 ----------------------
302 -- Important points --
303 ----------------------
305 -- The Processing phase starts after the analysis, resolution, expansion
306 -- phase has completed. As a result, no current semantic information is
307 -- available. The scope stack is empty, global flags such as In_Instance
308 -- or Inside_A_Generic become useless. To remedy this, the ABE mechanism
309 -- must either save or recompute semantic information.
311 -- Expansion heavily transforms calls and to some extent instantiations. To
312 -- remedy this, the ABE mechanism generates N_Call_Marker nodes in order to
313 -- capture the target and relevant attributes of the original call.
315 -- The diagnostics of the ABE mechanism depend on accurate source locations
316 -- to determine the spacial relation of nodes.
322 -- The following switches may be used to control the behavior of the ABE
325 -- -gnatdE elaboration checks on predefined units
327 -- The ABE mechanism considers scenarios which appear in internal
328 -- units (Ada, GNAT, Interfaces, System).
330 -- -gnatd.G ignore calls through generic formal parameters for elaboration
332 -- The ABE mechanism does not generate N_Call_Marker nodes for
333 -- calls which occur in expanded instances, and invoke generic
334 -- actual subprograms through generic formal subprograms. As a
335 -- result, the calls are not recorded or processed.
337 -- If switches -gnatd.G and -gnatdL are used together, then the
338 -- ABE mechanism effectively ignores all calls which cause the
339 -- elaboration flow to "leave" the instance.
341 -- -gnatdL ignore external calls from instances for elaboration
343 -- The ABE mechanism does not generate N_Call_Marker nodes for
344 -- calls which occur in expanded instances, do not invoke generic
345 -- actual subprograms through formal subprograms, and the target
346 -- is external to the instance. As a result, the calls are not
347 -- recorded or processed.
349 -- If switches -gnatd.G and -gnatdL are used together, then the
350 -- ABE mechanism effectively ignores all calls which cause the
351 -- elaboration flow to "leave" the instance.
353 -- -gnatd.o conservative elaboration order for indirect calls
355 -- The ABE mechanism treats '[Unrestricted_]Access of an entry,
356 -- operator, or subprogram as an immediate invocation of the
357 -- target. As a result, it performs ABE checks and diagnostics on
358 -- the immediate call.
360 -- -gnatd.U ignore indirect calls for static elaboration
362 -- The ABE mechanism does not consider '[Unrestricted_]Access of
363 -- entries, operators, and subprograms. As a result, the scenarios
364 -- are not recorder or processed.
366 -- -gnatd.v enforce SPARK elaboration rules in SPARK code
368 -- The ABE mechanism applies some of the SPARK elaboration rules
369 -- defined in the SPARK reference manual, chapter 7.7. Note that
370 -- certain rules are always enforced, regardless of whether the
373 -- -gnatd.y disable implicit pragma Elaborate_All on task bodies
375 -- The ABE mechanism does not generate implicit Elaborate_All when
376 -- the need for the pragma came from a task body.
378 -- -gnatE dynamic elaboration checking mode enabled
380 -- The ABE mechanism assumes that any scenario is elaborated or
381 -- invoked by elaboration code. The ABE mechanism performs very
382 -- little diagnostics and generates condintional ABE checks to
383 -- detect ABE issues at run-time.
385 -- -gnatel turn on info messages on generated Elaborate[_All] pragmas
387 -- The ABE mechanism produces information messages on generated
388 -- implicit Elabote[_All] pragmas along with traceback showing
389 -- why the pragma was generated. In addition, the ABE mechanism
390 -- produces information messages for each scenario elaborated or
391 -- invoked by elaboration code.
393 -- -gnateL turn off info messages on generated Elaborate[_All] pragmas
395 -- The complimentary switch for -gnatel.
397 -- -gnatwl turn on warnings for elaboration problems
399 -- The ABE mechanism produces warnings on detected ABEs along with
400 -- traceback showing the graph of the ABE.
402 -- -gnatwL turn off warnings for elaboration problems
404 -- The complimentary switch for -gnatwl.
406 -- -gnatw.f turn on warnings for suspicious Subp'Access
408 -- The ABE mechanism treats '[Unrestricted_]Access of an entry,
409 -- operator, or subprogram as a pseudo invocation of the target.
410 -- As a result, it performs ABE diagnostics on the pseudo call.
412 -- -gnatw.F turn off warnings for suspicious Subp'Access
414 -- The complimentary switch for -gnatw.f.
416 ---------------------------
417 -- Adding a new scenario --
418 ---------------------------
420 -- The following steps describe how to add a new elaboration scenario and
421 -- preserve the existing architecture.
423 -- 1) If necessary, update predicate Is_Scenario
425 -- 2) Add predicate Is_Suitable_xxx. Include a call to it in predicate
426 -- Is_Suitable_Scenario.
428 -- 3) Update routine Record_Elaboration_Scenario
430 -- 4) Add routine Process_xxx. Include a call to it in Process_Scenario.
432 -- 5) Add routine Info_xxx. Include a call to it in Process_xxx.
434 -- 6) Add routine Output_xxx. Include a call to it in routine
435 -- Output_Active_Scenarios.
437 -- 7) If necessary, add a new Extract_xxx_Attributes routine
439 -- 8) If necessary, update routine Is_Potential_Scenario
441 -------------------------
442 -- Adding a new target --
443 -------------------------
445 -- The following steps describe how to add a new elaboration target and
446 -- preserve the existing architecture.
448 -- 1) Add predicate Is_xxx.
450 -- 2) Update predicates Is_Ada_Semantic_Target, Is_Bridge_Target, or
451 -- Is_SPARK_Semantic_Target. If necessary, create a new category.
453 -- 3) Update the appropriate Info_xxx routine.
455 -- 4) Update the appropriate Output_xxx routine.
457 -- 5) Update routine Extract_Target_Attributes. If necessary, create a
458 -- new Extract_xxx routine.
460 --------------------------
461 -- Debugging ABE issues --
462 --------------------------
464 -- * If the issue involves a call, ensure that the call is eligible for ABE
465 -- processing and receives a corresponding call marker. The routines of
469 -- Record_Elaboration_Scenario
471 -- * If the issue involves an arbitrary scenario, ensure that the scenario
472 -- is either recorded, or is successfully recognized while traversing a
473 -- body. The routines of interest are
475 -- Record_Elaboration_Scenario
479 -- * If the issue involves a circularity in the elaboration order, examine
480 -- the ALI files and look for the following encodings next to units:
482 -- E indicates a source Elaborate
484 -- EA indicates a source Elaborate_All
486 -- AD indicates an implicit Elaborate_All
488 -- ED indicates an implicit Elaborate
490 -- If possible, compare these encodings with those generated by the old
491 -- ABE mechanism. The routines of interest are
493 -- Ensure_Prior_Elaboration
499 -- The following type captures relevant attributes which pertain to a call
501 type Call_Attributes
is record
502 Elab_Checks_OK
: Boolean;
503 -- This flag is set when the call has elaboration checks enabled
505 From_Source
: Boolean;
506 -- This flag is set when the call comes from source
508 Ghost_Mode_Ignore
: Boolean;
509 -- This flag is set when the call appears in a region subject to pragma
510 -- Ghost with policy Ignore.
512 In_Declarations
: Boolean;
513 -- This flag is set when the call appears at the declaration level
515 Is_Dispatching
: Boolean;
516 -- This flag is set when the call is dispatching
518 SPARK_Mode_On
: Boolean;
519 -- This flag is set when the call appears in a region subject to pragma
520 -- SPARK_Mode with value On.
523 -- The following type captures relevant attributes which pertain to the
524 -- prior elaboration of a unit. This type is coupled together with a unit
525 -- to form a key -> value relationship.
527 type Elaboration_Attributes
is record
528 Source_Pragma
: Node_Id
;
529 -- This attribute denotes a source Elaborate or Elaborate_All pragma
530 -- which guarantees the prior elaboration of some unit with respect
531 -- to the main unit. The pragma may come from the following contexts:
534 -- * The spec of the main unit (if applicable)
535 -- * Any parent spec of the main unit (if applicable)
536 -- * Any parent subunit of the main unit (if applicable)
538 -- The attribute remains Empty if no such pragma is available. Source
539 -- pragmas play a role in satisfying SPARK elaboration requirements.
541 With_Clause
: Node_Id
;
542 -- This attribute denotes an internally generated or source with clause
543 -- for some unit withed by the main unit. With clauses carry flags which
544 -- represent implicit Elaborate or Elaborate_All pragmas. These clauses
545 -- play a role in supplying the elaboration dependencies to binde.
548 No_Elaboration_Attributes
: constant Elaboration_Attributes
:=
549 (Source_Pragma
=> Empty
,
550 With_Clause
=> Empty
);
552 -- The following type captures relevant attributes which pertain to an
555 type Instantiation_Attributes
is record
556 Elab_Checks_OK
: Boolean;
557 -- This flag is set when the instantiation has elaboration checks
560 Ghost_Mode_Ignore
: Boolean;
561 -- This flag is set when the instantiation appears in a region subject
562 -- to pragma Ghost with policy ignore, or starts one such region.
564 In_Declarations
: Boolean;
565 -- This flag is set when the instantiation appears at the declaration
568 SPARK_Mode_On
: Boolean;
569 -- This flag is set when the instantiation appears in a region subject
570 -- to pragma SPARK_Mode with value On, or starts one such region.
573 -- The following type captures relevant attributes which pertain to a
576 type Target_Attributes
is record
577 Elab_Checks_OK
: Boolean;
578 -- This flag is set when the target has elaboration checks enabled
580 From_Source
: Boolean;
581 -- This flag is set when the target comes from source
583 Ghost_Mode_Ignore
: Boolean;
584 -- This flag is set when the target appears in a region subject to
585 -- pragma Ghost with policy ignore, or starts one such region.
587 SPARK_Mode_On
: Boolean;
588 -- This flag is set when the target appears in a region subject to
589 -- pragma SPARK_Mode with value On, or starts one such region.
592 -- This attribute denotes the declaration of Spec_Id
595 -- This attribute denotes the top unit where Spec_Id resides
597 -- The semantics of the following attributes depend on the target
603 -- The target is a generic package or a subprogram
605 -- * Body_Barf - Empty
607 -- * Body_Decl - This attribute denotes the generic or subprogram
610 -- * Spec_Id - This attribute denotes the entity of the generic
611 -- package or subprogram.
613 -- The target is a protected entry
615 -- * Body_Barf - This attribute denotes the body of the barrier
616 -- function if expansion took place, otherwise it is Empty.
618 -- * Body_Decl - This attribute denotes the body of the procedure
619 -- which emulates the entry if expansion took place, otherwise it
620 -- denotes the body of the protected entry.
622 -- * Spec_Id - This attribute denotes the entity of the procedure
623 -- which emulates the entry if expansion took place, otherwise it
624 -- denotes the protected entry.
626 -- The target is a protected subprogram
628 -- * Body_Barf - Empty
630 -- * Body_Decl - This attribute denotes the body of the protected or
631 -- unprotected version of the protected subprogram if expansion took
632 -- place, otherwise it denotes the body of the protected subprogram.
634 -- * Spec_Id - This attribute denotes the entity of the protected or
635 -- unprotected version of the protected subprogram if expansion took
636 -- place, otherwise it is the entity of the protected subprogram.
638 -- The target is a task entry
640 -- * Body_Barf - Empty
642 -- * Body_Decl - This attribute denotes the body of the procedure
643 -- which emulates the task body if expansion took place, otherwise
644 -- it denotes the body of the task type.
646 -- * Spec_Id - This attribute denotes the entity of the procedure
647 -- which emulates the task body if expansion took place, otherwise
648 -- it denotes the entity of the task type.
651 -- The following type captures relevant attributes which pertain to a task
654 type Task_Attributes
is record
656 -- This attribute denotes the declaration of the procedure body which
657 -- emulates the behaviour of the task body.
659 Elab_Checks_OK
: Boolean;
660 -- This flag is set when the task type has elaboration checks enabled
662 Ghost_Mode_Ignore
: Boolean;
663 -- This flag is set when the task type appears in a region subject to
664 -- pragma Ghost with policy ignore, or starts one such region.
666 SPARK_Mode_On
: Boolean;
667 -- This flag is set when the task type appears in a region subject to
668 -- pragma SPARK_Mode with value On, or starts one such region.
671 -- This attribute denotes the entity of the initial declaration of the
672 -- procedure body which emulates the behaviour of the task body.
675 -- This attribute denotes the declaration of the task type
678 -- This attribute denotes the entity of the compilation unit where the
679 -- task type resides.
682 -- The following type captures relevant attributes which pertain to a
685 type Variable_Attributes
is record
687 -- This attribute denotes the entity of the compilation unit where the
691 ---------------------
692 -- Data structures --
693 ---------------------
695 -- The following table stores the elaboration status of all units withed by
698 Elaboration_Context_Max
: constant := 1009;
700 type Elaboration_Context_Index
is range 0 .. Elaboration_Context_Max
- 1;
702 function Elaboration_Context_Hash
703 (Key
: Entity_Id
) return Elaboration_Context_Index
;
704 -- Obtain the hash value of entity Key
706 package Elaboration_Context
is new Simple_HTable
707 (Header_Num
=> Elaboration_Context_Index
,
708 Element
=> Elaboration_Attributes
,
709 No_Element
=> No_Elaboration_Attributes
,
711 Hash
=> Elaboration_Context_Hash
,
714 -- The following table stores a status flag for each top-level scenario
715 -- recorded in table Top_Level_Scenarios.
717 Recorded_Top_Level_Scenarios_Max
: constant := 503;
719 type Recorded_Top_Level_Scenarios_Index
is
720 range 0 .. Recorded_Top_Level_Scenarios_Max
- 1;
722 function Recorded_Top_Level_Scenarios_Hash
723 (Key
: Node_Id
) return Recorded_Top_Level_Scenarios_Index
;
724 -- Obtain the hash value of entity Key
726 package Recorded_Top_Level_Scenarios
is new Simple_HTable
727 (Header_Num
=> Recorded_Top_Level_Scenarios_Index
,
731 Hash
=> Recorded_Top_Level_Scenarios_Hash
,
734 -- The following table stores all active scenarios in a recursive traversal
735 -- starting from a top-level scenario. This table must be maintained in a
738 package Scenario_Stack
is new Table
.Table
739 (Table_Component_Type
=> Node_Id
,
740 Table_Index_Type
=> Int
,
741 Table_Low_Bound
=> 1,
743 Table_Increment
=> 100,
744 Table_Name
=> "Scenario_Stack");
746 -- The following table stores all top-level scenario saved during the
747 -- Recording phase. The contents of this table act as traversal roots
748 -- later in the Processing phase. This table must be maintained in a
751 package Top_Level_Scenarios
is new Table
.Table
752 (Table_Component_Type
=> Node_Id
,
753 Table_Index_Type
=> Int
,
754 Table_Low_Bound
=> 1,
755 Table_Initial
=> 1000,
756 Table_Increment
=> 100,
757 Table_Name
=> "Top_Level_Scenarios");
759 -- The following table stores the bodies of all eligible scenarios visited
760 -- during a traversal starting from a top-level scenario. The contents of
761 -- this table must be reset upon each new traversal.
763 Visited_Bodies_Max
: constant := 511;
765 type Visited_Bodies_Index
is range 0 .. Visited_Bodies_Max
- 1;
767 function Visited_Bodies_Hash
(Key
: Node_Id
) return Visited_Bodies_Index
;
768 -- Obtain the hash value of node Key
770 package Visited_Bodies
is new Simple_HTable
771 (Header_Num
=> Visited_Bodies_Index
,
775 Hash
=> Visited_Bodies_Hash
,
778 -----------------------
779 -- Local subprograms --
780 -----------------------
782 procedure Check_Preelaborated_Call
(Call
: Node_Id
);
783 -- Determine whether entry, operator, or subprogram call Call appears at
784 -- the library level of a preelaborated unit. Emit an error if this is the
787 function Compilation_Unit
(Unit_Id
: Entity_Id
) return Node_Id
;
788 pragma Inline
(Compilation_Unit
);
789 -- Return the N_Compilation_Unit node of unit Unit_Id
791 procedure Elab_Msg_NE
797 pragma Inline
(Elab_Msg_NE
);
798 -- Wrapper around Error_Msg_NE. Emit message Msg concerning arbitrary node
799 -- N and entity. If flag Info_Msg is set, the routine emits an information
800 -- message, otherwise it emits an error. If flag In_SPARK is set, then
801 -- string " in SPARK" is added to the end of the message.
803 procedure Ensure_Prior_Elaboration
806 In_Partial_Fin
: Boolean;
807 In_Task_Body
: Boolean);
808 -- Guarantee the elaboration of unit Unit_Id with respect to the main unit.
809 -- N denotes the related scenario. Flag In_Partial_Fin should be set when
810 -- the need for elaboration is initiated by a partial finalization routine.
811 -- Flag In_Task_Body should be set when the need for prior elaboration is
812 -- initiated from a task body.
814 procedure Ensure_Prior_Elaboration_Dynamic
818 -- Guarantee the elaboration of unit Unit_Id with respect to the main unit
819 -- by suggesting the use of Elaborate[_All] with name Prag_Nam. N denotes
820 -- the related scenario.
822 procedure Ensure_Prior_Elaboration_Static
826 -- Guarantee the elaboration of unit Unit_Id with respect to the main unit
827 -- by installing an implicit Elaborate[_All] pragma with name Prag_Nam. N
828 -- denotes the related scenario.
830 function Extract_Assignment_Name
(Asmt
: Node_Id
) return Node_Id
;
831 pragma Inline
(Extract_Assignment_Name
);
832 -- Obtain the Name attribute of assignment statement Asmt
834 procedure Extract_Call_Attributes
836 Target_Id
: out Entity_Id
;
837 Attrs
: out Call_Attributes
);
838 pragma Inline
(Extract_Call_Attributes
);
839 -- Obtain attributes Attrs associated with call Call. Target_Id is the
840 -- entity of the call target.
842 function Extract_Call_Name
(Call
: Node_Id
) return Node_Id
;
843 pragma Inline
(Extract_Call_Name
);
844 -- Obtain the Name attribute of entry or subprogram call Call
846 procedure Extract_Instance_Attributes
848 Inst_Body
: out Node_Id
;
849 Inst_Decl
: out Node_Id
);
850 pragma Inline
(Extract_Instance_Attributes
);
851 -- Obtain body Inst_Body and spec Inst_Decl of expanded instance Exp_Inst
853 procedure Extract_Instantiation_Attributes
856 Inst_Id
: out Entity_Id
;
857 Gen_Id
: out Entity_Id
;
858 Attrs
: out Instantiation_Attributes
);
859 pragma Inline
(Extract_Instantiation_Attributes
);
860 -- Obtain attributes Attrs associated with expanded instantiation Exp_Inst.
861 -- Inst is the instantiation. Inst_Id is the entity of the instance. Gen_Id
862 -- is the entity of the generic unit being instantiated.
864 procedure Extract_Target_Attributes
865 (Target_Id
: Entity_Id
;
866 Attrs
: out Target_Attributes
);
867 -- Obtain attributes Attrs associated with an entry, package, or subprogram
868 -- denoted by Target_Id.
870 procedure Extract_Task_Attributes
872 Attrs
: out Task_Attributes
);
873 pragma Inline
(Extract_Task_Attributes
);
874 -- Obtain attributes Attrs associated with task type Typ
876 procedure Extract_Variable_Reference_Attributes
878 Var_Id
: out Entity_Id
;
879 Attrs
: out Variable_Attributes
);
880 pragma Inline
(Extract_Variable_Reference_Attributes
);
881 -- Obtain attributes Attrs associated with reference Ref that mentions
884 function Find_Code_Unit
(N
: Node_Or_Entity_Id
) return Entity_Id
;
885 pragma Inline
(Find_Code_Unit
);
886 -- Return the code unit which contains arbitrary node or entity N. This
887 -- is the unit of the file which physically contains the related construct
888 -- denoted by N except when N is within an instantiation. In that case the
889 -- unit is that of the top-level instantiation.
891 procedure Find_Elaborated_Units
;
892 -- Populate table Elaboration_Context with all units which have prior
893 -- elaboration with respect to the main unit.
895 function Find_Enclosing_Instance
(N
: Node_Id
) return Node_Id
;
896 pragma Inline
(Find_Enclosing_Instance
);
897 -- Find the declaration or body of the nearest expanded instance which
898 -- encloses arbitrary node N. Return Empty if no such instance exists.
900 function Find_Top_Unit
(N
: Node_Or_Entity_Id
) return Entity_Id
;
901 pragma Inline
(Find_Top_Unit
);
902 -- Return the top unit which contains arbitrary node or entity N. The unit
903 -- is obtained by logically unwinding instantiations and subunits when N
904 -- resides within one.
906 function Find_Unit_Entity
(N
: Node_Id
) return Entity_Id
;
907 pragma Inline
(Find_Unit_Entity
);
908 -- Return the entity of unit N
910 function First_Formal_Type
(Subp_Id
: Entity_Id
) return Entity_Id
;
911 pragma Inline
(First_Formal_Type
);
912 -- Return the type of subprogram Subp_Id's first formal parameter. If the
913 -- subprogram lacks formal parameters, return Empty.
915 function Has_Body
(Pack_Decl
: Node_Id
) return Boolean;
916 -- Determine whether package declaration Pack_Decl has a corresponding body
917 -- or would eventually have one.
919 function Has_Prior_Elaboration
920 (Unit_Id
: Entity_Id
;
921 Context_OK
: Boolean := False;
922 Elab_Body_OK
: Boolean := False;
923 Same_Unit_OK
: Boolean := False) return Boolean;
924 pragma Inline
(Has_Prior_Elaboration
);
925 -- Determine whether unit Unit_Id is elaborated prior to the main unit.
926 -- If flag Context_OK is set, the routine considers the following case
927 -- as valid prior elaboration:
929 -- * Unit_Id is in the elaboration context of the main unit
931 -- If flag Elab_Body_OK is set, the routine considers the following case
932 -- as valid prior elaboration:
934 -- * Unit_Id has pragma Elaborate_Body and is not the main unit
936 -- If flag Same_Unit_OK is set, the routine considers the following cases
937 -- as valid prior elaboration:
939 -- * Unit_Id is the main unit
941 -- * Unit_Id denotes the spec of the main unit body
943 function In_External_Instance
945 Target_Decl
: Node_Id
) return Boolean;
946 pragma Inline
(In_External_Instance
);
947 -- Determine whether a target desctibed by its declaration Target_Decl
948 -- resides in a package instance which is external to scenario N.
950 function In_Main_Context
(N
: Node_Id
) return Boolean;
951 pragma Inline
(In_Main_Context
);
952 -- Determine whether arbitrary node N appears within the main compilation
955 function In_Same_Context
958 Nested_OK
: Boolean := False) return Boolean;
959 -- Determine whether two arbitrary nodes N1 and N2 appear within the same
960 -- context ignoring enclosing library levels. Nested_OK should be set when
961 -- the context of N1 can enclose that of N2.
965 Target_Id
: Entity_Id
;
968 -- Output information concerning call Call which invokes target Target_Id.
969 -- If flag Info_Msg is set, the routine emits an information message,
970 -- otherwise it emits an error. If flag In_SPARK is set, then the string
971 -- " in SPARK" is added to the end of the message.
973 procedure Info_Instantiation
978 pragma Inline
(Info_Instantiation
);
979 -- Output information concerning instantiation Inst which instantiates
980 -- generic unit Gen_Id. If flag Info_Msg is set, the routine emits an
981 -- information message, otherwise it emits an error. If flag In_SPARK
982 -- is set, then string " in SPARK" is added to the end of the message.
984 procedure Info_Variable_Reference
989 pragma Inline
(Info_Variable_Reference
);
990 -- Output information concerning reference Ref which mentions variable
991 -- Var_Id. If flag Info_Msg is set, the routine emits an information
992 -- message, otherwise it emits an error. If flag In_SPARK is set, then
993 -- string " in SPARK" is added to the end of the message.
995 function Insertion_Node
(N
: Node_Id
; Ins_Nod
: Node_Id
) return Node_Id
;
996 pragma Inline
(Insertion_Node
);
997 -- Obtain the proper insertion node of an ABE check or failure for scenario
998 -- N and candidate insertion node Ins_Nod.
1000 procedure Install_ABE_Check
1004 -- Insert a run-time ABE check for elaboration scenario N which verifies
1005 -- whether arbitrary entity Id is elaborated. The check in inserted prior
1008 procedure Install_ABE_Check
1010 Target_Id
: Entity_Id
;
1011 Target_Decl
: Node_Id
;
1012 Target_Body
: Node_Id
;
1014 -- Insert a run-time ABE check for elaboration scenario N which verifies
1015 -- whether target Target_Id with initial declaration Target_Decl and body
1016 -- Target_Body is elaborated. The check is inserted prior to node Ins_Nod.
1018 procedure Install_ABE_Failure
(N
: Node_Id
; Ins_Nod
: Node_Id
);
1019 -- Insert a Program_Error concerning a guaranteed ABE for elaboration
1020 -- scenario N. The failure is inserted prior to node Node_Id.
1022 function Is_Accept_Alternative_Proc
(Id
: Entity_Id
) return Boolean;
1023 pragma Inline
(Is_Accept_Alternative_Proc
);
1024 -- Determine whether arbitrary entity Id denotes an internally generated
1025 -- procedure which encapsulates the statements of an accept alternative.
1027 function Is_Activation_Proc
(Id
: Entity_Id
) return Boolean;
1028 pragma Inline
(Is_Activation_Proc
);
1029 -- Determine whether arbitrary entity Id denotes a runtime procedure in
1030 -- charge with activating tasks.
1032 function Is_Ada_Semantic_Target
(Id
: Entity_Id
) return Boolean;
1033 pragma Inline
(Is_Ada_Semantic_Target
);
1034 -- Determine whether arbitrary entity Id nodes a source or internally
1035 -- generated subprogram which emulates Ada semantics.
1037 function Is_Bodiless_Subprogram
(Subp_Id
: Entity_Id
) return Boolean;
1038 pragma Inline
(Is_Bodiless_Subprogram
);
1039 -- Determine whether subprogram Subp_Id will never have a body
1041 function Is_Controlled_Proc
1042 (Subp_Id
: Entity_Id
;
1043 Subp_Nam
: Name_Id
) return Boolean;
1044 pragma Inline
(Is_Controlled_Proc
);
1045 -- Determine whether subprogram Subp_Id denotes controlled type primitives
1046 -- Adjust, Finalize, or Initialize as denoted by name Subp_Nam.
1048 function Is_Default_Initial_Condition_Proc
(Id
: Entity_Id
) return Boolean;
1049 pragma Inline
(Is_Default_Initial_Condition_Proc
);
1050 -- Determine whether arbitrary entity Id denotes internally generated
1051 -- routine Default_Initial_Condition.
1053 function Is_Finalizer_Proc
(Id
: Entity_Id
) return Boolean;
1054 pragma Inline
(Is_Finalizer_Proc
);
1055 -- Determine whether arbitrary entity Id denotes internally generated
1056 -- routine _Finalizer.
1058 function Is_Guaranteed_ABE
1060 Target_Decl
: Node_Id
;
1061 Target_Body
: Node_Id
) return Boolean;
1062 pragma Inline
(Is_Guaranteed_ABE
);
1063 -- Determine whether scenario N with a target described by its initial
1064 -- declaration Target_Decl and body Target_Decl results in a guaranteed
1067 function Is_Initial_Condition_Proc
(Id
: Entity_Id
) return Boolean;
1068 pragma Inline
(Is_Initial_Condition_Proc
);
1069 -- Determine whether arbitrary entity Id denotes internally generated
1070 -- routine Initial_Condition.
1072 function Is_Initialized
(Obj_Decl
: Node_Id
) return Boolean;
1073 pragma Inline
(Is_Initialized
);
1074 -- Determine whether object declaration Obj_Decl is initialized
1076 function Is_Invariant_Proc
(Id
: Entity_Id
) return Boolean;
1077 pragma Inline
(Is_Invariant_Proc
);
1078 -- Determine whether arbitrary entity Id denotes an invariant procedure
1080 function Is_Non_Library_Level_Encapsulator
(N
: Node_Id
) return Boolean;
1081 pragma Inline
(Is_Non_Library_Level_Encapsulator
);
1082 -- Determine whether arbitrary node N is a non-library encapsulator
1084 function Is_Partial_Invariant_Proc
(Id
: Entity_Id
) return Boolean;
1085 pragma Inline
(Is_Partial_Invariant_Proc
);
1086 -- Determine whether arbitrary entity Id denotes a partial invariant
1089 function Is_Postconditions_Proc
(Id
: Entity_Id
) return Boolean;
1090 pragma Inline
(Is_Postconditions_Proc
);
1091 -- Determine whether arbitrary entity Id denotes internally generated
1092 -- routine _Postconditions.
1094 function Is_Preelaborated_Unit
(Id
: Entity_Id
) return Boolean;
1095 pragma Inline
(Is_Preelaborated_Unit
);
1096 -- Determine whether arbitrary entity Id denotes a unit which is subject to
1097 -- one of the following pragmas:
1101 -- * Remote_Call_Interface
1105 function Is_Protected_Entry
(Id
: Entity_Id
) return Boolean;
1106 pragma Inline
(Is_Protected_Entry
);
1107 -- Determine whether arbitrary entity Id denotes a protected entry
1109 function Is_Protected_Subp
(Id
: Entity_Id
) return Boolean;
1110 pragma Inline
(Is_Protected_Subp
);
1111 -- Determine whether entity Id denotes a protected subprogram
1113 function Is_Protected_Body_Subp
(Id
: Entity_Id
) return Boolean;
1114 pragma Inline
(Is_Protected_Body_Subp
);
1115 -- Determine whether entity Id denotes the protected or unprotected version
1116 -- of a protected subprogram.
1118 function Is_Recorded_Top_Level_Scenario
(N
: Node_Id
) return Boolean;
1119 pragma Inline
(Is_Recorded_Top_Level_Scenario
);
1120 -- Determine whether arbitrary node is a recorded top-level scenario which
1121 -- appears in table Top_Level_Scenarios.
1123 function Is_Safe_Activation
1125 Task_Decl
: Node_Id
) return Boolean;
1126 pragma Inline
(Is_Safe_Activation
);
1127 -- Determine whether call Call which activates a task object described by
1128 -- declaration Task_Decl is always ABE-safe.
1130 function Is_Safe_Call
1132 Target_Attrs
: Target_Attributes
) return Boolean;
1133 pragma Inline
(Is_Safe_Call
);
1134 -- Determine whether call Call which invokes a target described by
1135 -- attributes Target_Attrs is always ABE-safe.
1137 function Is_Safe_Instantiation
1139 Gen_Attrs
: Target_Attributes
) return Boolean;
1140 pragma Inline
(Is_Safe_Instantiation
);
1141 -- Determine whether instance Inst which instantiates a generic unit
1142 -- described by attributes Gen_Attrs is always ABE-safe.
1144 function Is_Same_Unit
1145 (Unit_1
: Entity_Id
;
1146 Unit_2
: Entity_Id
) return Boolean;
1147 pragma Inline
(Is_Same_Unit
);
1148 -- Determine whether entities Unit_1 and Unit_2 denote the same unit
1150 function Is_Scenario
(N
: Node_Id
) return Boolean;
1151 pragma Inline
(Is_Scenario
);
1152 -- Determine whether attribute node N denotes a scenario. The scenario may
1153 -- not necessarily be eligible for ABE processing.
1155 function Is_SPARK_Semantic_Target
(Id
: Entity_Id
) return Boolean;
1156 pragma Inline
(Is_SPARK_Semantic_Target
);
1157 -- Determine whether arbitrary entity Id nodes a source or internally
1158 -- generated subprogram which emulates SPARK semantics.
1160 function Is_Suitable_Access
(N
: Node_Id
) return Boolean;
1161 pragma Inline
(Is_Suitable_Access
);
1162 -- Determine whether arbitrary node N denotes a suitable attribute for ABE
1165 function Is_Suitable_Call
(N
: Node_Id
) return Boolean;
1166 pragma Inline
(Is_Suitable_Call
);
1167 -- Determine whether arbitrary node N denotes a suitable call for ABE
1170 function Is_Suitable_Instantiation
(N
: Node_Id
) return Boolean;
1171 pragma Inline
(Is_Suitable_Instantiation
);
1172 -- Determine whether arbitrary node N is a suitable instantiation for ABE
1175 function Is_Suitable_Scenario
(N
: Node_Id
) return Boolean;
1176 pragma Inline
(Is_Suitable_Scenario
);
1177 -- Determine whether arbitrary node N is a suitable scenario for ABE
1180 function Is_Suitable_Variable_Assignment
(N
: Node_Id
) return Boolean;
1181 pragma Inline
(Is_Suitable_Variable_Assignment
);
1182 -- Determine whether arbitrary node N denotes a suitable assignment for ABE
1185 function Is_Suitable_Variable_Reference
(N
: Node_Id
) return Boolean;
1186 pragma Inline
(Is_Suitable_Variable_Reference
);
1187 -- Determine whether arbitrary node N is a suitable variable reference for
1190 function Is_Task_Entry
(Id
: Entity_Id
) return Boolean;
1191 pragma Inline
(Is_Task_Entry
);
1192 -- Determine whether arbitrary entity Id denotes a task entry
1194 function Is_Up_Level_Target
(Target_Decl
: Node_Id
) return Boolean;
1195 pragma Inline
(Is_Up_Level_Target
);
1196 -- Determine whether the current root resides at the declaration level. If
1197 -- this is the case, determine whether a target described by declaration
1198 -- Target_Decl is within a context which encloses the current root or is in
1199 -- a different unit.
1201 procedure Meet_Elaboration_Requirement
1203 Target_Id
: Entity_Id
;
1205 -- Determine whether elaboration requirement Req_Nam for scenario N with
1206 -- target Target_Id is met by the context of the main unit using the SPARK
1207 -- rules. Req_Nam must denote either Elaborate or Elaborate_All. Emit an
1208 -- error if this is not the case.
1210 function Non_Private_View
(Typ
: Entity_Id
) return Entity_Id
;
1211 pragma Inline
(Non_Private_View
);
1212 -- Return the full view of private type Typ if available, otherwise return
1215 procedure Output_Active_Scenarios
(Error_Nod
: Node_Id
);
1216 -- Output the contents of the active scenario stack from earliest to latest
1217 -- to supplement an earlier error emitted for node Error_Nod.
1219 procedure Pop_Active_Scenario
(N
: Node_Id
);
1220 pragma Inline
(Pop_Active_Scenario
);
1221 -- Pop the top of the scenario stack. A check is made to ensure that the
1222 -- scenario being removed is the same as N.
1224 procedure Process_Access
1226 In_Partial_Fin
: Boolean;
1227 In_Task_Body
: Boolean);
1228 -- Perform ABE checks and diagnostics for 'Access to entry, operator, or
1229 -- subprogram denoted by Attr. Flag In_Partial_Fin shoud be set when the
1230 -- processing is initiated by a partial finalization routine. Flag
1231 -- In_Task_Body should be set when the processing is initiated from a task
1235 with procedure Process_Single_Activation
1237 Call_Attrs
: Call_Attributes
;
1239 Task_Attrs
: Task_Attributes
;
1240 In_Partial_Fin
: Boolean;
1241 In_Task_Body
: Boolean);
1242 -- Perform ABE checks and diagnostics for task activation call Call
1243 -- which activates task Obj_Id. Call_Attrs are the attributes of the
1244 -- activation call. Task_Attrs are the attributes of the task type.
1245 -- Flag In_Partial_Fin shoud be set when the processing is initiated
1246 -- by a partial finalization routine. Flag In_Task_Body should be set
1247 -- when the processing is initiated from a task body.
1249 procedure Process_Activation_Call
1251 Call_Attrs
: Call_Attributes
;
1252 In_Partial_Fin
: Boolean;
1253 In_Task_Body
: Boolean);
1254 -- Perform ABE checks and diagnostics for activation call Call by invoking
1255 -- routine Process_Single_Activation on each task object being activated.
1256 -- Call_Attrs are the attributes of the activation call. In_Partial_Fin
1257 -- shoud be set when the processing is initiated by a partial finalization
1258 -- routine. Flag In_Task_Body should be set when the processing is started
1259 -- from a task body.
1261 procedure Process_Activation_Conditional_ABE_Impl
1263 Call_Attrs
: Call_Attributes
;
1265 Task_Attrs
: Task_Attributes
;
1266 In_Partial_Fin
: Boolean;
1267 In_Task_Body
: Boolean);
1268 -- Perform common conditional ABE checks and diagnostics for call Call
1269 -- which activates task Obj_Id ignoring the Ada or SPARK rules. CAll_Attrs
1270 -- are the attributes of the activation call. Task_Attrs are the attributes
1271 -- of the task type. Flag In_Partial_Fin shoud be set when the processing
1272 -- is initiated by a partial finalization routine. Flag In_Task_Body should
1273 -- be set when the processing is initiated from a task body.
1275 procedure Process_Activation_Guaranteed_ABE_Impl
1277 Call_Attrs
: Call_Attributes
;
1279 Task_Attrs
: Task_Attributes
;
1280 In_Partial_Fin
: Boolean;
1281 In_Task_Body
: Boolean);
1282 -- Perform common guaranteed ABE checks and diagnostics for call Call which
1283 -- activates task Obj_Id ignoring the Ada or SPARK rules. Task_Attrs are
1284 -- the attributes of the task type. The following parameters are provided
1285 -- for compatibility and are unused.
1291 procedure Process_Call
1293 Call_Attrs
: Call_Attributes
;
1294 Target_Id
: Entity_Id
;
1295 In_Partial_Fin
: Boolean;
1296 In_Task_Body
: Boolean);
1297 -- Top-level dispatcher for processing of calls. Perform ABE checks and
1298 -- diagnostics for call Call which invokes target Target_Id. Call_Attrs
1299 -- are the attributes of the call. Flag In_Partial_Fin shoud be set when
1300 -- the processing is initiated by a partial finalization routine. Flag
1301 -- In_Task_Body should be set when the processing is started from a task
1304 procedure Process_Call_Ada
1306 Call_Attrs
: Call_Attributes
;
1307 Target_Id
: Entity_Id
;
1308 Target_Attrs
: Target_Attributes
;
1309 In_Partial_Fin
: Boolean;
1310 In_Task_Body
: Boolean);
1311 -- Perform ABE checks and diagnostics for call Call which invokes target
1312 -- Target_Id using the Ada rules. Call_Attrs are the attributes of the
1313 -- call. Target_Attrs are attributes of the target. Flag In_Partial_Fin
1314 -- shoud be set when the processing is initiated by a partial finalization
1315 -- routine. Flag In_Task_Body should be set when the processing is started
1316 -- from a task body.
1318 procedure Process_Call_Conditional_ABE
1320 Call_Attrs
: Call_Attributes
;
1321 Target_Id
: Entity_Id
;
1322 Target_Attrs
: Target_Attributes
;
1323 In_Partial_Fin
: Boolean);
1324 -- Perform common conditional ABE checks and diagnostics for call Call that
1325 -- invokes target Target_Id ignoring the Ada or SPARK rules. Call_Attrs are
1326 -- the attributes of the call. Target_Attrs are attributes of the target.
1327 -- Flag In_Partial_Fin shoud be set when the processing is initiated by a
1328 -- partial finalization routine.
1330 procedure Process_Call_Guaranteed_ABE
1332 Call_Attrs
: Call_Attributes
;
1333 Target_Id
: Entity_Id
);
1334 -- Perform common guaranteed ABE checks and diagnostics for call Call which
1335 -- invokes target Target_Id ignoring the Ada or SPARK rules. Call_Attrs are
1336 -- the attributes of the call.
1338 procedure Process_Call_SPARK
1340 Call_Attrs
: Call_Attributes
;
1341 Target_Id
: Entity_Id
;
1342 Target_Attrs
: Target_Attributes
;
1343 In_Partial_Fin
: Boolean);
1344 -- Perform ABE checks and diagnostics for call Call which invokes target
1345 -- Target_Id using the SPARK rules. Call_Attrs are the attributes of the
1346 -- call. Target_Attrs are attributes of the target. Flag In_Partial_Fin
1347 -- shoud be set when the processing is initiated by a partial finalization
1350 procedure Process_Guaranteed_ABE
(N
: Node_Id
);
1351 -- Top-level dispatcher for processing of scenarios which result in a
1354 procedure Process_Instantiation
1355 (Exp_Inst
: Node_Id
;
1356 In_Partial_Fin
: Boolean;
1357 In_Task_Body
: Boolean);
1358 -- Top-level dispatcher for processing of instantiations. Perform ABE
1359 -- checks and diagnostics for expanded instantiation Exp_Inst. Flag
1360 -- In_Partial_Fin shoud be set when the processing is initiated by a
1361 -- partial finalization routine. Flag In_Task_Body should be set when
1362 -- the processing is initiated from a task body.
1364 procedure Process_Instantiation_Ada
1365 (Exp_Inst
: Node_Id
;
1367 Inst_Attrs
: Instantiation_Attributes
;
1369 Gen_Attrs
: Target_Attributes
;
1370 In_Partial_Fin
: Boolean;
1371 In_Task_Body
: Boolean);
1372 -- Perform ABE checks and diagnostics for expanded instantiation Exp_Inst
1373 -- of generic Gen_Id using the Ada rules. Inst is the instantiation node.
1374 -- Inst_Attrs are the attributes of the instance. Gen_Attrs denotes the
1375 -- attributes of the generic. Flag In_Partial_Fin shoud be set when the
1376 -- processing is initiated by a partial finalization routine. In_Task_Body
1377 -- should be set when the processing is initiated from a task body.
1379 procedure Process_Instantiation_Conditional_ABE
1380 (Exp_Inst
: Node_Id
;
1382 Inst_Attrs
: Instantiation_Attributes
;
1384 Gen_Attrs
: Target_Attributes
;
1385 In_Partial_Fin
: Boolean);
1386 -- Perform common conditional ABE checks and diagnostics for expanded
1387 -- instantiation Exp_Inst of generic Gen_Id ignoring the Ada or SPARK
1388 -- rules. Inst is the instantiation node. Inst_Attrs are the attributes
1389 -- of the instance. Gen_Attrs are the attributes of the generic. Flag
1390 -- In_Partial_Fin shoud be set when the processing is initiated by a
1391 -- partial finalization routine.
1393 procedure Process_Instantiation_Guaranteed_ABE
(Exp_Inst
: Node_Id
);
1394 -- Perform common guaranteed ABE checks and diagnostics for expanded
1395 -- instantiation Exp_Inst of generic Gen_Id ignoring the Ada or SPARK
1398 procedure Process_Instantiation_SPARK
1399 (Exp_Inst
: Node_Id
;
1401 Inst_Attrs
: Instantiation_Attributes
;
1403 Gen_Attrs
: Target_Attributes
;
1404 In_Partial_Fin
: Boolean);
1405 -- Perform ABE checks and diagnostics for expanded instantiation Exp_Inst
1406 -- of generic Gen_Id using the SPARK rules. Inst is the instantiation node.
1407 -- Inst_Attrs are the attributes of the instance. Gen_Attrs denotes the
1408 -- attributes of the generic. Flag In_Partial_Fin shoud be set when the
1409 -- processing is initiated by a partial finalization routine.
1411 procedure Process_Scenario
1413 In_Partial_Fin
: Boolean := False;
1414 In_Task_Body
: Boolean := False);
1415 -- Top-level dispatcher for processing of various elaboration scenarios.
1416 -- Perform ABE checks and diagnostics for scenario N. Flag In_Partial_Fin
1417 -- shoud be set when the processing is initiated by a partial finalization
1418 -- routine. Flag In_Task_Body should be set when the processing is started
1419 -- from a task body.
1421 procedure Process_Variable_Assignment
(Asmt
: Node_Id
);
1422 -- Top-level dispatcher for processing of variable assignments. Perform ABE
1423 -- checks and diagnostics for assignment statement Asmt.
1425 procedure Process_Variable_Assignment_Ada
1427 Var_Id
: Entity_Id
);
1428 -- Perform ABE checks and diagnostics for assignment statement Asmt that
1429 -- updates the value of variable Var_Id using the Ada rules.
1431 procedure Process_Variable_Assignment_SPARK
1433 Var_Id
: Entity_Id
);
1434 -- Perform ABE checks and diagnostics for assignment statement Asmt that
1435 -- updates the value of variable Var_Id using the SPARK rules.
1437 procedure Process_Variable_Reference
(Ref
: Node_Id
);
1438 -- Top-level dispatcher for processing of variable references. Perform ABE
1439 -- checks and diagnostics for variable reference Ref.
1441 procedure Process_Variable_Reference_Read
1444 Attrs
: Variable_Attributes
);
1445 -- Perform ABE checks and diagnostics for reference Ref described by its
1446 -- attributes Attrs, that reads variable Var_Id.
1448 procedure Push_Active_Scenario
(N
: Node_Id
);
1449 pragma Inline
(Push_Active_Scenario
);
1450 -- Push scenario N on top of the scenario stack
1452 function Root_Scenario
return Node_Id
;
1453 pragma Inline
(Root_Scenario
);
1454 -- Return the top-level scenario which started a recursive search for other
1455 -- scenarios. It is assumed that there is a valid top-level scenario on the
1456 -- active scenario stack.
1458 procedure Set_Is_Recorded_Top_Level_Scenario
1460 Val
: Boolean := True);
1461 pragma Inline
(Set_Is_Recorded_Top_Level_Scenario
);
1462 -- Mark scenario N as being recorded in table Top_Level_Scenarios
1464 function Static_Elaboration_Checks
return Boolean;
1465 pragma Inline
(Static_Elaboration_Checks
);
1466 -- Determine whether the static model is in effect
1468 procedure Traverse_Body
1470 In_Partial_Fin
: Boolean;
1471 In_Task_Body
: Boolean);
1472 -- Inspect the declarations and statements of subprogram body N for
1473 -- suitable elaboration scenarios and process them. Flag In_Partial_Fin
1474 -- shoud be set when the processing is initiated by a partial finalization
1475 -- routine. Flag In_Task_Body should be set when the traversal is initiated
1476 -- from a task body.
1478 procedure Update_Elaboration_Scenario
(New_N
: Node_Id
; Old_N
: Node_Id
);
1479 pragma Inline
(Update_Elaboration_Scenario
);
1480 -- Update all relevant internal data structures when scenario Old_N is
1481 -- transformed into scenario New_N by Atree.Rewrite.
1483 -----------------------
1484 -- Build_Call_Marker --
1485 -----------------------
1487 procedure Build_Call_Marker
(N
: Node_Id
) is
1488 function In_External_Context
1490 Target_Id
: Entity_Id
) return Boolean;
1491 pragma Inline
(In_External_Context
);
1492 -- Determine whether target Target_Id is external to call N which must
1493 -- reside within an instance.
1495 function In_Premature_Context
(Call
: Node_Id
) return Boolean;
1496 -- Determine whether call Call appears within a premature context
1498 function Is_Bridge_Target
(Id
: Entity_Id
) return Boolean;
1499 pragma Inline
(Is_Bridge_Target
);
1500 -- Determine whether arbitrary entity Id denotes a bridge target
1502 function Is_Default_Expression
(Call
: Node_Id
) return Boolean;
1503 pragma Inline
(Is_Default_Expression
);
1504 -- Determine whether call Call acts as the expression of a defaulted
1505 -- parameter within a source call.
1507 function Is_Generic_Formal_Subp
(Subp_Id
: Entity_Id
) return Boolean;
1508 pragma Inline
(Is_Generic_Formal_Subp
);
1509 -- Determine whether subprogram Subp_Id denotes a generic formal
1510 -- subprogram which appears in the "prologue" of an instantiation.
1512 -------------------------
1513 -- In_External_Context --
1514 -------------------------
1516 function In_External_Context
1518 Target_Id
: Entity_Id
) return Boolean
1520 Target_Decl
: constant Node_Id
:= Unit_Declaration_Node
(Target_Id
);
1523 Inst_Body
: Node_Id
;
1524 Inst_Decl
: Node_Id
;
1527 -- Performance note: parent traversal
1529 Inst
:= Find_Enclosing_Instance
(Call
);
1531 -- The call appears within an instance
1533 if Present
(Inst
) then
1535 -- The call comes from the main unit and the target does not
1537 if In_Extended_Main_Code_Unit
(Call
)
1538 and then not In_Extended_Main_Code_Unit
(Target_Decl
)
1542 -- Otherwise the target declaration must not appear within the
1543 -- instance spec or body.
1546 Extract_Instance_Attributes
1548 Inst_Decl
=> Inst_Decl
,
1549 Inst_Body
=> Inst_Body
);
1551 -- Performance note: parent traversal
1553 return not In_Subtree
1556 Root2
=> Inst_Body
);
1561 end In_External_Context
;
1563 --------------------------
1564 -- In_Premature_Context --
1565 --------------------------
1567 function In_Premature_Context
(Call
: Node_Id
) return Boolean is
1571 -- Climb the parent chain looking for premature contexts
1573 Par
:= Parent
(Call
);
1574 while Present
(Par
) loop
1576 -- Aspect specifications and generic associations are premature
1577 -- contexts because nested calls has not been relocated to their
1580 if Nkind_In
(Par
, N_Aspect_Specification
,
1581 N_Generic_Association
)
1585 -- Prevent the search from going too far
1587 elsif Is_Body_Or_Package_Declaration
(Par
) then
1591 Par
:= Parent
(Par
);
1595 end In_Premature_Context
;
1597 ----------------------
1598 -- Is_Bridge_Target --
1599 ----------------------
1601 function Is_Bridge_Target
(Id
: Entity_Id
) return Boolean is
1604 Is_Accept_Alternative_Proc
(Id
)
1605 or else Is_Finalizer_Proc
(Id
)
1606 or else Is_Partial_Invariant_Proc
(Id
)
1607 or else Is_Postconditions_Proc
(Id
)
1608 or else Is_TSS
(Id
, TSS_Deep_Adjust
)
1609 or else Is_TSS
(Id
, TSS_Deep_Finalize
)
1610 or else Is_TSS
(Id
, TSS_Deep_Initialize
);
1611 end Is_Bridge_Target
;
1613 ---------------------------
1614 -- Is_Default_Expression --
1615 ---------------------------
1617 function Is_Default_Expression
(Call
: Node_Id
) return Boolean is
1618 Outer_Call
: constant Node_Id
:= Parent
(Call
);
1619 Outer_Nam
: Node_Id
;
1622 -- To qualify, the node must appear immediately within a source call
1623 -- which invokes a source target.
1625 if Nkind_In
(Outer_Call
, N_Entry_Call_Statement
,
1627 N_Procedure_Call_Statement
)
1628 and then Comes_From_Source
(Outer_Call
)
1630 Outer_Nam
:= Extract_Call_Name
(Outer_Call
);
1633 Is_Entity_Name
(Outer_Nam
)
1634 and then Present
(Entity
(Outer_Nam
))
1635 and then Is_Subprogram_Or_Entry
(Entity
(Outer_Nam
))
1636 and then Comes_From_Source
(Entity
(Outer_Nam
));
1640 end Is_Default_Expression
;
1642 ----------------------------
1643 -- Is_Generic_Formal_Subp --
1644 ----------------------------
1646 function Is_Generic_Formal_Subp
(Subp_Id
: Entity_Id
) return Boolean is
1647 Subp_Decl
: constant Node_Id
:= Unit_Declaration_Node
(Subp_Id
);
1648 Context
: constant Node_Id
:= Parent
(Subp_Decl
);
1651 -- To qualify, the subprogram must rename a generic actual subprogram
1652 -- where the enclosing context is an instantiation.
1655 Nkind
(Subp_Decl
) = N_Subprogram_Renaming_Declaration
1656 and then not Comes_From_Source
(Subp_Decl
)
1657 and then Nkind_In
(Context
, N_Function_Specification
,
1658 N_Package_Specification
,
1659 N_Procedure_Specification
)
1660 and then Present
(Generic_Parent
(Context
));
1661 end Is_Generic_Formal_Subp
;
1665 Call_Attrs
: Call_Attributes
;
1668 Target_Id
: Entity_Id
;
1670 -- Start of processing for Build_Call_Marker
1673 -- Nothing to do for ASIS. As a result, ABE checks and diagnostics are
1674 -- not performed in this mode.
1679 -- Nothing to do when the call is being preanalyzed as the marker will
1680 -- be inserted in the wrong place.
1682 elsif Preanalysis_Active
then
1685 -- Nothing to do when the input does not denote a call or a requeue
1687 elsif not Nkind_In
(N
, N_Entry_Call_Statement
,
1689 N_Procedure_Call_Statement
,
1690 N_Requeue_Statement
)
1694 -- Nothing to do when the call is analyzed/resolved too early within an
1695 -- intermediate context.
1697 -- Performance note: parent traversal
1699 elsif In_Premature_Context
(N
) then
1703 Call_Nam
:= Extract_Call_Name
(N
);
1705 -- Nothing to do when the call is erroneous or left in a bad state
1707 if not (Is_Entity_Name
(Call_Nam
)
1708 and then Present
(Entity
(Call_Nam
))
1709 and then Is_Subprogram_Or_Entry
(Entity
(Call_Nam
)))
1713 -- Nothing to do when the call invokes a generic formal subprogram and
1714 -- switch -gnatd.G (ignore calls through generic formal parameters for
1715 -- elaboration) is in effect. This check must be performed with the
1716 -- direct target of the call to avoid the side effects of mapping
1717 -- actuals to formals using renamings.
1719 elsif Debug_Flag_Dot_GG
1720 and then Is_Generic_Formal_Subp
(Entity
(Call_Nam
))
1725 Extract_Call_Attributes
1727 Target_Id
=> Target_Id
,
1728 Attrs
=> Call_Attrs
);
1730 -- Nothing to do when the call appears within the expanded spec or
1731 -- body of an instantiated generic, the call does not invoke a generic
1732 -- formal subprogram, the target is external to the instance, and switch
1733 -- -gnatdL (ignore external calls from instances for elaboration) is in
1734 -- effect. This behaviour approximates that of the old ABE mechanism.
1737 and then not Is_Generic_Formal_Subp
(Entity
(Call_Nam
))
1739 -- Performance note: parent traversal
1741 and then In_External_Context
1743 Target_Id
=> Target_Id
)
1747 -- Source calls to source targets are always considered because they
1748 -- reflect the original call graph.
1750 elsif Comes_From_Source
(Target_Id
) and then Call_Attrs
.From_Source
then
1753 -- A call to a source function which acts as the default expression in
1754 -- another call requires special detection.
1756 elsif Comes_From_Source
(Target_Id
)
1757 and then Nkind
(N
) = N_Function_Call
1758 and then Is_Default_Expression
(N
)
1762 -- The target emulates Ada semantics
1764 elsif Is_Ada_Semantic_Target
(Target_Id
) then
1767 -- The target acts as a link between scenarios
1769 elsif Is_Bridge_Target
(Target_Id
) then
1772 -- The target emulates SPARK semantics
1774 elsif Is_SPARK_Semantic_Target
(Target_Id
) then
1777 -- Otherwise the call is not suitable for ABE processing. This prevents
1778 -- the generation of call markers which will never play a role in ABE
1785 -- At this point it is known that the call will play some role in ABE
1786 -- checks and diagnostics. Create a corresponding call marker in case
1787 -- the original call is heavily transformed by expansion later on.
1789 Marker
:= Make_Call_Marker
(Sloc
(N
));
1791 -- Inherit the attributes of the original call
1793 Set_Target
(Marker
, Target_Id
);
1794 Set_Is_Elaboration_Checks_OK_Node
(Marker
, Call_Attrs
.Elab_Checks_OK
);
1795 Set_Is_Declaration_Level_Node
(Marker
, Call_Attrs
.In_Declarations
);
1796 Set_Is_Dispatching_Call
(Marker
, Call_Attrs
.Is_Dispatching
);
1797 Set_Is_Ignored_Ghost_Node
(Marker
, Call_Attrs
.Ghost_Mode_Ignore
);
1798 Set_Is_Source_Call
(Marker
, Call_Attrs
.From_Source
);
1799 Set_Is_SPARK_Mode_On_Node
(Marker
, Call_Attrs
.SPARK_Mode_On
);
1801 -- The marker is inserted prior to the original call. This placement has
1802 -- several desirable effects:
1804 -- 1) The marker appears in the same context, in close proximity to
1810 -- 2) Inserting the marker prior to the call ensures that an ABE check
1811 -- will take effect prior to the call.
1817 -- 3) The above two properties are preserved even when the call is a
1818 -- function which is subsequently relocated in order to capture its
1819 -- result. Note that if the call is relocated to a new context, the
1820 -- relocated call will receive a marker of its own.
1824 -- Temp : ... := Func_Call ...;
1827 -- The insertion must take place even when the call does not occur in
1828 -- the main unit to keep the tree symmetric. This ensures that internal
1829 -- name serialization is consistent in case the call marker causes the
1830 -- tree to transform in some way.
1832 Insert_Action
(N
, Marker
);
1834 -- The marker becomes the "corresponding" scenario for the call. Save
1835 -- the marker for later processing by the ABE phase.
1837 Record_Elaboration_Scenario
(Marker
);
1838 end Build_Call_Marker
;
1840 -------------------------------------
1841 -- Build_Variable_Reference_Marker --
1842 -------------------------------------
1844 procedure Build_Variable_Reference_Marker
1849 function In_Pragma
(Nod
: Node_Id
) return Boolean;
1850 -- Determine whether arbitrary node Nod appears within a pragma
1856 function In_Pragma
(Nod
: Node_Id
) return Boolean is
1861 while Present
(Par
) loop
1862 if Nkind
(Par
) = N_Pragma
then
1865 -- Prevent the search from going too far
1867 elsif Is_Body_Or_Package_Declaration
(Par
) then
1871 Par
:= Parent
(Par
);
1881 Var_Attrs
: Variable_Attributes
;
1884 -- Start of processing for Build_Variable_Reference_Marker
1887 -- Nothing to do for ASIS. As a result, ABE checks and diagnostics are
1888 -- not performed in this mode.
1893 -- Nothing to do when the reference is being preanalyzed as the marker
1894 -- will be inserted in the wrong place.
1896 elsif Preanalysis_Active
then
1899 -- Nothing to do when the input does not denote a reference
1901 elsif not Nkind_In
(N
, N_Expanded_Name
, N_Identifier
) then
1904 -- Nothing to do for internally-generated references
1906 elsif not Comes_From_Source
(N
) then
1909 -- Nothing to do when the reference is erroneous, left in a bad state,
1910 -- or does not denote a variable.
1912 elsif not (Present
(Entity
(N
))
1913 and then Ekind
(Entity
(N
)) = E_Variable
1914 and then Entity
(N
) /= Any_Id
)
1919 Extract_Variable_Reference_Attributes
1922 Attrs
=> Var_Attrs
);
1924 Prag
:= SPARK_Pragma
(Var_Id
);
1926 if Comes_From_Source
(Var_Id
)
1928 -- Both the variable and the reference must appear in SPARK_Mode On
1929 -- regions because this scenario falls under the SPARK rules.
1931 and then Present
(Prag
)
1932 and then Get_SPARK_Mode_From_Annotation
(Prag
) = On
1933 and then Is_SPARK_Mode_On_Node
(N
)
1935 -- The reference must not be considered when it appears in a pragma.
1936 -- If the pragma has run-time semantics, then the reference will be
1937 -- reconsidered once the pragma is expanded.
1939 -- Performance note: parent traversal
1941 and then not In_Pragma
(N
)
1945 -- Otherwise the reference is not suitable for ABE processing. This
1946 -- prevents the generation of variable markers which will never play
1947 -- a role in ABE diagnostics.
1953 -- At this point it is known that the variable reference will play some
1954 -- role in ABE checks and diagnostics. Create a corresponding variable
1955 -- marker in case the original variable reference is folded or optimized
1958 Marker
:= Make_Variable_Reference_Marker
(Sloc
(N
));
1960 -- Inherit the attributes of the original variable reference
1962 Set_Target
(Marker
, Var_Id
);
1963 Set_Is_Read
(Marker
, Read
);
1964 Set_Is_Write
(Marker
, Write
);
1966 -- The marker is inserted prior to the original variable reference. The
1967 -- insertion must take place even when the reference does not occur in
1968 -- the main unit to keep the tree symmetric. This ensures that internal
1969 -- name serialization is consistent in case the variable marker causes
1970 -- the tree to transform in some way.
1972 Insert_Action
(N
, Marker
);
1974 -- The marker becomes the "corresponding" scenario for the reference.
1975 -- Save the marker for later processing for the ABE phase.
1977 Record_Elaboration_Scenario
(Marker
);
1978 end Build_Variable_Reference_Marker
;
1980 ---------------------------------
1981 -- Check_Elaboration_Scenarios --
1982 ---------------------------------
1984 procedure Check_Elaboration_Scenarios
is
1986 -- Nothing to do for ASIS. As a result, no ABE checks and diagnostics
1987 -- are performed in this mode.
1993 -- Examine the context of the main unit and record all units with prior
1994 -- elaboration with respect to it.
1996 Find_Elaborated_Units
;
1998 -- Examine each top-level scenario saved during the Recording phase and
1999 -- perform various actions depending on the elaboration model in effect.
2001 for Index
in Top_Level_Scenarios
.First
.. Top_Level_Scenarios
.Last
loop
2003 -- Clear the table of visited scenario bodies for each new top-level
2006 Visited_Bodies
.Reset
;
2008 Process_Scenario
(Top_Level_Scenarios
.Table
(Index
));
2010 end Check_Elaboration_Scenarios
;
2012 ------------------------------
2013 -- Check_Preelaborated_Call --
2014 ------------------------------
2016 procedure Check_Preelaborated_Call
(Call
: Node_Id
) is
2017 function In_Preelaborated_Context
(N
: Node_Id
) return Boolean;
2018 -- Determine whether arbitrary node appears in a preelaborated context
2020 ------------------------------
2021 -- In_Preelaborated_Context --
2022 ------------------------------
2024 function In_Preelaborated_Context
(N
: Node_Id
) return Boolean is
2025 Body_Id
: constant Entity_Id
:= Find_Code_Unit
(N
);
2026 Spec_Id
: constant Entity_Id
:= Unique_Entity
(Body_Id
);
2029 -- The node appears within a package body whose corresponding spec is
2030 -- subject to pragma Remote_Call_Interface or Remote_Types. This does
2031 -- not result in a preelaborated context because the package body may
2032 -- be on another machine.
2034 if Ekind
(Body_Id
) = E_Package_Body
2035 and then Ekind_In
(Spec_Id
, E_Generic_Package
, E_Package
)
2036 and then (Is_Remote_Call_Interface
(Spec_Id
)
2037 or else Is_Remote_Types
(Spec_Id
))
2041 -- Otherwise the node appears within a preelaborated context when the
2042 -- associated unit is preelaborated.
2045 return Is_Preelaborated_Unit
(Spec_Id
);
2047 end In_Preelaborated_Context
;
2051 Call_Attrs
: Call_Attributes
;
2052 Level
: Enclosing_Level_Kind
;
2053 Target_Id
: Entity_Id
;
2055 -- Start of processing for Check_Preelaborated_Call
2058 Extract_Call_Attributes
2060 Target_Id
=> Target_Id
,
2061 Attrs
=> Call_Attrs
);
2063 -- Nothing to do when the call is internally generated because it is
2064 -- assumed that it will never violate preelaboration.
2066 if not Call_Attrs
.From_Source
then
2070 -- Performance note: parent traversal
2072 Level
:= Find_Enclosing_Level
(Call
);
2074 -- Library-level calls are always considered because they are part of
2075 -- the associated unit's elaboration actions.
2077 if Level
in Library_Level
then
2080 -- Calls at the library level of a generic package body must be checked
2081 -- because they would render an instantiation illegal if the template is
2082 -- marked as preelaborated. Note that this does not apply to calls at
2083 -- the library level of a generic package spec.
2085 elsif Level
= Generic_Package_Body
then
2088 -- Otherwise the call does not appear at the proper level and must not
2089 -- be considered for this check.
2095 -- The call appears within a preelaborated unit. Emit a warning only for
2096 -- internal uses, otherwise this is an error.
2098 if In_Preelaborated_Context
(Call
) then
2099 Error_Msg_Warn
:= GNAT_Mode
;
2101 ("<<non-static call not allowed in preelaborated unit", Call
);
2103 end Check_Preelaborated_Call
;
2105 ----------------------
2106 -- Compilation_Unit --
2107 ----------------------
2109 function Compilation_Unit
(Unit_Id
: Entity_Id
) return Node_Id
is
2110 Comp_Unit
: Node_Id
;
2113 Comp_Unit
:= Parent
(Unit_Id
);
2115 -- Handle the case where a concurrent subunit is rewritten as a null
2116 -- statement due to expansion activities.
2118 if Nkind
(Comp_Unit
) = N_Null_Statement
2119 and then Nkind_In
(Original_Node
(Comp_Unit
), N_Protected_Body
,
2122 Comp_Unit
:= Parent
(Comp_Unit
);
2123 pragma Assert
(Nkind
(Comp_Unit
) = N_Subunit
);
2125 -- Otherwise use the declaration node of the unit
2128 Comp_Unit
:= Parent
(Unit_Declaration_Node
(Unit_Id
));
2131 -- Handle the case where a subprogram instantiation which acts as a
2132 -- compilation unit is expanded into an anonymous package that wraps
2133 -- the instantiated subprogram.
2135 if Nkind
(Comp_Unit
) = N_Package_Specification
2136 and then Nkind_In
(Original_Node
(Parent
(Comp_Unit
)),
2137 N_Function_Instantiation
,
2138 N_Procedure_Instantiation
)
2140 Comp_Unit
:= Parent
(Parent
(Comp_Unit
));
2142 -- Handle the case where the compilation unit is a subunit
2144 elsif Nkind
(Comp_Unit
) = N_Subunit
then
2145 Comp_Unit
:= Parent
(Comp_Unit
);
2148 pragma Assert
(Nkind
(Comp_Unit
) = N_Compilation_Unit
);
2151 end Compilation_Unit
;
2157 procedure Elab_Msg_NE
2164 function Prefix
return String;
2165 -- Obtain the prefix of the message
2167 function Suffix
return String;
2168 -- Obtain the suffix of the message
2174 function Prefix
return String is
2187 function Suffix
return String is
2196 -- Start of processing for Elab_Msg_NE
2199 Error_Msg_NE
(Prefix
& Msg
& Suffix
, N
, Id
);
2202 ------------------------------
2203 -- Elaboration_Context_Hash --
2204 ------------------------------
2206 function Elaboration_Context_Hash
2207 (Key
: Entity_Id
) return Elaboration_Context_Index
2210 return Elaboration_Context_Index
(Key
mod Elaboration_Context_Max
);
2211 end Elaboration_Context_Hash
;
2213 ------------------------------
2214 -- Ensure_Prior_Elaboration --
2215 ------------------------------
2217 procedure Ensure_Prior_Elaboration
2219 Unit_Id
: Entity_Id
;
2220 In_Partial_Fin
: Boolean;
2221 In_Task_Body
: Boolean)
2226 -- Instantiating an external generic unit requires an implicit Elaborate
2227 -- because Elaborate_All is too strong and could introduce non-existent
2228 -- elaboration cycles.
2230 -- package External is
2231 -- function Func ...;
2237 -- X : ... := External.Func;
2240 -- [with External;] -- implicit with for External
2241 -- [pragma Elaborate_All (External);] -- Elaborate_All for External
2243 -- [pragma Elaborate (Gen);] -- Elaborate for generic
2244 -- procedure Main is
2245 -- package Inst is new Gen; -- calls External.Func
2249 if Nkind
(N
) in N_Generic_Instantiation
then
2250 Prag_Nam
:= Name_Elaborate
;
2252 -- Otherwise generate an implicit Elaborate_All
2255 Prag_Nam
:= Name_Elaborate_All
;
2258 -- Nothing to do when the need for prior elaboration came from a partial
2259 -- finalization routine which occurs in an initialization context. This
2260 -- behaviour parallels that of the old ABE mechanism.
2262 if In_Partial_Fin
then
2265 -- Nothing to do when the need for prior elaboration came from a task
2266 -- body and switch -gnatd.y (disable implicit pragma Elaborate_All on
2267 -- task bodies) is in effect.
2269 elsif Debug_Flag_Dot_Y
and then In_Task_Body
then
2272 -- Nothing to do when the unit is elaborated prior to the main unit.
2273 -- This check must also consider the following cases:
2275 -- * No check is made against the context of the main unit because this
2276 -- is specific to the elaboration model in effect and requires custom
2277 -- handling (see Ensure_xxx_Prior_Elaboration).
2279 -- * Unit_Id is subject to pragma Elaborate_Body. An implicit pragma
2280 -- Elaborate[_All] MUST be generated even though Unit_Id is always
2281 -- elaborated prior to the main unit. This is a conservative strategy
2282 -- which ensures that other units withed by Unit_Id will not lead to
2285 -- package A is package body A is
2286 -- procedure ABE; procedure ABE is ... end ABE;
2290 -- package B is package body B is
2291 -- pragma Elaborate_Body; procedure Proc is
2293 -- procedure Proc; A.ABE;
2294 -- package B; end Proc;
2298 -- package C is package body C is
2304 -- In the example above, the elaboration of C invokes B.Proc. B is
2305 -- subject to pragma Elaborate_Body. If no pragma Elaborate[_All] is
2306 -- generated for B in C, then the following elaboratio order will lead
2309 -- spec of A elaborated
2310 -- spec of B elaborated
2311 -- body of B elaborated
2312 -- spec of C elaborated
2313 -- body of C elaborated <-- calls B.Proc which calls A.ABE
2314 -- body of A elaborated <-- problem
2316 -- The generation of an implicit pragma Elaborate_All (B) ensures that
2317 -- the elaboration order mechanism will not pick the above order.
2319 -- An implicit Elaborate is NOT generated when the unit is subject to
2320 -- Elaborate_Body because both pragmas have the exact same effect.
2322 -- * Unit_Id is the main unit. An implicit pragma Elaborate[_All] MUST
2323 -- NOT be generated in this case because a unit cannot depend on its
2324 -- own elaboration. This case is therefore treated as valid prior
2327 elsif Has_Prior_Elaboration
2328 (Unit_Id
=> Unit_Id
,
2329 Same_Unit_OK
=> True,
2330 Elab_Body_OK
=> Prag_Nam
= Name_Elaborate
)
2334 -- Suggest the use of pragma Prag_Nam when the dynamic model is in
2337 elsif Dynamic_Elaboration_Checks
then
2338 Ensure_Prior_Elaboration_Dynamic
2341 Prag_Nam
=> Prag_Nam
);
2343 -- Install an implicit pragma Prag_Nam when the static model is in
2347 pragma Assert
(Static_Elaboration_Checks
);
2349 Ensure_Prior_Elaboration_Static
2352 Prag_Nam
=> Prag_Nam
);
2354 end Ensure_Prior_Elaboration
;
2356 --------------------------------------
2357 -- Ensure_Prior_Elaboration_Dynamic --
2358 --------------------------------------
2360 procedure Ensure_Prior_Elaboration_Dynamic
2362 Unit_Id
: Entity_Id
;
2365 procedure Info_Missing_Pragma
;
2366 pragma Inline
(Info_Missing_Pragma
);
2367 -- Output information concerning missing Elaborate or Elaborate_All
2368 -- pragma with name Prag_Nam for scenario N, which would ensure the
2369 -- prior elaboration of Unit_Id.
2371 -------------------------
2372 -- Info_Missing_Pragma --
2373 -------------------------
2375 procedure Info_Missing_Pragma
is
2377 -- Internal units are ignored as they cause unnecessary noise
2379 if not In_Internal_Unit
(Unit_Id
) then
2381 -- The name of the unit subjected to the elaboration pragma is
2382 -- fully qualified to improve the clarity of the info message.
2384 Error_Msg_Name_1
:= Prag_Nam
;
2385 Error_Msg_Qual_Level
:= Nat
'Last;
2387 Error_Msg_NE
("info: missing pragma % for unit &", N
, Unit_Id
);
2388 Error_Msg_Qual_Level
:= 0;
2390 end Info_Missing_Pragma
;
2394 Elab_Attrs
: Elaboration_Attributes
;
2395 Level
: Enclosing_Level_Kind
;
2397 -- Start of processing for Ensure_Prior_Elaboration_Dynamic
2400 Elab_Attrs
:= Elaboration_Context
.Get
(Unit_Id
);
2402 -- Nothing to do when the unit is guaranteed prior elaboration by means
2403 -- of a source Elaborate[_All] pragma.
2405 if Present
(Elab_Attrs
.Source_Pragma
) then
2409 -- Output extra information on a missing Elaborate[_All] pragma when
2410 -- switch -gnatel (info messages on implicit Elaborate[_All] pragmas
2413 if Elab_Info_Messages
then
2415 -- Performance note: parent traversal
2417 Level
:= Find_Enclosing_Level
(N
);
2419 -- Declaration-level scenario
2421 if (Is_Suitable_Call
(N
) or else Is_Suitable_Instantiation
(N
))
2422 and then Level
= Declaration_Level
2426 -- Library-level scenario
2428 elsif Level
in Library_Level
then
2431 -- Instantiation library-level scenario
2433 elsif Level
= Instantiation
then
2436 -- Otherwise the scenario does not appear at the proper level and
2437 -- cannot possibly act as a top-level scenario.
2443 Info_Missing_Pragma
;
2445 end Ensure_Prior_Elaboration_Dynamic
;
2447 -------------------------------------
2448 -- Ensure_Prior_Elaboration_Static --
2449 -------------------------------------
2451 procedure Ensure_Prior_Elaboration_Static
2453 Unit_Id
: Entity_Id
;
2456 function Find_With_Clause
2458 Withed_Id
: Entity_Id
) return Node_Id
;
2459 pragma Inline
(Find_With_Clause
);
2460 -- Find a nonlimited with clause in the list of context items Items
2461 -- that withs unit Withed_Id. Return Empty if no such clause is found.
2463 procedure Info_Implicit_Pragma
;
2464 pragma Inline
(Info_Implicit_Pragma
);
2465 -- Output information concerning an implicitly generated Elaborate or
2466 -- Elaborate_All pragma with name Prag_Nam for scenario N which ensures
2467 -- the prior elaboration of unit Unit_Id.
2469 ----------------------
2470 -- Find_With_Clause --
2471 ----------------------
2473 function Find_With_Clause
2475 Withed_Id
: Entity_Id
) return Node_Id
2480 -- Examine the context clauses looking for a suitable with. Note that
2481 -- limited clauses do not affect the elaboration order.
2483 Item
:= First
(Items
);
2484 while Present
(Item
) loop
2485 if Nkind
(Item
) = N_With_Clause
2486 and then not Error_Posted
(Item
)
2487 and then not Limited_Present
(Item
)
2488 and then Entity
(Name
(Item
)) = Withed_Id
2497 end Find_With_Clause
;
2499 --------------------------
2500 -- Info_Implicit_Pragma --
2501 --------------------------
2503 procedure Info_Implicit_Pragma
is
2505 -- Internal units are ignored as they cause unnecessary noise
2507 if not In_Internal_Unit
(Unit_Id
) then
2509 -- The name of the unit subjected to the elaboration pragma is
2510 -- fully qualified to improve the clarity of the info message.
2512 Error_Msg_Name_1
:= Prag_Nam
;
2513 Error_Msg_Qual_Level
:= Nat
'Last;
2516 ("info: implicit pragma % generated for unit &", N
, Unit_Id
);
2518 Error_Msg_Qual_Level
:= 0;
2519 Output_Active_Scenarios
(N
);
2521 end Info_Implicit_Pragma
;
2525 Main_Cunit
: constant Node_Id
:= Cunit
(Main_Unit
);
2526 Loc
: constant Source_Ptr
:= Sloc
(Main_Cunit
);
2527 Unit_Cunit
: constant Node_Id
:= Compilation_Unit
(Unit_Id
);
2529 Is_Instantiation
: constant Boolean :=
2530 Nkind
(N
) in N_Generic_Instantiation
;
2533 Elab_Attrs
: Elaboration_Attributes
;
2536 -- Start of processing for Ensure_Prior_Elaboration_Static
2539 Elab_Attrs
:= Elaboration_Context
.Get
(Unit_Id
);
2541 -- Nothing to do when the unit is guaranteed prior elaboration by means
2542 -- of a source Elaborate[_All] pragma.
2544 if Present
(Elab_Attrs
.Source_Pragma
) then
2547 -- Nothing to do when the unit has an existing implicit Elaborate[_All]
2548 -- pragma installed by a previous scenario.
2550 elsif Present
(Elab_Attrs
.With_Clause
) then
2552 -- The unit is already guaranteed prior elaboration by means of an
2553 -- implicit Elaborate pragma, however the current scenario imposes
2554 -- a stronger requirement of Elaborate_All. "Upgrade" the existing
2555 -- pragma to match this new requirement.
2557 if Elaborate_Desirable
(Elab_Attrs
.With_Clause
)
2558 and then Prag_Nam
= Name_Elaborate_All
2560 Set_Elaborate_All_Desirable
(Elab_Attrs
.With_Clause
);
2561 Set_Elaborate_Desirable
(Elab_Attrs
.With_Clause
, False);
2567 -- At this point it is known that the unit has no prior elaboration
2568 -- according to pragmas and hierarchical relationships.
2570 Items
:= Context_Items
(Main_Cunit
);
2574 Set_Context_Items
(Main_Cunit
, Items
);
2577 -- Locate the with clause for the unit. Note that there may not be a
2578 -- clause if the unit is visible through a subunit-body, body-spec, or
2579 -- spec-parent relationship.
2584 Withed_Id
=> Unit_Id
);
2589 -- Note that adding implicit with clauses is safe because analysis,
2590 -- resolution, and expansion have already taken place and it is not
2591 -- possible to interfere with visibility.
2595 Make_With_Clause
(Loc
,
2596 Name
=> New_Occurrence_Of
(Unit_Id
, Loc
));
2598 Set_Implicit_With
(Clause
);
2599 Set_Library_Unit
(Clause
, Unit_Cunit
);
2601 Append_To
(Items
, Clause
);
2604 -- Instantiations require an implicit Elaborate because Elaborate_All is
2605 -- too conservative and may introduce non-existent elaboration cycles.
2607 if Is_Instantiation
then
2608 Set_Elaborate_Desirable
(Clause
);
2610 -- Otherwise generate an implicit Elaborate_All
2613 Set_Elaborate_All_Desirable
(Clause
);
2616 -- The implicit Elaborate[_All] ensures the prior elaboration of the
2617 -- unit. Include the unit in the elaboration context of the main unit.
2619 Elaboration_Context
.Set
(Unit_Id
,
2620 Elaboration_Attributes
'(Source_Pragma => Empty,
2621 With_Clause => Clause));
2623 -- Output extra information on an implicit Elaborate[_All] pragma when
2624 -- switch -gnatel (info messages on implicit Elaborate[_All] pragmas is
2627 if Elab_Info_Messages then
2628 Info_Implicit_Pragma;
2630 end Ensure_Prior_Elaboration_Static;
2632 -----------------------------
2633 -- Extract_Assignment_Name --
2634 -----------------------------
2636 function Extract_Assignment_Name (Asmt : Node_Id) return Node_Id is
2642 -- When the name denotes an array or record component, find the whole
2645 while Nkind_In (Nam, N_Explicit_Dereference,
2646 N_Indexed_Component,
2647 N_Selected_Component,
2650 Nam := Prefix (Nam);
2654 end Extract_Assignment_Name;
2656 -----------------------------
2657 -- Extract_Call_Attributes --
2658 -----------------------------
2660 procedure Extract_Call_Attributes
2662 Target_Id : out Entity_Id;
2663 Attrs : out Call_Attributes)
2665 From_Source : Boolean;
2666 In_Declarations : Boolean;
2667 Is_Dispatching : Boolean;
2670 -- Extraction for call markers
2672 if Nkind (Call) = N_Call_Marker then
2673 Target_Id := Target (Call);
2674 From_Source := Is_Source_Call (Call);
2675 In_Declarations := Is_Declaration_Level_Node (Call);
2676 Is_Dispatching := Is_Dispatching_Call (Call);
2678 -- Extraction for entry calls, requeue, and subprogram calls
2681 pragma Assert (Nkind_In (Call, N_Entry_Call_Statement,
2683 N_Procedure_Call_Statement,
2684 N_Requeue_Statement));
2686 Target_Id := Entity (Extract_Call_Name (Call));
2687 From_Source := Comes_From_Source (Call);
2689 -- Performance note: parent traversal
2691 In_Declarations := Find_Enclosing_Level (Call) = Declaration_Level;
2693 Nkind_In (Call, N_Function_Call, N_Procedure_Call_Statement)
2694 and then Present (Controlling_Argument (Call));
2697 -- Obtain the original entry or subprogram which the target may rename
2698 -- except when the target is an instantiation. In this case the alias
2699 -- is the internally generated subprogram which appears within the the
2700 -- anonymous package created for the instantiation. Such an alias is not
2701 -- a suitable target.
2703 if not (Is_Subprogram (Target_Id)
2704 and then Is_Generic_Instance (Target_Id))
2706 Target_Id := Get_Renamed_Entity (Target_Id);
2709 -- Set all attributes
2711 Attrs.Elab_Checks_OK := Is_Elaboration_Checks_OK_Node (Call);
2712 Attrs.From_Source := From_Source;
2713 Attrs.Ghost_Mode_Ignore := Is_Ignored_Ghost_Node (Call);
2714 Attrs.In_Declarations := In_Declarations;
2715 Attrs.Is_Dispatching := Is_Dispatching;
2716 Attrs.SPARK_Mode_On := Is_SPARK_Mode_On_Node (Call);
2717 end Extract_Call_Attributes;
2719 -----------------------
2720 -- Extract_Call_Name --
2721 -----------------------
2723 function Extract_Call_Name (Call : Node_Id) return Node_Id is
2729 -- When the call invokes an entry family, the name appears as an indexed
2732 if Nkind (Nam) = N_Indexed_Component then
2733 Nam := Prefix (Nam);
2736 -- When the call employs the object.operation form, the name appears as
2737 -- a selected component.
2739 if Nkind (Nam) = N_Selected_Component then
2740 Nam := Selector_Name (Nam);
2744 end Extract_Call_Name;
2746 ---------------------------------
2747 -- Extract_Instance_Attributes --
2748 ---------------------------------
2750 procedure Extract_Instance_Attributes
2751 (Exp_Inst : Node_Id;
2752 Inst_Body : out Node_Id;
2753 Inst_Decl : out Node_Id)
2755 Body_Id : Entity_Id;
2758 -- Assume that the attributes are unavailable
2763 -- Generic package or subprogram spec
2765 if Nkind_In (Exp_Inst, N_Package_Declaration,
2766 N_Subprogram_Declaration)
2768 Inst_Decl := Exp_Inst;
2769 Body_Id := Corresponding_Body (Inst_Decl);
2771 if Present (Body_Id) then
2772 Inst_Body := Unit_Declaration_Node (Body_Id);
2775 -- Generic package or subprogram body
2779 (Nkind_In (Exp_Inst, N_Package_Body, N_Subprogram_Body));
2781 Inst_Body := Exp_Inst;
2782 Inst_Decl := Unit_Declaration_Node (Corresponding_Spec (Inst_Body));
2784 end Extract_Instance_Attributes;
2786 --------------------------------------
2787 -- Extract_Instantiation_Attributes --
2788 --------------------------------------
2790 procedure Extract_Instantiation_Attributes
2791 (Exp_Inst : Node_Id;
2793 Inst_Id : out Entity_Id;
2794 Gen_Id : out Entity_Id;
2795 Attrs : out Instantiation_Attributes)
2798 Inst := Original_Node (Exp_Inst);
2799 Inst_Id := Defining_Entity (Inst);
2801 -- Traverse a possible chain of renamings to obtain the original generic
2802 -- being instantiatied.
2804 Gen_Id := Get_Renamed_Entity (Entity (Name (Inst)));
2806 -- Set all attributes
2808 Attrs.Elab_Checks_OK := Is_Elaboration_Checks_OK_Node (Inst);
2809 Attrs.Ghost_Mode_Ignore := Is_Ignored_Ghost_Node (Inst);
2810 Attrs.In_Declarations := Is_Declaration_Level_Node (Inst);
2811 Attrs.SPARK_Mode_On := Is_SPARK_Mode_On_Node (Inst);
2812 end Extract_Instantiation_Attributes;
2814 -------------------------------
2815 -- Extract_Target_Attributes --
2816 -------------------------------
2818 procedure Extract_Target_Attributes
2819 (Target_Id : Entity_Id;
2820 Attrs : out Target_Attributes)
2822 procedure Extract_Package_Or_Subprogram_Attributes
2823 (Spec_Id : out Entity_Id;
2824 Body_Decl : out Node_Id);
2825 -- Obtain the attributes associated with a package or a subprogram.
2826 -- Spec_Id is the package or subprogram. Body_Decl is the declaration
2827 -- of the corresponding package or subprogram body.
2829 procedure Extract_Protected_Entry_Attributes
2830 (Spec_Id : out Entity_Id;
2831 Body_Decl : out Node_Id;
2832 Body_Barf : out Node_Id);
2833 -- Obtain the attributes associated with a protected entry [family].
2834 -- Spec_Id is the entity of the protected body subprogram. Body_Decl
2835 -- is the declaration of Spec_Id's corresponding body. Body_Barf is
2836 -- the declaration of the barrier function body.
2838 procedure Extract_Protected_Subprogram_Attributes
2839 (Spec_Id : out Entity_Id;
2840 Body_Decl : out Node_Id);
2841 -- Obtain the attributes associated with a protected subprogram. Formal
2842 -- Spec_Id is the entity of the protected body subprogram. Body_Decl is
2843 -- the declaration of Spec_Id's corresponding body.
2845 procedure Extract_Task_Entry_Attributes
2846 (Spec_Id : out Entity_Id;
2847 Body_Decl : out Node_Id);
2848 -- Obtain the attributes associated with a task entry [family]. Formal
2849 -- Spec_Id is the entity of the task body procedure. Body_Decl is the
2850 -- declaration of Spec_Id's corresponding body.
2852 ----------------------------------------------
2853 -- Extract_Package_Or_Subprogram_Attributes --
2854 ----------------------------------------------
2856 procedure Extract_Package_Or_Subprogram_Attributes
2857 (Spec_Id : out Entity_Id;
2858 Body_Decl : out Node_Id)
2860 Body_Id : Entity_Id;
2861 Init_Id : Entity_Id;
2862 Spec_Decl : Node_Id;
2865 -- Assume that the body is not available
2868 Spec_Id := Target_Id;
2870 -- For body retrieval purposes, the entity of the initial declaration
2871 -- is that of the spec.
2875 -- The only exception to the above is a function which returns a
2876 -- constrained array type in a SPARK-to-C compilation. In this case
2877 -- the function receives a corresponding procedure which has an out
2878 -- parameter. The proper body for ABE checks and diagnostics is that
2879 -- of the procedure.
2881 if Ekind (Init_Id) = E_Function
2882 and then Rewritten_For_C (Init_Id)
2884 Init_Id := Corresponding_Procedure (Init_Id);
2887 -- Extract the attributes of the body
2889 Spec_Decl := Unit_Declaration_Node (Init_Id);
2891 -- The initial declaration is a stand alone subprogram body
2893 if Nkind (Spec_Decl) = N_Subprogram_Body then
2894 Body_Decl := Spec_Decl;
2896 -- Otherwise the package or subprogram has a spec and a completing
2899 elsif Nkind_In (Spec_Decl, N_Generic_Package_Declaration,
2900 N_Generic_Subprogram_Declaration,
2901 N_Package_Declaration,
2902 N_Subprogram_Body_Stub,
2903 N_Subprogram_Declaration)
2905 Body_Id := Corresponding_Body (Spec_Decl);
2907 if Present (Body_Id) then
2908 Body_Decl := Unit_Declaration_Node (Body_Id);
2911 end Extract_Package_Or_Subprogram_Attributes;
2913 ----------------------------------------
2914 -- Extract_Protected_Entry_Attributes --
2915 ----------------------------------------
2917 procedure Extract_Protected_Entry_Attributes
2918 (Spec_Id : out Entity_Id;
2919 Body_Decl : out Node_Id;
2920 Body_Barf : out Node_Id)
2922 Barf_Id : Entity_Id;
2923 Body_Id : Entity_Id;
2926 -- Assume that the bodies are not available
2931 -- When the entry [family] has already been expanded, it carries both
2932 -- the procedure which emulates the behavior of the entry [family] as
2933 -- well as the barrier function.
2935 if Present (Protected_Body_Subprogram (Target_Id)) then
2936 Spec_Id := Protected_Body_Subprogram (Target_Id);
2938 -- Extract the attributes of the barrier function
2942 (Unit_Declaration_Node (Barrier_Function (Target_Id)));
2944 if Present (Barf_Id) then
2945 Body_Barf := Unit_Declaration_Node (Barf_Id);
2948 -- Otherwise no expansion took place
2951 Spec_Id := Target_Id;
2954 -- Extract the attributes of the entry body
2956 Body_Id := Corresponding_Body (Unit_Declaration_Node (Spec_Id));
2958 if Present (Body_Id) then
2959 Body_Decl := Unit_Declaration_Node (Body_Id);
2961 end Extract_Protected_Entry_Attributes;
2963 ---------------------------------------------
2964 -- Extract_Protected_Subprogram_Attributes --
2965 ---------------------------------------------
2967 procedure Extract_Protected_Subprogram_Attributes
2968 (Spec_Id : out Entity_Id;
2969 Body_Decl : out Node_Id)
2971 Body_Id : Entity_Id;
2974 -- Assume that the body is not available
2978 -- When the protected subprogram has already been expanded, it
2979 -- carries the subprogram which seizes the lock and invokes the
2980 -- original statements.
2982 if Present (Protected_Subprogram (Target_Id)) then
2984 Protected_Body_Subprogram (Protected_Subprogram (Target_Id));
2986 -- Otherwise no expansion took place
2989 Spec_Id := Target_Id;
2992 -- Extract the attributes of the body
2994 Body_Id := Corresponding_Body (Unit_Declaration_Node (Spec_Id));
2996 if Present (Body_Id) then
2997 Body_Decl := Unit_Declaration_Node (Body_Id);
2999 end Extract_Protected_Subprogram_Attributes;
3001 -----------------------------------
3002 -- Extract_Task_Entry_Attributes --
3003 -----------------------------------
3005 procedure Extract_Task_Entry_Attributes
3006 (Spec_Id : out Entity_Id;
3007 Body_Decl : out Node_Id)
3009 Task_Typ : constant Entity_Id := Non_Private_View (Scope (Target_Id));
3010 Body_Id : Entity_Id;
3013 -- Assume that the body is not available
3017 -- The the task type has already been expanded, it carries the
3018 -- procedure which emulates the behavior of the task body.
3020 if Present (Task_Body_Procedure (Task_Typ)) then
3021 Spec_Id := Task_Body_Procedure (Task_Typ);
3023 -- Otherwise no expansion took place
3026 Spec_Id := Task_Typ;
3029 -- Extract the attributes of the body
3031 Body_Id := Corresponding_Body (Unit_Declaration_Node (Spec_Id));
3033 if Present (Body_Id) then
3034 Body_Decl := Unit_Declaration_Node (Body_Id);
3036 end Extract_Task_Entry_Attributes;
3040 Prag : constant Node_Id := SPARK_Pragma (Target_Id);
3041 Body_Barf : Node_Id;
3042 Body_Decl : Node_Id;
3043 Spec_Id : Entity_Id;
3045 -- Start of processing for Extract_Target_Attributes
3048 -- Assume that the body of the barrier function is not available
3052 -- The target is a protected entry [family]
3054 if Is_Protected_Entry (Target_Id) then
3055 Extract_Protected_Entry_Attributes
3056 (Spec_Id => Spec_Id,
3057 Body_Decl => Body_Decl,
3058 Body_Barf => Body_Barf);
3060 -- The target is a protected subprogram
3062 elsif Is_Protected_Subp (Target_Id)
3063 or else Is_Protected_Body_Subp (Target_Id)
3065 Extract_Protected_Subprogram_Attributes
3066 (Spec_Id => Spec_Id,
3067 Body_Decl => Body_Decl);
3069 -- The target is a task entry [family]
3071 elsif Is_Task_Entry (Target_Id) then
3072 Extract_Task_Entry_Attributes
3073 (Spec_Id => Spec_Id,
3074 Body_Decl => Body_Decl);
3076 -- Otherwise the target is a package or a subprogram
3079 Extract_Package_Or_Subprogram_Attributes
3080 (Spec_Id => Spec_Id,
3081 Body_Decl => Body_Decl);
3084 -- Set all attributes
3086 Attrs.Body_Barf := Body_Barf;
3087 Attrs.Body_Decl := Body_Decl;
3088 Attrs.Elab_Checks_OK := Is_Elaboration_Checks_OK_Id (Target_Id);
3089 Attrs.From_Source := Comes_From_Source (Target_Id);
3090 Attrs.Ghost_Mode_Ignore := Is_Ignored_Ghost_Entity (Target_Id);
3091 Attrs.SPARK_Mode_On :=
3092 Present (Prag) and then Get_SPARK_Mode_From_Annotation (Prag) = On;
3093 Attrs.Spec_Decl := Unit_Declaration_Node (Spec_Id);
3094 Attrs.Spec_Id := Spec_Id;
3095 Attrs.Unit_Id := Find_Top_Unit (Target_Id);
3097 -- At this point certain attributes should always be available
3099 pragma Assert (Present (Attrs.Spec_Decl));
3100 pragma Assert (Present (Attrs.Spec_Id));
3101 pragma Assert (Present (Attrs.Unit_Id));
3102 end Extract_Target_Attributes;
3104 -----------------------------
3105 -- Extract_Task_Attributes --
3106 -----------------------------
3108 procedure Extract_Task_Attributes
3110 Attrs : out Task_Attributes)
3112 Task_Typ : constant Entity_Id := Non_Private_View (Typ);
3114 Body_Decl : Node_Id;
3115 Body_Id : Entity_Id;
3117 Spec_Id : Entity_Id;
3120 -- Assume that the body of the task procedure is not available
3124 -- The initial declaration is that of the task body procedure
3126 Spec_Id := Get_Task_Body_Procedure (Task_Typ);
3127 Body_Id := Corresponding_Body (Unit_Declaration_Node (Spec_Id));
3129 if Present (Body_Id) then
3130 Body_Decl := Unit_Declaration_Node (Body_Id);
3133 Prag := SPARK_Pragma (Task_Typ);
3135 -- Set all attributes
3137 Attrs.Body_Decl := Body_Decl;
3138 Attrs.Elab_Checks_OK := Is_Elaboration_Checks_OK_Id (Task_Typ);
3139 Attrs.Ghost_Mode_Ignore := Is_Ignored_Ghost_Entity (Task_Typ);
3140 Attrs.SPARK_Mode_On :=
3141 Present (Prag) and then Get_SPARK_Mode_From_Annotation (Prag) = On;
3142 Attrs.Spec_Id := Spec_Id;
3143 Attrs.Task_Decl := Declaration_Node (Task_Typ);
3144 Attrs.Unit_Id := Find_Top_Unit (Task_Typ);
3146 -- At this point certain attributes should always be available
3148 pragma Assert (Present (Attrs.Spec_Id));
3149 pragma Assert (Present (Attrs.Task_Decl));
3150 pragma Assert (Present (Attrs.Unit_Id));
3151 end Extract_Task_Attributes;
3153 -------------------------------------------
3154 -- Extract_Variable_Reference_Attributes --
3155 -------------------------------------------
3157 procedure Extract_Variable_Reference_Attributes
3159 Var_Id : out Entity_Id;
3160 Attrs : out Variable_Attributes)
3162 function Get_Renamed_Variable (Id : Entity_Id) return Entity_Id;
3163 -- Obtain the ultimate renamed variable of variable Id
3165 --------------------------
3166 -- Get_Renamed_Variable --
3167 --------------------------
3169 function Get_Renamed_Variable (Id : Entity_Id) return Entity_Id is
3174 while Present (Renamed_Entity (Ren_Id))
3175 and then Nkind (Renamed_Entity (Ren_Id)) in N_Entity
3177 Ren_Id := Renamed_Entity (Ren_Id);
3181 end Get_Renamed_Variable;
3183 -- Start of processing for Extract_Variable_Reference_Attributes
3186 -- Extraction for variable reference markers
3188 if Nkind (Ref) = N_Variable_Reference_Marker then
3189 Var_Id := Target (Ref);
3191 -- Extraction for expanded names and identifiers
3194 Var_Id := Entity (Ref);
3197 -- Obtain the original variable which the reference mentions
3199 Var_Id := Get_Renamed_Variable (Var_Id);
3200 Attrs.Unit_Id := Find_Top_Unit (Var_Id);
3202 -- At this point certain attributes should always be available
3204 pragma Assert (Present (Attrs.Unit_Id));
3205 end Extract_Variable_Reference_Attributes;
3207 --------------------
3208 -- Find_Code_Unit --
3209 --------------------
3211 function Find_Code_Unit (N : Node_Or_Entity_Id) return Entity_Id is
3213 return Find_Unit_Entity (Unit (Cunit (Get_Code_Unit (N))));
3216 ---------------------------
3217 -- Find_Elaborated_Units --
3218 ---------------------------
3220 procedure Find_Elaborated_Units is
3221 procedure Add_Pragma (Prag : Node_Id);
3222 -- Determine whether pragma Prag denotes a legal Elaborate[_All] pragma.
3223 -- If this is the case, add the related unit to the elaboration context.
3224 -- For pragma Elaborate_All, include recursively all units withed by the
3228 (Unit_Id : Entity_Id;
3230 Full_Context : Boolean);
3231 -- Add unit Unit_Id to the elaboration context. Prag denotes the pragma
3232 -- which prompted the inclusion of the unit to the elaboration context.
3233 -- If flag Full_Context is set, examine the nonlimited clauses of unit
3234 -- Unit_Id and add each withed unit to the context.
3236 procedure Find_Elaboration_Context (Comp_Unit : Node_Id);
3237 -- Examine the context items of compilation unit Comp_Unit for suitable
3238 -- elaboration-related pragmas and add all related units to the context.
3244 procedure Add_Pragma (Prag : Node_Id) is
3245 Prag_Args : constant List_Id := Pragma_Argument_Associations (Prag);
3246 Prag_Nam : constant Name_Id := Pragma_Name (Prag);
3250 -- Nothing to do if the pragma is not related to elaboration
3252 if not Nam_In (Prag_Nam, Name_Elaborate, Name_Elaborate_All) then
3255 -- Nothing to do when the pragma is illegal
3257 elsif Error_Posted (Prag) then
3261 Unit_Arg := Get_Pragma_Arg (First (Prag_Args));
3263 -- The argument of the pragma may appear in package.package form
3265 if Nkind (Unit_Arg) = N_Selected_Component then
3266 Unit_Arg := Selector_Name (Unit_Arg);
3270 (Unit_Id => Entity (Unit_Arg),
3272 Full_Context => Prag_Nam = Name_Elaborate_All);
3280 (Unit_Id : Entity_Id;
3282 Full_Context : Boolean)
3285 Elab_Attrs : Elaboration_Attributes;
3288 -- Nothing to do when some previous error left a with clause or a
3289 -- pragma in a bad state.
3291 if No (Unit_Id) then
3295 Elab_Attrs := Elaboration_Context.Get (Unit_Id);
3297 -- The current unit is not part of the context. Prepare a new set of
3300 if Elab_Attrs = No_Elaboration_Attributes then
3302 Elaboration_Attributes'(Source_Pragma
=> Prag
,
3303 With_Clause
=> Empty
);
3305 -- The unit is already included in the context by means of pragma
3306 -- Elaborate. "Upgrage" the existing attributes when the unit is
3307 -- subject to Elaborate_All because the new pragma covers a larger
3308 -- set of units. All other properties remain the same.
3310 elsif Pragma_Name
(Elab_Attrs
.Source_Pragma
) = Name_Elaborate
3311 and then Pragma_Name
(Prag
) = Name_Elaborate_All
3313 Elab_Attrs
.Source_Pragma
:= Prag
;
3315 -- Otherwise the unit is already included in the context
3321 -- Add or update the attributes of the unit
3323 Elaboration_Context
.Set
(Unit_Id
, Elab_Attrs
);
3325 -- Includes all units withed by the current one when computing the
3328 if Full_Context
then
3330 -- Process all nonlimited with clauses found in the context of
3331 -- the current unit. Note that limited clauses do not impose an
3332 -- elaboration order.
3334 Clause
:= First
(Context_Items
(Compilation_Unit
(Unit_Id
)));
3335 while Present
(Clause
) loop
3336 if Nkind
(Clause
) = N_With_Clause
3337 and then not Error_Posted
(Clause
)
3338 and then not Limited_Present
(Clause
)
3341 (Unit_Id
=> Entity
(Name
(Clause
)),
3343 Full_Context
=> Full_Context
);
3351 ------------------------------
3352 -- Find_Elaboration_Context --
3353 ------------------------------
3355 procedure Find_Elaboration_Context
(Comp_Unit
: Node_Id
) is
3359 pragma Assert
(Nkind
(Comp_Unit
) = N_Compilation_Unit
);
3361 -- Process all elaboration-related pragmas found in the context of
3362 -- the compilation unit.
3364 Prag
:= First
(Context_Items
(Comp_Unit
));
3365 while Present
(Prag
) loop
3366 if Nkind
(Prag
) = N_Pragma
then
3372 end Find_Elaboration_Context
;
3379 -- Start of processing for Find_Elaborated_Units
3382 -- Perform a traversal which examines the context of the main unit and
3383 -- populates the Elaboration_Context table with all units elaborated
3384 -- prior to the main unit. The traversal performs the following jumps:
3386 -- subunit -> parent subunit
3387 -- parent subunit -> body
3389 -- spec -> parent spec
3390 -- parent spec -> grandparent spec and so on
3392 -- The traversal relies on units rather than scopes because the scope of
3393 -- a subunit is some spec, while this traversal must process the body as
3394 -- well. Given that protected and task bodies can also be subunits, this
3395 -- complicates the scope approach even further.
3397 Unt
:= Unit
(Cunit
(Main_Unit
));
3399 -- Perform the following traversals when the main unit is a subunit
3401 -- subunit -> parent subunit
3402 -- parent subunit -> body
3404 while Present
(Unt
) and then Nkind
(Unt
) = N_Subunit
loop
3405 Find_Elaboration_Context
(Parent
(Unt
));
3407 -- Continue the traversal by going to the unit which contains the
3408 -- corresponding stub.
3410 if Present
(Corresponding_Stub
(Unt
)) then
3411 Unt
:= Unit
(Cunit
(Get_Source_Unit
(Corresponding_Stub
(Unt
))));
3413 -- Otherwise the subunit may be erroneous or left in a bad state
3420 -- Perform the following traversal now that subunits have been taken
3421 -- care of, or the main unit is a body.
3426 and then Nkind_In
(Unt
, N_Package_Body
, N_Subprogram_Body
)
3428 Find_Elaboration_Context
(Parent
(Unt
));
3430 -- Continue the traversal by going to the unit which contains the
3431 -- corresponding spec.
3433 if Present
(Corresponding_Spec
(Unt
)) then
3434 Unt
:= Unit
(Cunit
(Get_Source_Unit
(Corresponding_Spec
(Unt
))));
3438 -- Perform the following traversals now that the body has been taken
3439 -- care of, or the main unit is a spec.
3441 -- spec -> parent spec
3442 -- parent spec -> grandparent spec and so on
3445 and then Nkind_In
(Unt
, N_Generic_Package_Declaration
,
3446 N_Generic_Subprogram_Declaration
,
3447 N_Package_Declaration
,
3448 N_Subprogram_Declaration
)
3450 Find_Elaboration_Context
(Parent
(Unt
));
3452 -- Process a potential chain of parent units which ends with the
3453 -- main unit spec. The traversal can now safely rely on the scope
3456 Par_Id
:= Scope
(Defining_Entity
(Unt
));
3457 while Present
(Par_Id
) and then Par_Id
/= Standard_Standard
loop
3458 Find_Elaboration_Context
(Compilation_Unit
(Par_Id
));
3460 Par_Id
:= Scope
(Par_Id
);
3463 end Find_Elaborated_Units
;
3465 -----------------------------
3466 -- Find_Enclosing_Instance --
3467 -----------------------------
3469 function Find_Enclosing_Instance
(N
: Node_Id
) return Node_Id
is
3471 Spec_Id
: Entity_Id
;
3474 -- Climb the parent chain looking for an enclosing instance spec or body
3477 while Present
(Par
) loop
3479 -- Generic package or subprogram spec
3481 if Nkind_In
(Par
, N_Package_Declaration
,
3482 N_Subprogram_Declaration
)
3483 and then Is_Generic_Instance
(Defining_Entity
(Par
))
3487 -- Generic package or subprogram body
3489 elsif Nkind_In
(Par
, N_Package_Body
, N_Subprogram_Body
) then
3490 Spec_Id
:= Corresponding_Spec
(Par
);
3492 if Present
(Spec_Id
) and then Is_Generic_Instance
(Spec_Id
) then
3497 Par
:= Parent
(Par
);
3501 end Find_Enclosing_Instance
;
3503 --------------------------
3504 -- Find_Enclosing_Level --
3505 --------------------------
3507 function Find_Enclosing_Level
(N
: Node_Id
) return Enclosing_Level_Kind
is
3508 function Level_Of
(Unit
: Node_Id
) return Enclosing_Level_Kind
;
3509 -- Obtain the corresponding level of unit Unit
3515 function Level_Of
(Unit
: Node_Id
) return Enclosing_Level_Kind
is
3516 Spec_Id
: Entity_Id
;
3519 if Nkind
(Unit
) in N_Generic_Instantiation
then
3520 return Instantiation
;
3522 elsif Nkind
(Unit
) = N_Generic_Package_Declaration
then
3523 return Generic_Package_Spec
;
3525 elsif Nkind
(Unit
) = N_Package_Declaration
then
3526 return Package_Spec
;
3528 elsif Nkind
(Unit
) = N_Package_Body
then
3529 Spec_Id
:= Corresponding_Spec
(Unit
);
3531 -- The body belongs to a generic package
3533 if Present
(Spec_Id
)
3534 and then Ekind
(Spec_Id
) = E_Generic_Package
3536 return Generic_Package_Body
;
3538 -- Otherwise the body belongs to a non-generic package. This also
3539 -- treats an illegal package body without a corresponding spec as
3540 -- a non-generic package body.
3543 return Package_Body
;
3556 -- Start of processing for Find_Enclosing_Level
3559 -- Call markers and instantiations which appear at the declaration level
3560 -- but are later relocated in a different context retain their original
3561 -- declaration level.
3563 if Nkind_In
(N
, N_Call_Marker
,
3564 N_Function_Instantiation
,
3565 N_Package_Instantiation
,
3566 N_Procedure_Instantiation
)
3567 and then Is_Declaration_Level_Node
(N
)
3569 return Declaration_Level
;
3572 -- Climb the parent chain looking at the enclosing levels
3575 Curr
:= Parent
(Prev
);
3576 while Present
(Curr
) loop
3578 -- A traversal from a subunit continues via the corresponding stub
3580 if Nkind
(Curr
) = N_Subunit
then
3581 Curr
:= Corresponding_Stub
(Curr
);
3583 -- The current construct is a package. Packages are ignored because
3584 -- they are always elaborated when the enclosing context is invoked
3587 elsif Nkind_In
(Curr
, N_Package_Body
, N_Package_Declaration
) then
3590 -- The current construct is a block statement
3592 elsif Nkind
(Curr
) = N_Block_Statement
then
3594 -- Ignore internally generated blocks created by the expander for
3595 -- various purposes such as abort defer/undefer.
3597 if not Comes_From_Source
(Curr
) then
3600 -- If the traversal came from the handled sequence of statments,
3601 -- then the node appears at the level of the enclosing construct.
3602 -- This is a more reliable test because transients scopes within
3603 -- the declarative region of the encapsulator are hard to detect.
3605 elsif Nkind
(Prev
) = N_Handled_Sequence_Of_Statements
3606 and then Handled_Statement_Sequence
(Curr
) = Prev
3608 return Find_Enclosing_Level
(Parent
(Curr
));
3610 -- Otherwise the traversal came from the declarations, the node is
3611 -- at the declaration level.
3614 return Declaration_Level
;
3617 -- The current construct is a declaration-level encapsulator
3619 elsif Nkind_In
(Curr
, N_Entry_Body
,
3623 -- If the traversal came from the handled sequence of statments,
3624 -- then the node cannot possibly appear at any level. This is
3625 -- a more reliable test because transients scopes within the
3626 -- declarative region of the encapsulator are hard to detect.
3628 if Nkind
(Prev
) = N_Handled_Sequence_Of_Statements
3629 and then Handled_Statement_Sequence
(Curr
) = Prev
3633 -- Otherwise the traversal came from the declarations, the node is
3634 -- at the declaration level.
3637 return Declaration_Level
;
3640 -- The current construct is a non-library-level encapsulator which
3641 -- indicates that the node cannot possibly appear at any level.
3642 -- Note that this check must come after the declaration-level check
3643 -- because both predicates share certain nodes.
3645 elsif Is_Non_Library_Level_Encapsulator
(Curr
) then
3646 Context
:= Parent
(Curr
);
3648 -- The sole exception is when the encapsulator is the compilation
3649 -- utit itself because the compilation unit node requires special
3650 -- processing (see below).
3652 if Present
(Context
)
3653 and then Nkind
(Context
) = N_Compilation_Unit
3657 -- Otherwise the node is not at any level
3663 -- The current construct is a compilation unit. The node appears at
3664 -- the [generic] library level when the unit is a [generic] package.
3666 elsif Nkind
(Curr
) = N_Compilation_Unit
then
3667 return Level_Of
(Unit
(Curr
));
3671 Curr
:= Parent
(Prev
);
3675 end Find_Enclosing_Level
;
3681 function Find_Top_Unit
(N
: Node_Or_Entity_Id
) return Entity_Id
is
3683 return Find_Unit_Entity
(Unit
(Cunit
(Get_Top_Level_Code_Unit
(N
))));
3686 ----------------------
3687 -- Find_Unit_Entity --
3688 ----------------------
3690 function Find_Unit_Entity
(N
: Node_Id
) return Entity_Id
is
3691 Context
: constant Node_Id
:= Parent
(N
);
3692 Orig_N
: constant Node_Id
:= Original_Node
(N
);
3695 -- The unit denotes a package body of an instantiation which acts as
3696 -- a compilation unit. The proper entity is that of the package spec.
3698 if Nkind
(N
) = N_Package_Body
3699 and then Nkind
(Orig_N
) = N_Package_Instantiation
3700 and then Nkind
(Context
) = N_Compilation_Unit
3702 return Corresponding_Spec
(N
);
3704 -- The unit denotes an anonymous package created to wrap a subprogram
3705 -- instantiation which acts as a compilation unit. The proper entity is
3706 -- that of the "related instance".
3708 elsif Nkind
(N
) = N_Package_Declaration
3709 and then Nkind_In
(Orig_N
, N_Function_Instantiation
,
3710 N_Procedure_Instantiation
)
3711 and then Nkind
(Context
) = N_Compilation_Unit
3714 Related_Instance
(Defining_Entity
(N
, Concurrent_Subunit
=> True));
3716 -- Otherwise the proper entity is the defining entity
3719 return Defining_Entity
(N
, Concurrent_Subunit
=> True);
3721 end Find_Unit_Entity
;
3723 -----------------------
3724 -- First_Formal_Type --
3725 -----------------------
3727 function First_Formal_Type
(Subp_Id
: Entity_Id
) return Entity_Id
is
3728 Formal_Id
: constant Entity_Id
:= First_Formal
(Subp_Id
);
3732 if Present
(Formal_Id
) then
3733 Typ
:= Etype
(Formal_Id
);
3735 -- Handle various combinations of concurrent and private types
3738 if Ekind_In
(Typ
, E_Protected_Type
, E_Task_Type
)
3739 and then Present
(Anonymous_Object
(Typ
))
3741 Typ
:= Anonymous_Object
(Typ
);
3743 elsif Is_Concurrent_Record_Type
(Typ
) then
3744 Typ
:= Corresponding_Concurrent_Type
(Typ
);
3746 elsif Is_Private_Type
(Typ
) and then Present
(Full_View
(Typ
)) then
3747 Typ
:= Full_View
(Typ
);
3758 end First_Formal_Type
;
3764 function Has_Body
(Pack_Decl
: Node_Id
) return Boolean is
3765 function Find_Corresponding_Body
(Spec_Id
: Entity_Id
) return Node_Id
;
3766 -- Try to locate the corresponding body of spec Spec_Id. If no body is
3767 -- found, return Empty.
3770 (Spec_Id
: Entity_Id
;
3771 From
: Node_Id
) return Node_Id
;
3772 -- Try to locate the corresponding body of spec Spec_Id in the node list
3773 -- which follows arbitrary node From. If no body is found, return Empty.
3775 function Load_Package_Body
(Unit_Nam
: Unit_Name_Type
) return Node_Id
;
3776 -- Attempt to load the body of unit Unit_Nam. If the load failed, return
3777 -- Empty. If the compilation will not generate code, return Empty.
3779 -----------------------------
3780 -- Find_Corresponding_Body --
3781 -----------------------------
3783 function Find_Corresponding_Body
(Spec_Id
: Entity_Id
) return Node_Id
is
3784 Context
: constant Entity_Id
:= Scope
(Spec_Id
);
3785 Spec_Decl
: constant Node_Id
:= Unit_Declaration_Node
(Spec_Id
);
3786 Body_Decl
: Node_Id
;
3787 Body_Id
: Entity_Id
;
3790 if Is_Compilation_Unit
(Spec_Id
) then
3791 Body_Id
:= Corresponding_Body
(Spec_Decl
);
3793 if Present
(Body_Id
) then
3794 return Unit_Declaration_Node
(Body_Id
);
3796 -- The package is at the library and requires a body. Load the
3797 -- corresponding body because the optional body may be declared
3800 elsif Unit_Requires_Body
(Spec_Id
) then
3803 (Get_Body_Name
(Unit_Name
(Get_Source_Unit
(Spec_Decl
))));
3805 -- Otherwise there is no optional body
3811 -- The immediate context is a package. The optional body may be
3812 -- within the body of that package.
3814 -- procedure Proc is
3815 -- package Nested_1 is
3816 -- package Nested_2 is
3823 -- package body Nested_1 is
3824 -- package body Nested_2 is separate;
3827 -- separate (Proc.Nested_1.Nested_2)
3828 -- package body Nested_2 is
3829 -- package body Pack is -- optional body
3834 elsif Is_Package_Or_Generic_Package
(Context
) then
3835 Body_Decl
:= Find_Corresponding_Body
(Context
);
3837 -- The optional body is within the body of the enclosing package
3839 if Present
(Body_Decl
) then
3842 (Spec_Id
=> Spec_Id
,
3843 From
=> First
(Declarations
(Body_Decl
)));
3845 -- Otherwise the enclosing package does not have a body. This may
3846 -- be the result of an error or a genuine lack of a body.
3852 -- Otherwise the immediate context is a body. The optional body may
3853 -- be within the same list as the spec.
3855 -- procedure Proc is
3860 -- package body Pack is -- optional body
3867 (Spec_Id
=> Spec_Id
,
3868 From
=> Next
(Spec_Decl
));
3870 end Find_Corresponding_Body
;
3877 (Spec_Id
: Entity_Id
;
3878 From
: Node_Id
) return Node_Id
3880 Spec_Nam
: constant Name_Id
:= Chars
(Spec_Id
);
3886 while Present
(Item
) loop
3888 -- The current item denotes the optional body
3890 if Nkind
(Item
) = N_Package_Body
3891 and then Chars
(Defining_Entity
(Item
)) = Spec_Nam
3895 -- The current item denotes a stub, the optional body may be in
3898 elsif Nkind
(Item
) = N_Package_Body_Stub
3899 and then Chars
(Defining_Entity
(Item
)) = Spec_Nam
3901 Lib_Unit
:= Library_Unit
(Item
);
3903 -- The corresponding subunit was previously loaded
3905 if Present
(Lib_Unit
) then
3908 -- Otherwise attempt to load the corresponding subunit
3911 return Load_Package_Body
(Get_Unit_Name
(Item
));
3921 -----------------------
3922 -- Load_Package_Body --
3923 -----------------------
3925 function Load_Package_Body
(Unit_Nam
: Unit_Name_Type
) return Node_Id
is
3926 Body_Decl
: Node_Id
;
3927 Unit_Num
: Unit_Number_Type
;
3930 -- The load is performed only when the compilation will generate code
3932 if Operating_Mode
= Generate_Code
then
3935 (Load_Name
=> Unit_Nam
,
3938 Error_Node
=> Pack_Decl
);
3940 -- The load failed most likely because the physical file is
3943 if Unit_Num
= No_Unit
then
3946 -- Otherwise the load was successful, return the body of the unit
3949 Body_Decl
:= Unit
(Cunit
(Unit_Num
));
3951 -- If the unit is a subunit with an available proper body,
3952 -- return the proper body.
3954 if Nkind
(Body_Decl
) = N_Subunit
3955 and then Present
(Proper_Body
(Body_Decl
))
3957 Body_Decl
:= Proper_Body
(Body_Decl
);
3965 end Load_Package_Body
;
3969 Pack_Id
: constant Entity_Id
:= Defining_Entity
(Pack_Decl
);
3971 -- Start of processing for Has_Body
3974 -- The body is available
3976 if Present
(Corresponding_Body
(Pack_Decl
)) then
3979 -- The body is required if the package spec contains a construct which
3980 -- requires a completion in a body.
3982 elsif Unit_Requires_Body
(Pack_Id
) then
3985 -- The body may be optional
3988 return Present
(Find_Corresponding_Body
(Pack_Id
));
3992 ---------------------------
3993 -- Has_Prior_Elaboration --
3994 ---------------------------
3996 function Has_Prior_Elaboration
3997 (Unit_Id
: Entity_Id
;
3998 Context_OK
: Boolean := False;
3999 Elab_Body_OK
: Boolean := False;
4000 Same_Unit_OK
: Boolean := False) return Boolean
4002 Main_Id
: constant Entity_Id
:= Cunit_Entity
(Main_Unit
);
4005 -- A preelaborated unit is always elaborated prior to the main unit
4007 if Is_Preelaborated_Unit
(Unit_Id
) then
4010 -- An internal unit is always elaborated prior to a non-internal main
4013 elsif In_Internal_Unit
(Unit_Id
)
4014 and then not In_Internal_Unit
(Main_Id
)
4018 -- A unit has prior elaboration if it appears within the context of the
4019 -- main unit. Consider this case only when requested by the caller.
4022 and then Elaboration_Context
.Get
(Unit_Id
) /= No_Elaboration_Attributes
4026 -- A unit whose body is elaborated together with its spec has prior
4027 -- elaboration except with respect to itself. Consider this case only
4028 -- when requested by the caller.
4031 and then Has_Pragma_Elaborate_Body
(Unit_Id
)
4032 and then not Is_Same_Unit
(Unit_Id
, Main_Id
)
4036 -- A unit has no prior elaboration with respect to itself, but does not
4037 -- require any means of ensuring its own elaboration either. Treat this
4038 -- case as valid prior elaboration only when requested by the caller.
4040 elsif Same_Unit_OK
and then Is_Same_Unit
(Unit_Id
, Main_Id
) then
4045 end Has_Prior_Elaboration
;
4047 --------------------------
4048 -- In_External_Instance --
4049 --------------------------
4051 function In_External_Instance
4053 Target_Decl
: Node_Id
) return Boolean
4056 Inst_Body
: Node_Id
;
4057 Inst_Decl
: Node_Id
;
4060 -- Performance note: parent traversal
4062 Inst_Decl
:= Find_Enclosing_Instance
(Target_Decl
);
4064 -- The target declaration appears within an instance spec. Visibility is
4065 -- ignored because internally generated primitives for private types may
4066 -- reside in the private declarations and still be invoked from outside.
4068 if Present
(Inst_Decl
)
4069 and then Nkind
(Inst_Decl
) = N_Package_Declaration
4071 -- The scenario comes from the main unit and the instance does not
4073 if In_Extended_Main_Code_Unit
(N
)
4074 and then not In_Extended_Main_Code_Unit
(Inst_Decl
)
4078 -- Otherwise the scenario must not appear within the instance spec or
4082 Extract_Instance_Attributes
4083 (Exp_Inst
=> Inst_Decl
,
4084 Inst_Body
=> Inst_Body
,
4085 Inst_Decl
=> Dummy
);
4087 -- Performance note: parent traversal
4089 return not In_Subtree
4092 Root2
=> Inst_Body
);
4097 end In_External_Instance
;
4099 ---------------------
4100 -- In_Main_Context --
4101 ---------------------
4103 function In_Main_Context
(N
: Node_Id
) return Boolean is
4105 -- Scenarios outside the main unit are not considered because the ALI
4106 -- information supplied to binde is for the main unit only.
4108 if not In_Extended_Main_Code_Unit
(N
) then
4111 -- Scenarios within internal units are not considered unless switch
4112 -- -gnatdE (elaboration checks on predefined units) is in effect.
4114 elsif not Debug_Flag_EE
and then In_Internal_Unit
(N
) then
4119 end In_Main_Context
;
4121 ---------------------
4122 -- In_Same_Context --
4123 ---------------------
4125 function In_Same_Context
4128 Nested_OK
: Boolean := False) return Boolean
4130 function Find_Enclosing_Context
(N
: Node_Id
) return Node_Id
;
4131 -- Return the nearest enclosing non-library-level or compilation unit
4132 -- node which which encapsulates arbitrary node N. Return Empty is no
4133 -- such context is available.
4135 function In_Nested_Context
4137 Inner
: Node_Id
) return Boolean;
4138 -- Determine whether arbitrary node Outer encapsulates arbitrary node
4141 ----------------------------
4142 -- Find_Enclosing_Context --
4143 ----------------------------
4145 function Find_Enclosing_Context
(N
: Node_Id
) return Node_Id
is
4151 while Present
(Par
) loop
4153 -- A traversal from a subunit continues via the corresponding stub
4155 if Nkind
(Par
) = N_Subunit
then
4156 Par
:= Corresponding_Stub
(Par
);
4158 -- Stop the traversal when the nearest enclosing non-library level
4159 -- encapsulator has been reached.
4161 elsif Is_Non_Library_Level_Encapsulator
(Par
) then
4162 Context
:= Parent
(Par
);
4164 -- The sole exception is when the encapsulator is the unit of
4165 -- compilation because this case requires special processing
4168 if Present
(Context
)
4169 and then Nkind
(Context
) = N_Compilation_Unit
4177 -- Reaching a compilation unit node without hitting a non-library-
4178 -- level encapsulator indicates that N is at the library level in
4179 -- which case the compilation unit is the context.
4181 elsif Nkind
(Par
) = N_Compilation_Unit
then
4185 Par
:= Parent
(Par
);
4189 end Find_Enclosing_Context
;
4191 -----------------------
4192 -- In_Nested_Context --
4193 -----------------------
4195 function In_Nested_Context
4197 Inner
: Node_Id
) return Boolean
4203 while Present
(Par
) loop
4205 -- A traversal from a subunit continues via the corresponding stub
4207 if Nkind
(Par
) = N_Subunit
then
4208 Par
:= Corresponding_Stub
(Par
);
4210 elsif Par
= Outer
then
4214 Par
:= Parent
(Par
);
4218 end In_Nested_Context
;
4222 Context_1
: constant Node_Id
:= Find_Enclosing_Context
(N1
);
4223 Context_2
: constant Node_Id
:= Find_Enclosing_Context
(N2
);
4225 -- Start of processing for In_Same_Context
4228 -- Both nodes appear within the same context
4230 if Context_1
= Context_2
then
4233 -- Both nodes appear in compilation units. Determine whether one unit
4234 -- is the body of the other.
4236 elsif Nkind
(Context_1
) = N_Compilation_Unit
4237 and then Nkind
(Context_2
) = N_Compilation_Unit
4241 (Unit_1
=> Defining_Entity
(Unit
(Context_1
)),
4242 Unit_2
=> Defining_Entity
(Unit
(Context_2
)));
4244 -- The context of N1 encloses the context of N2
4246 elsif Nested_OK
and then In_Nested_Context
(Context_1
, Context_2
) then
4251 end In_Same_Context
;
4257 procedure Initialize
is
4259 -- Set the soft link which enables Atree.Rewrite to update a top-level
4260 -- scenario each time it is transformed into another node.
4262 Set_Rewriting_Proc
(Update_Elaboration_Scenario
'Access);
4271 Target_Id
: Entity_Id
;
4275 procedure Info_Accept_Alternative
;
4276 pragma Inline
(Info_Accept_Alternative
);
4277 -- Output information concerning an accept alternative
4279 procedure Info_Simple_Call
;
4280 pragma Inline
(Info_Simple_Call
);
4281 -- Output information concerning the call
4283 procedure Info_Type_Actions
(Action
: String);
4284 pragma Inline
(Info_Type_Actions
);
4285 -- Output information concerning action Action of a type
4287 procedure Info_Verification_Call
4291 pragma Inline
(Info_Verification_Call
);
4292 -- Output information concerning the verification of predicate Pred
4293 -- applied to related entity Id with kind Id_Kind.
4295 -----------------------------
4296 -- Info_Accept_Alternative --
4297 -----------------------------
4299 procedure Info_Accept_Alternative
is
4300 Entry_Id
: constant Entity_Id
:= Receiving_Entry
(Target_Id
);
4303 pragma Assert
(Present
(Entry_Id
));
4306 (Msg
=> "accept for entry & during elaboration",
4309 Info_Msg
=> Info_Msg
,
4310 In_SPARK
=> In_SPARK
);
4311 end Info_Accept_Alternative
;
4313 ----------------------
4314 -- Info_Simple_Call --
4315 ----------------------
4317 procedure Info_Simple_Call
is
4320 (Msg
=> "call to & during elaboration",
4323 Info_Msg
=> Info_Msg
,
4324 In_SPARK
=> In_SPARK
);
4325 end Info_Simple_Call
;
4327 -----------------------
4328 -- Info_Type_Actions --
4329 -----------------------
4331 procedure Info_Type_Actions
(Action
: String) is
4332 Typ
: constant Entity_Id
:= First_Formal_Type
(Target_Id
);
4335 pragma Assert
(Present
(Typ
));
4338 (Msg
=> Action
& " actions for type & during elaboration",
4341 Info_Msg
=> Info_Msg
,
4342 In_SPARK
=> In_SPARK
);
4343 end Info_Type_Actions
;
4345 ----------------------------
4346 -- Info_Verification_Call --
4347 ----------------------------
4349 procedure Info_Verification_Call
4355 pragma Assert
(Present
(Id
));
4359 "verification of " & Pred
& " of " & Id_Kind
& " & during "
4363 Info_Msg
=> Info_Msg
,
4364 In_SPARK
=> In_SPARK
);
4365 end Info_Verification_Call
;
4367 -- Start of processing for Info_Call
4370 -- Do not output anything for targets defined in internal units because
4371 -- this creates noise.
4373 if not In_Internal_Unit
(Target_Id
) then
4375 -- Accept alternative
4377 if Is_Accept_Alternative_Proc
(Target_Id
) then
4378 Info_Accept_Alternative
;
4382 elsif Is_TSS
(Target_Id
, TSS_Deep_Adjust
) then
4383 Info_Type_Actions
("adjustment");
4385 -- Default_Initial_Condition
4387 elsif Is_Default_Initial_Condition_Proc
(Target_Id
) then
4388 Info_Verification_Call
4389 (Pred
=> "Default_Initial_Condition",
4390 Id
=> First_Formal_Type
(Target_Id
),
4395 elsif Is_Protected_Entry
(Target_Id
) then
4398 -- Task entry calls are never processed because the entry being
4399 -- invoked does not have a corresponding "body", it has a select.
4401 elsif Is_Task_Entry
(Target_Id
) then
4406 elsif Is_TSS
(Target_Id
, TSS_Deep_Finalize
) then
4407 Info_Type_Actions
("finalization");
4409 -- Calls to _Finalizer procedures must not appear in the output
4410 -- because this creates confusing noise.
4412 elsif Is_Finalizer_Proc
(Target_Id
) then
4415 -- Initial_Condition
4417 elsif Is_Initial_Condition_Proc
(Target_Id
) then
4418 Info_Verification_Call
4419 (Pred
=> "Initial_Condition",
4420 Id
=> Find_Enclosing_Scope
(Call
),
4421 Id_Kind
=> "package");
4425 elsif Is_Init_Proc
(Target_Id
)
4426 or else Is_TSS
(Target_Id
, TSS_Deep_Initialize
)
4428 Info_Type_Actions
("initialization");
4432 elsif Is_Invariant_Proc
(Target_Id
) then
4433 Info_Verification_Call
4434 (Pred
=> "invariants",
4435 Id
=> First_Formal_Type
(Target_Id
),
4438 -- Partial invariant calls must not appear in the output because this
4439 -- creates confusing noise.
4441 elsif Is_Partial_Invariant_Proc
(Target_Id
) then
4446 elsif Is_Postconditions_Proc
(Target_Id
) then
4447 Info_Verification_Call
4448 (Pred
=> "postconditions",
4449 Id
=> Find_Enclosing_Scope
(Call
),
4450 Id_Kind
=> "subprogram");
4452 -- Subprograms must come last because some of the previous cases fall
4453 -- under this category.
4455 elsif Ekind
(Target_Id
) = E_Function
then
4458 elsif Ekind
(Target_Id
) = E_Procedure
then
4462 pragma Assert
(False);
4468 ------------------------
4469 -- Info_Instantiation --
4470 ------------------------
4472 procedure Info_Instantiation
4480 (Msg
=> "instantiation of & during elaboration",
4483 Info_Msg
=> Info_Msg
,
4484 In_SPARK
=> In_SPARK
);
4485 end Info_Instantiation
;
4487 -----------------------------
4488 -- Info_Variable_Reference --
4489 -----------------------------
4491 procedure Info_Variable_Reference
4498 if Is_Read
(Ref
) then
4500 (Msg
=> "read of variable & during elaboration",
4503 Info_Msg
=> Info_Msg
,
4504 In_SPARK
=> In_SPARK
);
4506 end Info_Variable_Reference
;
4508 --------------------
4509 -- Insertion_Node --
4510 --------------------
4512 function Insertion_Node
(N
: Node_Id
; Ins_Nod
: Node_Id
) return Node_Id
is
4514 -- When the scenario denotes an instantiation, the proper insertion node
4515 -- is the instance spec. This ensures that the generic actuals will not
4516 -- be evaluated prior to a potential ABE.
4518 if Nkind
(N
) in N_Generic_Instantiation
4519 and then Present
(Instance_Spec
(N
))
4521 return Instance_Spec
(N
);
4523 -- Otherwise the proper insertion node is the candidate insertion node
4530 -----------------------
4531 -- Install_ABE_Check --
4532 -----------------------
4534 procedure Install_ABE_Check
4539 Check_Ins_Nod
: constant Node_Id
:= Insertion_Node
(N
, Ins_Nod
);
4540 -- Insert the check prior to this node
4542 Loc
: constant Source_Ptr
:= Sloc
(N
);
4543 Spec_Id
: constant Entity_Id
:= Unique_Entity
(Id
);
4544 Unit_Id
: constant Entity_Id
:= Find_Top_Unit
(Id
);
4545 Scop_Id
: Entity_Id
;
4548 -- Nothing to do when compiling for GNATprove because raise statements
4549 -- are not supported.
4551 if GNATprove_Mode
then
4554 -- Nothing to do when the compilation will not produce an executable
4556 elsif Serious_Errors_Detected
> 0 then
4559 -- Nothing to do for a compilation unit because there is no executable
4560 -- environment at that level.
4562 elsif Nkind
(Parent
(Check_Ins_Nod
)) = N_Compilation_Unit
then
4565 -- Nothing to do when the unit is elaborated prior to the main unit.
4566 -- This check must also consider the following cases:
4568 -- * Id's unit appears in the context of the main unit
4570 -- * Id's unit is subject to pragma Elaborate_Body. An ABE check MUST
4571 -- NOT be generated because Id's unit is always elaborated prior to
4574 -- * Id's unit is the main unit. An ABE check MUST be generated in this
4575 -- case because a conditional ABE may be raised depending on the flow
4576 -- of execution within the main unit (flag Same_Unit_OK is False).
4578 elsif Has_Prior_Elaboration
4579 (Unit_Id
=> Unit_Id
,
4581 Elab_Body_OK
=> True)
4586 -- Prevent multiple scenarios from installing the same ABE check
4588 Set_Is_Elaboration_Checks_OK_Node
(N
, False);
4590 -- Install the nearest enclosing scope of the scenario as there must be
4591 -- something on the scope stack.
4593 -- Performance note: parent traversal
4595 Scop_Id
:= Find_Enclosing_Scope
(Check_Ins_Nod
);
4596 pragma Assert
(Present
(Scop_Id
));
4598 Push_Scope
(Scop_Id
);
4601 -- if not Spec_Id'Elaborated then
4602 -- raise Program_Error with "access before elaboration";
4605 Insert_Action
(Check_Ins_Nod
,
4606 Make_Raise_Program_Error
(Loc
,
4610 Make_Attribute_Reference
(Loc
,
4611 Prefix
=> New_Occurrence_Of
(Spec_Id
, Loc
),
4612 Attribute_Name
=> Name_Elaborated
)),
4613 Reason
=> PE_Access_Before_Elaboration
));
4616 end Install_ABE_Check
;
4618 -----------------------
4619 -- Install_ABE_Check --
4620 -----------------------
4622 procedure Install_ABE_Check
4624 Target_Id
: Entity_Id
;
4625 Target_Decl
: Node_Id
;
4626 Target_Body
: Node_Id
;
4629 procedure Build_Elaboration_Entity
;
4630 pragma Inline
(Build_Elaboration_Entity
);
4631 -- Create a new elaboration flag for Target_Id, insert it prior to
4632 -- Target_Decl, and set it after Body_Decl.
4634 ------------------------------
4635 -- Build_Elaboration_Entity --
4636 ------------------------------
4638 procedure Build_Elaboration_Entity
is
4639 Loc
: constant Source_Ptr
:= Sloc
(Target_Id
);
4640 Flag_Id
: Entity_Id
;
4643 -- Create the declaration of the elaboration flag. The name carries a
4644 -- unique counter in case of name overloading.
4647 Make_Defining_Identifier
(Loc
,
4648 Chars
=> New_External_Name
(Chars
(Target_Id
), 'E', -1));
4650 Set_Elaboration_Entity
(Target_Id
, Flag_Id
);
4651 Set_Elaboration_Entity_Required
(Target_Id
);
4653 Push_Scope
(Scope
(Target_Id
));
4656 -- Enn : Short_Integer := 0;
4658 Insert_Action
(Target_Decl
,
4659 Make_Object_Declaration
(Loc
,
4660 Defining_Identifier
=> Flag_Id
,
4661 Object_Definition
=>
4662 New_Occurrence_Of
(Standard_Short_Integer
, Loc
),
4663 Expression
=> Make_Integer_Literal
(Loc
, Uint_0
)));
4668 Set_Elaboration_Flag
(Target_Body
, Target_Id
);
4671 end Build_Elaboration_Entity
;
4675 Target_Unit_Id
: constant Entity_Id
:= Find_Top_Unit
(Target_Id
);
4677 -- Start for processing for Install_ABE_Check
4680 -- Nothing to do when compiling for GNATprove because raise statements
4681 -- are not supported.
4683 if GNATprove_Mode
then
4686 -- Nothing to do when the compilation will not produce an executable
4688 elsif Serious_Errors_Detected
> 0 then
4691 -- Nothing to do when the target is a protected subprogram because the
4692 -- check is associated with the protected body subprogram.
4694 elsif Is_Protected_Subp
(Target_Id
) then
4697 -- Nothing to do when the target is elaborated prior to the main unit.
4698 -- This check must also consider the following cases:
4700 -- * The unit of the target appears in the context of the main unit
4702 -- * The unit of the target is subject to pragma Elaborate_Body. An ABE
4703 -- check MUST NOT be generated because the unit is always elaborated
4704 -- prior to the main unit.
4706 -- * The unit of the target is the main unit. An ABE check MUST be added
4707 -- in this case because a conditional ABE may be raised depending on
4708 -- the flow of execution within the main unit (flag Same_Unit_OK is
4711 elsif Has_Prior_Elaboration
4712 (Unit_Id
=> Target_Unit_Id
,
4714 Elab_Body_OK
=> True)
4718 -- Create an elaboration flag for the target when it does not have one
4720 elsif No
(Elaboration_Entity
(Target_Id
)) then
4721 Build_Elaboration_Entity
;
4728 end Install_ABE_Check
;
4730 -------------------------
4731 -- Install_ABE_Failure --
4732 -------------------------
4734 procedure Install_ABE_Failure
(N
: Node_Id
; Ins_Nod
: Node_Id
) is
4735 Fail_Ins_Nod
: constant Node_Id
:= Insertion_Node
(N
, Ins_Nod
);
4736 -- Insert the failure prior to this node
4738 Loc
: constant Source_Ptr
:= Sloc
(N
);
4739 Scop_Id
: Entity_Id
;
4742 -- Nothing to do when compiling for GNATprove because raise statements
4743 -- are not supported.
4745 if GNATprove_Mode
then
4748 -- Nothing to do when the compilation will not produce an executable
4750 elsif Serious_Errors_Detected
> 0 then
4753 -- Do not install an ABE check for a compilation unit because there is
4754 -- no executable environment at that level.
4756 elsif Nkind
(Parent
(Fail_Ins_Nod
)) = N_Compilation_Unit
then
4760 -- Prevent multiple scenarios from installing the same ABE failure
4762 Set_Is_Elaboration_Checks_OK_Node
(N
, False);
4764 -- Install the nearest enclosing scope of the scenario as there must be
4765 -- something on the scope stack.
4767 -- Performance note: parent traversal
4769 Scop_Id
:= Find_Enclosing_Scope
(Fail_Ins_Nod
);
4770 pragma Assert
(Present
(Scop_Id
));
4772 Push_Scope
(Scop_Id
);
4775 -- raise Program_Error with "access before elaboration";
4777 Insert_Action
(Fail_Ins_Nod
,
4778 Make_Raise_Program_Error
(Loc
,
4779 Reason
=> PE_Access_Before_Elaboration
));
4782 end Install_ABE_Failure
;
4784 --------------------------------
4785 -- Is_Accept_Alternative_Proc --
4786 --------------------------------
4788 function Is_Accept_Alternative_Proc
(Id
: Entity_Id
) return Boolean is
4790 -- To qualify, the entity must denote a procedure with a receiving entry
4792 return Ekind
(Id
) = E_Procedure
and then Present
(Receiving_Entry
(Id
));
4793 end Is_Accept_Alternative_Proc
;
4795 ------------------------
4796 -- Is_Activation_Proc --
4797 ------------------------
4799 function Is_Activation_Proc
(Id
: Entity_Id
) return Boolean is
4801 -- To qualify, the entity must denote one of the runtime procedures in
4802 -- charge of task activation.
4804 if Ekind
(Id
) = E_Procedure
then
4805 if Restricted_Profile
then
4806 return Is_RTE
(Id
, RE_Activate_Restricted_Tasks
);
4808 return Is_RTE
(Id
, RE_Activate_Tasks
);
4813 end Is_Activation_Proc
;
4815 ----------------------------
4816 -- Is_Ada_Semantic_Target --
4817 ----------------------------
4819 function Is_Ada_Semantic_Target
(Id
: Entity_Id
) return Boolean is
4822 Is_Activation_Proc
(Id
)
4823 or else Is_Controlled_Proc
(Id
, Name_Adjust
)
4824 or else Is_Controlled_Proc
(Id
, Name_Finalize
)
4825 or else Is_Controlled_Proc
(Id
, Name_Initialize
)
4826 or else Is_Init_Proc
(Id
)
4827 or else Is_Invariant_Proc
(Id
)
4828 or else Is_Protected_Entry
(Id
)
4829 or else Is_Protected_Subp
(Id
)
4830 or else Is_Protected_Body_Subp
(Id
)
4831 or else Is_Task_Entry
(Id
);
4832 end Is_Ada_Semantic_Target
;
4834 ----------------------------
4835 -- Is_Bodiless_Subprogram --
4836 ----------------------------
4838 function Is_Bodiless_Subprogram
(Subp_Id
: Entity_Id
) return Boolean is
4840 -- An abstract subprogram does not have a body
4842 if Ekind_In
(Subp_Id
, E_Function
,
4845 and then Is_Abstract_Subprogram
(Subp_Id
)
4849 -- A formal subprogram does not have a body
4851 elsif Is_Formal_Subprogram
(Subp_Id
) then
4854 -- An imported subprogram may have a body, however it is not known at
4855 -- compile or bind time where the body resides and whether it will be
4856 -- elaborated on time.
4858 elsif Is_Imported
(Subp_Id
) then
4863 end Is_Bodiless_Subprogram
;
4865 ------------------------
4866 -- Is_Controlled_Proc --
4867 ------------------------
4869 function Is_Controlled_Proc
4870 (Subp_Id
: Entity_Id
;
4871 Subp_Nam
: Name_Id
) return Boolean
4873 Formal_Id
: Entity_Id
;
4876 pragma Assert
(Nam_In
(Subp_Nam
, Name_Adjust
,
4880 -- To qualify, the subprogram must denote a source procedure with name
4881 -- Adjust, Finalize, or Initialize where the sole formal is controlled.
4883 if Comes_From_Source
(Subp_Id
)
4884 and then Ekind
(Subp_Id
) = E_Procedure
4885 and then Chars
(Subp_Id
) = Subp_Nam
4887 Formal_Id
:= First_Formal
(Subp_Id
);
4891 and then Is_Controlled
(Etype
(Formal_Id
))
4892 and then No
(Next_Formal
(Formal_Id
));
4896 end Is_Controlled_Proc
;
4898 ---------------------------------------
4899 -- Is_Default_Initial_Condition_Proc --
4900 ---------------------------------------
4902 function Is_Default_Initial_Condition_Proc
4903 (Id
: Entity_Id
) return Boolean
4906 -- To qualify, the entity must denote a Default_Initial_Condition
4909 return Ekind
(Id
) = E_Procedure
and then Is_DIC_Procedure
(Id
);
4910 end Is_Default_Initial_Condition_Proc
;
4912 -----------------------
4913 -- Is_Finalizer_Proc --
4914 -----------------------
4916 function Is_Finalizer_Proc
(Id
: Entity_Id
) return Boolean is
4918 -- To qualify, the entity must denote a _Finalizer procedure
4920 return Ekind
(Id
) = E_Procedure
and then Chars
(Id
) = Name_uFinalizer
;
4921 end Is_Finalizer_Proc
;
4923 -----------------------
4924 -- Is_Guaranteed_ABE --
4925 -----------------------
4927 function Is_Guaranteed_ABE
4929 Target_Decl
: Node_Id
;
4930 Target_Body
: Node_Id
) return Boolean
4933 -- Avoid cascaded errors if there were previous serious infractions.
4934 -- As a result the scenario will not be treated as a guaranteed ABE.
4935 -- This behaviour parallels that of the old ABE mechanism.
4937 if Serious_Errors_Detected
> 0 then
4940 -- The scenario and the target appear within the same context ignoring
4941 -- enclosing library levels.
4943 -- Performance note: parent traversal
4945 elsif In_Same_Context
(N
, Target_Decl
) then
4947 -- The target body has already been encountered. The scenario results
4948 -- in a guaranteed ABE if it appears prior to the body.
4950 if Present
(Target_Body
) then
4951 return Earlier_In_Extended_Unit
(N
, Target_Body
);
4953 -- Otherwise the body has not been encountered yet. The scenario is
4954 -- a guaranteed ABE since the body will appear later. It is assumed
4955 -- that the caller has already checked whether the scenario is ABE-
4956 -- safe as optional bodies are not considered here.
4964 end Is_Guaranteed_ABE
;
4966 -------------------------------
4967 -- Is_Initial_Condition_Proc --
4968 -------------------------------
4970 function Is_Initial_Condition_Proc
(Id
: Entity_Id
) return Boolean is
4972 -- To qualify, the entity must denote an Initial_Condition procedure
4975 Ekind
(Id
) = E_Procedure
and then Is_Initial_Condition_Procedure
(Id
);
4976 end Is_Initial_Condition_Proc
;
4978 --------------------
4979 -- Is_Initialized --
4980 --------------------
4982 function Is_Initialized
(Obj_Decl
: Node_Id
) return Boolean is
4984 -- To qualify, the object declaration must have an expression
4987 Present
(Expression
(Obj_Decl
)) or else Has_Init_Expression
(Obj_Decl
);
4990 -----------------------
4991 -- Is_Invariant_Proc --
4992 -----------------------
4994 function Is_Invariant_Proc
(Id
: Entity_Id
) return Boolean is
4996 -- To qualify, the entity must denote the "full" invariant procedure
4998 return Ekind
(Id
) = E_Procedure
and then Is_Invariant_Procedure
(Id
);
4999 end Is_Invariant_Proc
;
5001 ---------------------------------------
5002 -- Is_Non_Library_Level_Encapsulator --
5003 ---------------------------------------
5005 function Is_Non_Library_Level_Encapsulator
(N
: Node_Id
) return Boolean is
5008 when N_Abstract_Subprogram_Declaration
5009 | N_Aspect_Specification
5010 | N_Component_Declaration
5012 | N_Entry_Declaration
5013 | N_Expression_Function
5014 | N_Formal_Abstract_Subprogram_Declaration
5015 | N_Formal_Concrete_Subprogram_Declaration
5016 | N_Formal_Object_Declaration
5017 | N_Formal_Package_Declaration
5018 | N_Formal_Type_Declaration
5019 | N_Generic_Association
5020 | N_Implicit_Label_Declaration
5021 | N_Incomplete_Type_Declaration
5022 | N_Private_Extension_Declaration
5023 | N_Private_Type_Declaration
5025 | N_Protected_Type_Declaration
5026 | N_Single_Protected_Declaration
5027 | N_Single_Task_Declaration
5029 | N_Subprogram_Declaration
5031 | N_Task_Type_Declaration
5036 return Is_Generic_Declaration_Or_Body
(N
);
5038 end Is_Non_Library_Level_Encapsulator
;
5040 -------------------------------
5041 -- Is_Partial_Invariant_Proc --
5042 -------------------------------
5044 function Is_Partial_Invariant_Proc
(Id
: Entity_Id
) return Boolean is
5046 -- To qualify, the entity must denote the "partial" invariant procedure
5049 Ekind
(Id
) = E_Procedure
and then Is_Partial_Invariant_Procedure
(Id
);
5050 end Is_Partial_Invariant_Proc
;
5052 ----------------------------
5053 -- Is_Postconditions_Proc --
5054 ----------------------------
5056 function Is_Postconditions_Proc
(Id
: Entity_Id
) return Boolean is
5058 -- To qualify, the entity must denote a _Postconditions procedure
5061 Ekind
(Id
) = E_Procedure
and then Chars
(Id
) = Name_uPostconditions
;
5062 end Is_Postconditions_Proc
;
5064 ---------------------------
5065 -- Is_Preelaborated_Unit --
5066 ---------------------------
5068 function Is_Preelaborated_Unit
(Id
: Entity_Id
) return Boolean is
5071 Is_Preelaborated
(Id
)
5072 or else Is_Pure
(Id
)
5073 or else Is_Remote_Call_Interface
(Id
)
5074 or else Is_Remote_Types
(Id
)
5075 or else Is_Shared_Passive
(Id
);
5076 end Is_Preelaborated_Unit
;
5078 ------------------------
5079 -- Is_Protected_Entry --
5080 ------------------------
5082 function Is_Protected_Entry
(Id
: Entity_Id
) return Boolean is
5084 -- To qualify, the entity must denote an entry defined in a protected
5089 and then Is_Protected_Type
(Non_Private_View
(Scope
(Id
)));
5090 end Is_Protected_Entry
;
5092 -----------------------
5093 -- Is_Protected_Subp --
5094 -----------------------
5096 function Is_Protected_Subp
(Id
: Entity_Id
) return Boolean is
5098 -- To qualify, the entity must denote a subprogram defined within a
5102 Ekind_In
(Id
, E_Function
, E_Procedure
)
5103 and then Is_Protected_Type
(Non_Private_View
(Scope
(Id
)));
5104 end Is_Protected_Subp
;
5106 ----------------------------
5107 -- Is_Protected_Body_Subp --
5108 ----------------------------
5110 function Is_Protected_Body_Subp
(Id
: Entity_Id
) return Boolean is
5112 -- To qualify, the entity must denote a subprogram with attribute
5113 -- Protected_Subprogram set.
5116 Ekind_In
(Id
, E_Function
, E_Procedure
)
5117 and then Present
(Protected_Subprogram
(Id
));
5118 end Is_Protected_Body_Subp
;
5120 ------------------------------------
5121 -- Is_Recorded_Top_Level_Scenario --
5122 ------------------------------------
5124 function Is_Recorded_Top_Level_Scenario
(N
: Node_Id
) return Boolean is
5126 return Recorded_Top_Level_Scenarios
.Get
(N
);
5127 end Is_Recorded_Top_Level_Scenario
;
5129 ------------------------
5130 -- Is_Safe_Activation --
5131 ------------------------
5133 function Is_Safe_Activation
5135 Task_Decl
: Node_Id
) return Boolean
5138 -- The activation of a task coming from an external instance cannot
5139 -- cause an ABE because the generic was already instantiated. Note
5140 -- that the instantiation itself may lead to an ABE.
5143 In_External_Instance
5145 Target_Decl
=> Task_Decl
);
5146 end Is_Safe_Activation
;
5152 function Is_Safe_Call
5154 Target_Attrs
: Target_Attributes
) return Boolean
5157 -- The target is either an abstract subprogram, formal subprogram, or
5158 -- imported, in which case it does not have a body at compile or bind
5159 -- time. Assume that the call is ABE-safe.
5161 if Is_Bodiless_Subprogram
(Target_Attrs
.Spec_Id
) then
5164 -- The target is an instantiation of a generic subprogram. The call
5165 -- cannot cause an ABE because the generic was already instantiated.
5166 -- Note that the instantiation itself may lead to an ABE.
5168 elsif Is_Generic_Instance
(Target_Attrs
.Spec_Id
) then
5171 -- The invocation of a target coming from an external instance cannot
5172 -- cause an ABE because the generic was already instantiated. Note that
5173 -- the instantiation itself may lead to an ABE.
5175 elsif In_External_Instance
5177 Target_Decl
=> Target_Attrs
.Spec_Decl
)
5181 -- The target is a subprogram body without a previous declaration. The
5182 -- call cannot cause an ABE because the body has already been seen.
5184 elsif Nkind
(Target_Attrs
.Spec_Decl
) = N_Subprogram_Body
5185 and then No
(Corresponding_Spec
(Target_Attrs
.Spec_Decl
))
5189 -- The target is a subprogram body stub without a prior declaration.
5190 -- The call cannot cause an ABE because the proper body substitutes
5193 elsif Nkind
(Target_Attrs
.Spec_Decl
) = N_Subprogram_Body_Stub
5194 and then No
(Corresponding_Spec_Of_Stub
(Target_Attrs
.Spec_Decl
))
5198 -- Subprogram bodies which wrap attribute references used as actuals
5199 -- in instantiations are always ABE-safe. These bodies are artifacts
5202 elsif Present
(Target_Attrs
.Body_Decl
)
5203 and then Nkind
(Target_Attrs
.Body_Decl
) = N_Subprogram_Body
5204 and then Was_Attribute_Reference
(Target_Attrs
.Body_Decl
)
5212 ---------------------------
5213 -- Is_Safe_Instantiation --
5214 ---------------------------
5216 function Is_Safe_Instantiation
5218 Gen_Attrs
: Target_Attributes
) return Boolean
5221 -- The generic is an intrinsic subprogram in which case it does not
5222 -- have a body at compile or bind time. Assume that the instantiation
5225 if Is_Bodiless_Subprogram
(Gen_Attrs
.Spec_Id
) then
5228 -- The instantiation of an external nested generic cannot cause an ABE
5229 -- if the outer generic was already instantiated. Note that the instance
5230 -- of the outer generic may lead to an ABE.
5232 elsif In_External_Instance
5234 Target_Decl
=> Gen_Attrs
.Spec_Decl
)
5238 -- The generic is a package. The instantiation cannot cause an ABE when
5239 -- the package has no body.
5241 elsif Ekind
(Gen_Attrs
.Spec_Id
) = E_Generic_Package
5242 and then not Has_Body
(Gen_Attrs
.Spec_Decl
)
5248 end Is_Safe_Instantiation
;
5254 function Is_Same_Unit
5255 (Unit_1
: Entity_Id
;
5256 Unit_2
: Entity_Id
) return Boolean
5258 function Is_Subunit
(Unit_Id
: Entity_Id
) return Boolean;
5259 pragma Inline
(Is_Subunit
);
5260 -- Determine whether unit Unit_Id is a subunit
5262 function Normalize_Unit
(Unit_Id
: Entity_Id
) return Entity_Id
;
5263 -- Strip a potential subunit chain ending with unit Unit_Id and return
5264 -- the corresponding spec.
5270 function Is_Subunit
(Unit_Id
: Entity_Id
) return Boolean is
5272 return Nkind
(Parent
(Unit_Declaration_Node
(Unit_Id
))) = N_Subunit
;
5275 --------------------
5276 -- Normalize_Unit --
5277 --------------------
5279 function Normalize_Unit
(Unit_Id
: Entity_Id
) return Entity_Id
is
5283 -- Eliminate a potential chain of subunits to reach to proper body
5286 while Present
(Result
)
5287 and then Result
/= Standard_Standard
5288 and then Is_Subunit
(Result
)
5290 Result
:= Scope
(Result
);
5293 -- Obtain the entity of the corresponding spec (if any)
5295 return Unique_Entity
(Result
);
5298 -- Start of processing for Is_Same_Unit
5301 return Normalize_Unit
(Unit_1
) = Normalize_Unit
(Unit_2
);
5308 function Is_Scenario
(N
: Node_Id
) return Boolean is
5311 when N_Assignment_Statement
5312 | N_Attribute_Reference
5314 | N_Entry_Call_Statement
5317 | N_Function_Instantiation
5319 | N_Package_Instantiation
5320 | N_Procedure_Call_Statement
5321 | N_Procedure_Instantiation
5322 | N_Requeue_Statement
5331 ------------------------------
5332 -- Is_SPARK_Semantic_Target --
5333 ------------------------------
5335 function Is_SPARK_Semantic_Target
(Id
: Entity_Id
) return Boolean is
5338 Is_Default_Initial_Condition_Proc
(Id
)
5339 or else Is_Initial_Condition_Proc
(Id
);
5340 end Is_SPARK_Semantic_Target
;
5342 ------------------------
5343 -- Is_Suitable_Access --
5344 ------------------------
5346 function Is_Suitable_Access
(N
: Node_Id
) return Boolean is
5349 Subp_Id
: Entity_Id
;
5352 -- This scenario is relevant only when the static model is in effect
5353 -- because it is graph-dependent and does not involve any run-time
5354 -- checks. Allowing it in the dynamic model would create confusing
5357 if not Static_Elaboration_Checks
then
5360 -- Nothing to do when switch -gnatd.U (ignore 'Access) is in effect
5362 elsif Debug_Flag_Dot_UU
then
5365 -- Nothing to do when the scenario is not an attribute reference
5367 elsif Nkind
(N
) /= N_Attribute_Reference
then
5370 -- Nothing to do for internally-generated attributes because they are
5371 -- assumed to be ABE safe.
5373 elsif not Comes_From_Source
(N
) then
5377 Nam
:= Attribute_Name
(N
);
5380 -- Sanitize the prefix of the attribute
5382 if not Is_Entity_Name
(Pref
) then
5385 elsif No
(Entity
(Pref
)) then
5389 Subp_Id
:= Entity
(Pref
);
5391 if not Is_Subprogram_Or_Entry
(Subp_Id
) then
5395 -- Traverse a possible chain of renamings to obtain the original entry
5396 -- or subprogram which the prefix may rename.
5398 Subp_Id
:= Get_Renamed_Entity
(Subp_Id
);
5400 -- To qualify, the attribute must meet the following prerequisites:
5404 -- The prefix must denote a source entry, operator, or subprogram
5405 -- which is not imported.
5407 Comes_From_Source
(Subp_Id
)
5408 and then Is_Subprogram_Or_Entry
(Subp_Id
)
5409 and then not Is_Bodiless_Subprogram
(Subp_Id
)
5411 -- The attribute name must be one of the 'Access forms. Note that
5412 -- 'Unchecked_Access cannot apply to a subprogram.
5414 and then Nam_In
(Nam
, Name_Access
, Name_Unrestricted_Access
);
5415 end Is_Suitable_Access
;
5417 ----------------------
5418 -- Is_Suitable_Call --
5419 ----------------------
5421 function Is_Suitable_Call
(N
: Node_Id
) return Boolean is
5423 -- Entry and subprogram calls are intentionally ignored because they
5424 -- may undergo expansion depending on the compilation mode, previous
5425 -- errors, generic context, etc. Call markers play the role of calls
5426 -- and provide a uniform foundation for ABE processing.
5428 return Nkind
(N
) = N_Call_Marker
;
5429 end Is_Suitable_Call
;
5431 -------------------------------
5432 -- Is_Suitable_Instantiation --
5433 -------------------------------
5435 function Is_Suitable_Instantiation
(N
: Node_Id
) return Boolean is
5436 Orig_N
: constant Node_Id
:= Original_Node
(N
);
5437 -- Use the original node in case an instantiation library unit is
5438 -- rewritten as a package or subprogram.
5441 -- To qualify, the instantiation must come from source
5444 Comes_From_Source
(Orig_N
)
5445 and then Nkind
(Orig_N
) in N_Generic_Instantiation
;
5446 end Is_Suitable_Instantiation
;
5448 --------------------------
5449 -- Is_Suitable_Scenario --
5450 --------------------------
5452 function Is_Suitable_Scenario
(N
: Node_Id
) return Boolean is
5455 Is_Suitable_Access
(N
)
5456 or else Is_Suitable_Call
(N
)
5457 or else Is_Suitable_Instantiation
(N
)
5458 or else Is_Suitable_Variable_Assignment
(N
)
5459 or else Is_Suitable_Variable_Reference
(N
);
5460 end Is_Suitable_Scenario
;
5462 -------------------------------------
5463 -- Is_Suitable_Variable_Assignment --
5464 -------------------------------------
5466 function Is_Suitable_Variable_Assignment
(N
: Node_Id
) return Boolean is
5468 N_Unit_Id
: Entity_Id
;
5473 Var_Unit_Id
: Entity_Id
;
5476 -- This scenario is relevant only when the static model is in effect
5477 -- because it is graph-dependent and does not involve any run-time
5478 -- checks. Allowing it in the dynamic model would create confusing
5481 if not Static_Elaboration_Checks
then
5484 -- Nothing to do when the scenario is not an assignment
5486 elsif Nkind
(N
) /= N_Assignment_Statement
then
5489 -- Nothing to do for internally-generated assignments because they are
5490 -- assumed to be ABE safe.
5492 elsif not Comes_From_Source
(N
) then
5495 -- Assignments are ignored in GNAT mode on the assumption that they are
5496 -- ABE-safe. This behaviour parallels that of the old ABE mechanism.
5498 elsif GNAT_Mode
then
5502 Nam
:= Extract_Assignment_Name
(N
);
5504 -- Sanitize the left hand side of the assignment
5506 if not Is_Entity_Name
(Nam
) then
5509 elsif No
(Entity
(Nam
)) then
5513 Var_Id
:= Entity
(Nam
);
5515 -- Sanitize the variable
5517 if Var_Id
= Any_Id
then
5520 elsif Ekind
(Var_Id
) /= E_Variable
then
5524 Var_Decl
:= Declaration_Node
(Var_Id
);
5526 if Nkind
(Var_Decl
) /= N_Object_Declaration
then
5530 N_Unit_Id
:= Find_Top_Unit
(N
);
5531 N_Unit
:= Unit_Declaration_Node
(N_Unit_Id
);
5533 Var_Unit_Id
:= Find_Top_Unit
(Var_Decl
);
5534 Var_Unit
:= Unit_Declaration_Node
(Var_Unit_Id
);
5536 -- To qualify, the assignment must meet the following prerequisites:
5539 Comes_From_Source
(Var_Id
)
5541 -- The variable must be declared in the spec of compilation unit U
5543 and then Nkind
(Var_Unit
) = N_Package_Declaration
5545 -- Performance note: parent traversal
5547 and then Find_Enclosing_Level
(Var_Decl
) = Package_Spec
5549 -- The assignment must occur in the body of compilation unit U
5551 and then Nkind
(N_Unit
) = N_Package_Body
5552 and then Present
(Corresponding_Body
(Var_Unit
))
5553 and then Corresponding_Body
(Var_Unit
) = N_Unit_Id
;
5554 end Is_Suitable_Variable_Assignment
;
5556 ------------------------------------
5557 -- Is_Suitable_Variable_Reference --
5558 ------------------------------------
5560 function Is_Suitable_Variable_Reference
(N
: Node_Id
) return Boolean is
5562 -- Expanded names and identifiers are intentionally ignored because they
5563 -- be folded, optimized away, etc. Variable references markers play the
5564 -- role of variable references and provide a uniform foundation for ABE
5567 return Nkind
(N
) = N_Variable_Reference_Marker
;
5568 end Is_Suitable_Variable_Reference
;
5574 function Is_Task_Entry
(Id
: Entity_Id
) return Boolean is
5576 -- To qualify, the entity must denote an entry defined in a task type
5579 Is_Entry
(Id
) and then Is_Task_Type
(Non_Private_View
(Scope
(Id
)));
5582 ------------------------
5583 -- Is_Up_Level_Target --
5584 ------------------------
5586 function Is_Up_Level_Target
(Target_Decl
: Node_Id
) return Boolean is
5587 Root
: constant Node_Id
:= Root_Scenario
;
5590 -- The root appears within the declaratons of a block statement, entry
5591 -- body, subprogram body, or task body ignoring enclosing packages. The
5592 -- root is always within the main unit. An up-level target is a notion
5593 -- applicable only to the static model because scenarios are reached by
5594 -- means of graph traversal started from a fixed declarative or library
5597 -- Performance note: parent traversal
5599 if Static_Elaboration_Checks
5600 and then Find_Enclosing_Level
(Root
) = Declaration_Level
5602 -- The target is within the main unit. It acts as an up-level target
5603 -- when it appears within a context which encloses the root.
5605 -- package body Main_Unit is
5606 -- function Func ...; -- target
5608 -- procedure Proc is
5609 -- X : ... := Func; -- root scenario
5611 if In_Extended_Main_Code_Unit
(Target_Decl
) then
5613 -- Performance note: parent traversal
5615 return not In_Same_Context
(Root
, Target_Decl
, Nested_OK
=> True);
5617 -- Otherwise the target is external to the main unit which makes it
5618 -- an up-level target.
5626 end Is_Up_Level_Target
;
5628 -------------------------------
5629 -- Kill_Elaboration_Scenario --
5630 -------------------------------
5632 procedure Kill_Elaboration_Scenario
(N
: Node_Id
) is
5633 package Scenarios
renames Top_Level_Scenarios
;
5636 -- Eliminate a recorded top-level scenario when it appears within dead
5637 -- code because it will not be executed at elaboration time.
5640 and then Is_Recorded_Top_Level_Scenario
(N
)
5642 -- Performance node: list traversal
5644 for Index
in Scenarios
.First
.. Scenarios
.Last
loop
5645 if Scenarios
.Table
(Index
) = N
then
5646 Scenarios
.Table
(Index
) := Empty
;
5648 -- The top-level scenario is no longer recorded
5650 Set_Is_Recorded_Top_Level_Scenario
(N
, False);
5655 -- A recorded top-level scenario must be in the table of recorded
5656 -- top-level scenarios.
5658 pragma Assert
(False);
5660 end Kill_Elaboration_Scenario
;
5662 ----------------------------------
5663 -- Meet_Elaboration_Requirement --
5664 ----------------------------------
5666 procedure Meet_Elaboration_Requirement
5668 Target_Id
: Entity_Id
;
5671 Main_Id
: constant Entity_Id
:= Cunit_Entity
(Main_Unit
);
5672 Unit_Id
: constant Entity_Id
:= Find_Top_Unit
(Target_Id
);
5674 function Find_Preelaboration_Pragma
5675 (Prag_Nam
: Name_Id
) return Node_Id
;
5676 pragma Inline
(Find_Preelaboration_Pragma
);
5677 -- Traverse the visible declarations of unit Unit_Id and locate a source
5678 -- preelaboration-related pragma with name Prag_Nam.
5680 procedure Info_Requirement_Met
(Prag
: Node_Id
);
5681 pragma Inline
(Info_Requirement_Met
);
5682 -- Output information concerning pragma Prag which meets requirement
5685 procedure Info_Scenario
;
5686 pragma Inline
(Info_Scenario
);
5687 -- Output information concerning scenario N
5689 --------------------------------
5690 -- Find_Preelaboration_Pragma --
5691 --------------------------------
5693 function Find_Preelaboration_Pragma
5694 (Prag_Nam
: Name_Id
) return Node_Id
5696 Spec
: constant Node_Id
:= Parent
(Unit_Id
);
5700 -- A preelaboration-related pragma comes from source and appears at
5701 -- the top of the visible declarations of a package.
5703 if Nkind
(Spec
) = N_Package_Specification
then
5704 Decl
:= First
(Visible_Declarations
(Spec
));
5705 while Present
(Decl
) loop
5706 if Comes_From_Source
(Decl
) then
5707 if Nkind
(Decl
) = N_Pragma
5708 and then Pragma_Name
(Decl
) = Prag_Nam
5712 -- Otherwise the construct terminates the region where the
5713 -- preelabortion-related pragma may appear.
5725 end Find_Preelaboration_Pragma
;
5727 --------------------------
5728 -- Info_Requirement_Met --
5729 --------------------------
5731 procedure Info_Requirement_Met
(Prag
: Node_Id
) is
5733 pragma Assert
(Present
(Prag
));
5735 Error_Msg_Name_1
:= Req_Nam
;
5736 Error_Msg_Sloc
:= Sloc
(Prag
);
5738 ("\\% requirement for unit & met by pragma #", N
, Unit_Id
);
5739 end Info_Requirement_Met
;
5745 procedure Info_Scenario
is
5747 if Is_Suitable_Call
(N
) then
5750 Target_Id
=> Target_Id
,
5754 elsif Is_Suitable_Instantiation
(N
) then
5757 Gen_Id
=> Target_Id
,
5761 elsif Is_Suitable_Variable_Reference
(N
) then
5762 Info_Variable_Reference
5764 Var_Id
=> Target_Id
,
5768 -- No other scenario may impose a requirement on the context of the
5772 pragma Assert
(False);
5779 Elab_Attrs
: Elaboration_Attributes
;
5783 -- Start of processing for Meet_Elaboration_Requirement
5786 pragma Assert
(Nam_In
(Req_Nam
, Name_Elaborate
, Name_Elaborate_All
));
5788 -- Assume that the requirement has not been met
5792 -- Elaboration requirements are verified only when the static model is
5793 -- in effect because this diagnostic is graph-dependent.
5795 if not Static_Elaboration_Checks
then
5798 -- If the target is within the main unit, either at the source level or
5799 -- through an instantiation, then there is no real requirement to meet
5800 -- because the main unit cannot force its own elaboration by means of an
5801 -- Elaborate[_All] pragma. Treat this case as valid coverage.
5803 elsif In_Extended_Main_Code_Unit
(Target_Id
) then
5806 -- Otherwise the target resides in an external unit
5808 -- The requirement is met when the target comes from an internal unit
5809 -- because such a unit is elaborated prior to a non-internal unit.
5811 elsif In_Internal_Unit
(Unit_Id
)
5812 and then not In_Internal_Unit
(Main_Id
)
5816 -- The requirement is met when the target comes from a preelaborated
5817 -- unit. This portion must parallel predicate Is_Preelaborated_Unit.
5819 elsif Is_Preelaborated_Unit
(Unit_Id
) then
5822 -- Output extra information when switch -gnatel (info messages on
5823 -- implicit Elaborate[_All] pragmas.
5825 if Elab_Info_Messages
then
5826 if Is_Preelaborated
(Unit_Id
) then
5827 Elab_Nam
:= Name_Preelaborate
;
5829 elsif Is_Pure
(Unit_Id
) then
5830 Elab_Nam
:= Name_Pure
;
5832 elsif Is_Remote_Call_Interface
(Unit_Id
) then
5833 Elab_Nam
:= Name_Remote_Call_Interface
;
5835 elsif Is_Remote_Types
(Unit_Id
) then
5836 Elab_Nam
:= Name_Remote_Types
;
5839 pragma Assert
(Is_Shared_Passive
(Unit_Id
));
5840 Elab_Nam
:= Name_Shared_Passive
;
5843 Info_Requirement_Met
(Find_Preelaboration_Pragma
(Elab_Nam
));
5846 -- Determine whether the context of the main unit has a pragma strong
5847 -- enough to meet the requirement.
5850 Elab_Attrs
:= Elaboration_Context
.Get
(Unit_Id
);
5852 -- The pragma must be either Elaborate_All or be as strong as the
5855 if Present
(Elab_Attrs
.Source_Pragma
)
5856 and then Nam_In
(Pragma_Name
(Elab_Attrs
.Source_Pragma
),
5862 -- Output extra information when switch -gnatel (info messages on
5863 -- implicit Elaborate[_All] pragmas.
5865 if Elab_Info_Messages
then
5866 Info_Requirement_Met
(Elab_Attrs
.Source_Pragma
);
5871 -- The requirement was not met by the context of the main unit, issue an
5877 Error_Msg_Name_1
:= Req_Nam
;
5878 Error_Msg_Node_2
:= Unit_Id
;
5879 Error_Msg_NE
("\\unit & requires pragma % for &", N
, Main_Id
);
5881 Output_Active_Scenarios
(N
);
5883 end Meet_Elaboration_Requirement
;
5885 ----------------------
5886 -- Non_Private_View --
5887 ----------------------
5889 function Non_Private_View
(Typ
: Entity_Id
) return Entity_Id
is
5895 if Is_Private_Type
(Result
) and then Present
(Full_View
(Result
)) then
5896 Result
:= Full_View
(Result
);
5900 end Non_Private_View
;
5902 -----------------------------
5903 -- Output_Active_Scenarios --
5904 -----------------------------
5906 procedure Output_Active_Scenarios
(Error_Nod
: Node_Id
) is
5907 procedure Output_Access
(N
: Node_Id
);
5908 -- Emit a specific diagnostic message for 'Access denote by N
5910 procedure Output_Activation_Call
(N
: Node_Id
);
5911 -- Emit a specific diagnostic message for task activation N
5913 procedure Output_Call
(N
: Node_Id
; Target_Id
: Entity_Id
);
5914 -- Emit a specific diagnostic message for call N which invokes target
5917 procedure Output_Header
;
5918 -- Emit a specific diagnostic message for the unit of the root scenario
5920 procedure Output_Instantiation
(N
: Node_Id
);
5921 -- Emit a specific diagnostic message for instantiation N
5923 procedure Output_Variable_Assignment
(N
: Node_Id
);
5924 -- Emit a specific diagnostic message for assignment statement N
5926 procedure Output_Variable_Reference
(N
: Node_Id
);
5927 -- Emit a specific diagnostic message for reference N which mentions a
5934 procedure Output_Access
(N
: Node_Id
) is
5935 Subp_Id
: constant Entity_Id
:= Entity
(Prefix
(N
));
5938 Error_Msg_Name_1
:= Attribute_Name
(N
);
5939 Error_Msg_Sloc
:= Sloc
(N
);
5940 Error_Msg_NE
("\\ % of & taken #", Error_Nod
, Subp_Id
);
5943 ----------------------------
5944 -- Output_Activation_Call --
5945 ----------------------------
5947 procedure Output_Activation_Call
(N
: Node_Id
) is
5948 function Find_Activator
(Call
: Node_Id
) return Entity_Id
;
5949 -- Find the nearest enclosing construct which houses call Call
5951 --------------------
5952 -- Find_Activator --
5953 --------------------
5955 function Find_Activator
(Call
: Node_Id
) return Entity_Id
is
5959 -- Climb the parent chain looking for a package [body] or a
5960 -- construct with a statement sequence.
5962 Par
:= Parent
(Call
);
5963 while Present
(Par
) loop
5964 if Nkind_In
(Par
, N_Package_Body
, N_Package_Declaration
) then
5965 return Defining_Entity
(Par
);
5967 elsif Nkind
(Par
) = N_Handled_Sequence_Of_Statements
then
5968 return Defining_Entity
(Parent
(Par
));
5971 Par
:= Parent
(Par
);
5979 Activator
: constant Entity_Id
:= Find_Activator
(N
);
5981 -- Start of processing for Output_Activation_Call
5984 pragma Assert
(Present
(Activator
));
5986 Error_Msg_NE
("\\ local tasks of & activated", Error_Nod
, Activator
);
5987 end Output_Activation_Call
;
5993 procedure Output_Call
(N
: Node_Id
; Target_Id
: Entity_Id
) is
5994 procedure Output_Accept_Alternative
;
5995 pragma Inline
(Output_Accept_Alternative
);
5996 -- Emit a specific diagnostic message concerning an accept
5999 procedure Output_Call
(Kind
: String);
6000 pragma Inline
(Output_Call
);
6001 -- Emit a specific diagnostic message concerning a call of kind Kind
6003 procedure Output_Type_Actions
(Action
: String);
6004 pragma Inline
(Output_Type_Actions
);
6005 -- Emit a specific diagnostic message concerning action Action of a
6008 procedure Output_Verification_Call
6012 pragma Inline
(Output_Verification_Call
);
6013 -- Emit a specific diagnostic message concerning the verification of
6014 -- predicate Pred applied to related entity Id with kind Id_Kind.
6016 -------------------------------
6017 -- Output_Accept_Alternative --
6018 -------------------------------
6020 procedure Output_Accept_Alternative
is
6021 Entry_Id
: constant Entity_Id
:= Receiving_Entry
(Target_Id
);
6024 pragma Assert
(Present
(Entry_Id
));
6026 Error_Msg_NE
("\\ entry & selected #", Error_Nod
, Entry_Id
);
6027 end Output_Accept_Alternative
;
6033 procedure Output_Call
(Kind
: String) is
6035 Error_Msg_NE
("\\ " & Kind
& " & called #", Error_Nod
, Target_Id
);
6038 -------------------------
6039 -- Output_Type_Actions --
6040 -------------------------
6042 procedure Output_Type_Actions
(Action
: String) is
6043 Typ
: constant Entity_Id
:= First_Formal_Type
(Target_Id
);
6046 pragma Assert
(Present
(Typ
));
6049 ("\\ " & Action
& " actions for type & #", Error_Nod
, Typ
);
6050 end Output_Type_Actions
;
6052 ------------------------------
6053 -- Output_Verification_Call --
6054 ------------------------------
6056 procedure Output_Verification_Call
6062 pragma Assert
(Present
(Id
));
6065 ("\\ " & Pred
& " of " & Id_Kind
& " & verified #",
6067 end Output_Verification_Call
;
6069 -- Start of processing for Output_Call
6072 Error_Msg_Sloc
:= Sloc
(N
);
6074 -- Accept alternative
6076 if Is_Accept_Alternative_Proc
(Target_Id
) then
6077 Output_Accept_Alternative
;
6081 elsif Is_TSS
(Target_Id
, TSS_Deep_Adjust
) then
6082 Output_Type_Actions
("adjustment");
6084 -- Default_Initial_Condition
6086 elsif Is_Default_Initial_Condition_Proc
(Target_Id
) then
6087 Output_Verification_Call
6088 (Pred
=> "Default_Initial_Condition",
6089 Id
=> First_Formal_Type
(Target_Id
),
6094 elsif Is_Protected_Entry
(Target_Id
) then
6095 Output_Call
("entry");
6097 -- Task entry calls are never processed because the entry being
6098 -- invoked does not have a corresponding "body", it has a select. A
6099 -- task entry call appears in the stack of active scenarios for the
6100 -- sole purpose of checking No_Entry_Calls_In_Elaboration_Code and
6103 elsif Is_Task_Entry
(Target_Id
) then
6108 elsif Is_TSS
(Target_Id
, TSS_Deep_Finalize
) then
6109 Output_Type_Actions
("finalization");
6111 -- Calls to _Finalizer procedures must not appear in the output
6112 -- because this creates confusing noise.
6114 elsif Is_Finalizer_Proc
(Target_Id
) then
6117 -- Initial_Condition
6119 elsif Is_Initial_Condition_Proc
(Target_Id
) then
6120 Output_Verification_Call
6121 (Pred
=> "Initial_Condition",
6122 Id
=> Find_Enclosing_Scope
(N
),
6123 Id_Kind
=> "package");
6127 elsif Is_Init_Proc
(Target_Id
)
6128 or else Is_TSS
(Target_Id
, TSS_Deep_Initialize
)
6130 Output_Type_Actions
("initialization");
6134 elsif Is_Invariant_Proc
(Target_Id
) then
6135 Output_Verification_Call
6136 (Pred
=> "invariants",
6137 Id
=> First_Formal_Type
(Target_Id
),
6140 -- Partial invariant calls must not appear in the output because this
6141 -- creates confusing noise. Note that a partial invariant is always
6142 -- invoked by the "full" invariant which is already placed on the
6145 elsif Is_Partial_Invariant_Proc
(Target_Id
) then
6150 elsif Is_Postconditions_Proc
(Target_Id
) then
6151 Output_Verification_Call
6152 (Pred
=> "postconditions",
6153 Id
=> Find_Enclosing_Scope
(N
),
6154 Id_Kind
=> "subprogram");
6156 -- Subprograms must come last because some of the previous cases fall
6157 -- under this category.
6159 elsif Ekind
(Target_Id
) = E_Function
then
6160 Output_Call
("function");
6162 elsif Ekind
(Target_Id
) = E_Procedure
then
6163 Output_Call
("procedure");
6166 pragma Assert
(False);
6175 procedure Output_Header
is
6176 Unit_Id
: constant Entity_Id
:= Find_Top_Unit
(Root_Scenario
);
6179 if Ekind
(Unit_Id
) = E_Package
then
6180 Error_Msg_NE
("\\ spec of unit & elaborated", Error_Nod
, Unit_Id
);
6182 elsif Ekind
(Unit_Id
) = E_Package_Body
then
6183 Error_Msg_NE
("\\ body of unit & elaborated", Error_Nod
, Unit_Id
);
6186 Error_Msg_NE
("\\ in body of unit &", Error_Nod
, Unit_Id
);
6190 --------------------------
6191 -- Output_Instantiation --
6192 --------------------------
6194 procedure Output_Instantiation
(N
: Node_Id
) is
6195 procedure Output_Instantiation
(Gen_Id
: Entity_Id
; Kind
: String);
6196 pragma Inline
(Output_Instantiation
);
6197 -- Emit a specific diagnostic message concerning an instantiation of
6198 -- generic unit Gen_Id. Kind denotes the kind of the instantiation.
6200 --------------------------
6201 -- Output_Instantiation --
6202 --------------------------
6204 procedure Output_Instantiation
(Gen_Id
: Entity_Id
; Kind
: String) is
6207 ("\\ " & Kind
& " & instantiated as & #", Error_Nod
, Gen_Id
);
6208 end Output_Instantiation
;
6213 Inst_Attrs
: Instantiation_Attributes
;
6214 Inst_Id
: Entity_Id
;
6217 -- Start of processing for Output_Instantiation
6220 Extract_Instantiation_Attributes
6225 Attrs
=> Inst_Attrs
);
6227 Error_Msg_Node_2
:= Inst_Id
;
6228 Error_Msg_Sloc
:= Sloc
(Inst
);
6230 if Nkind
(Inst
) = N_Function_Instantiation
then
6231 Output_Instantiation
(Gen_Id
, "function");
6233 elsif Nkind
(Inst
) = N_Package_Instantiation
then
6234 Output_Instantiation
(Gen_Id
, "package");
6236 elsif Nkind
(Inst
) = N_Procedure_Instantiation
then
6237 Output_Instantiation
(Gen_Id
, "procedure");
6240 pragma Assert
(False);
6243 end Output_Instantiation
;
6245 --------------------------------
6246 -- Output_Variable_Assignment --
6247 --------------------------------
6249 procedure Output_Variable_Assignment
(N
: Node_Id
) is
6250 Var_Id
: constant Entity_Id
:= Entity
(Extract_Assignment_Name
(N
));
6253 Error_Msg_Sloc
:= Sloc
(N
);
6254 Error_Msg_NE
("\\ variable & assigned #", Error_Nod
, Var_Id
);
6255 end Output_Variable_Assignment
;
6257 -------------------------------
6258 -- Output_Variable_Reference --
6259 -------------------------------
6261 procedure Output_Variable_Reference
(N
: Node_Id
) is
6262 Dummy
: Variable_Attributes
;
6266 Extract_Variable_Reference_Attributes
6271 Error_Msg_Sloc
:= Sloc
(N
);
6274 Error_Msg_NE
("\\ variable & read #", Error_Nod
, Var_Id
);
6276 end Output_Variable_Reference
;
6280 package Stack
renames Scenario_Stack
;
6282 Dummy
: Call_Attributes
;
6285 Target_Id
: Entity_Id
;
6287 -- Start of processing for Output_Active_Scenarios
6290 -- Active scenarios are emitted only when the static model is in effect
6291 -- because there is an inherent order by which all these scenarios were
6292 -- reached from the declaration or library level.
6294 if not Static_Elaboration_Checks
then
6300 for Index
in Stack
.First
.. Stack
.Last
loop
6301 N
:= Stack
.Table
(Index
);
6310 if Nkind
(N
) = N_Attribute_Reference
then
6315 elsif Is_Suitable_Call
(N
) then
6316 Extract_Call_Attributes
6318 Target_Id
=> Target_Id
,
6321 if Is_Activation_Proc
(Target_Id
) then
6322 Output_Activation_Call
(N
);
6324 Output_Call
(N
, Target_Id
);
6329 elsif Is_Suitable_Instantiation
(N
) then
6330 Output_Instantiation
(N
);
6332 -- Variable assignments
6334 elsif Nkind
(N
) = N_Assignment_Statement
then
6335 Output_Variable_Assignment
(N
);
6337 -- Variable references
6339 elsif Is_Suitable_Variable_Reference
(N
) then
6340 Output_Variable_Reference
(N
);
6343 pragma Assert
(False);
6347 end Output_Active_Scenarios
;
6349 -------------------------
6350 -- Pop_Active_Scenario --
6351 -------------------------
6353 procedure Pop_Active_Scenario
(N
: Node_Id
) is
6354 Top
: Node_Id
renames Scenario_Stack
.Table
(Scenario_Stack
.Last
);
6357 pragma Assert
(Top
= N
);
6358 Scenario_Stack
.Decrement_Last
;
6359 end Pop_Active_Scenario
;
6361 --------------------
6362 -- Process_Access --
6363 --------------------
6365 procedure Process_Access
6367 In_Partial_Fin
: Boolean;
6368 In_Task_Body
: Boolean)
6370 function Build_Access_Marker
(Target_Id
: Entity_Id
) return Node_Id
;
6371 pragma Inline
(Build_Access_Marker
);
6372 -- Create a suitable call marker which invokes target Target_Id
6374 -------------------------
6375 -- Build_Access_Marker --
6376 -------------------------
6378 function Build_Access_Marker
(Target_Id
: Entity_Id
) return Node_Id
is
6382 Marker
:= Make_Call_Marker
(Sloc
(Attr
));
6384 -- Inherit relevant attributes from the attribute
6386 -- Performance note: parent traversal
6388 Set_Target
(Marker
, Target_Id
);
6389 Set_Is_Declaration_Level_Node
6390 (Marker
, Find_Enclosing_Level
(Attr
) = Declaration_Level
);
6391 Set_Is_Dispatching_Call
6393 Set_Is_Elaboration_Checks_OK_Node
6394 (Marker
, Is_Elaboration_Checks_OK_Node
(Attr
));
6396 (Marker
, Comes_From_Source
(Attr
));
6397 Set_Is_SPARK_Mode_On_Node
6398 (Marker
, Is_SPARK_Mode_On_Node
(Attr
));
6400 -- Partially insert the call marker into the tree by setting its
6403 Set_Parent
(Marker
, Attr
);
6406 end Build_Access_Marker
;
6410 Root
: constant Node_Id
:= Root_Scenario
;
6411 Target_Id
: constant Entity_Id
:= Entity
(Prefix
(Attr
));
6413 Target_Attrs
: Target_Attributes
;
6415 -- Start of processing for Process_Access
6418 -- Output relevant information when switch -gnatel (info messages on
6419 -- implicit Elaborate[_All] pragmas) is in effect.
6421 if Elab_Info_Messages
then
6423 ("info: access to & during elaboration", Attr
, Target_Id
);
6426 Extract_Target_Attributes
6427 (Target_Id
=> Target_Id
,
6428 Attrs
=> Target_Attrs
);
6430 -- Both the attribute and the corresponding body are in the same unit.
6431 -- The corresponding body must appear prior to the root scenario which
6432 -- started the recursive search. If this is not the case, then there is
6433 -- a potential ABE if the access value is used to call the subprogram.
6434 -- Emit a warning only when switch -gnatw.f (warnings on suspucious
6435 -- 'Access) is in effect.
6437 if Warn_On_Elab_Access
6438 and then Present
(Target_Attrs
.Body_Decl
)
6439 and then In_Extended_Main_Code_Unit
(Target_Attrs
.Body_Decl
)
6440 and then Earlier_In_Extended_Unit
(Root
, Target_Attrs
.Body_Decl
)
6442 Error_Msg_Name_1
:= Attribute_Name
(Attr
);
6443 Error_Msg_NE
("??% attribute of & before body seen", Attr
, Target_Id
);
6444 Error_Msg_N
("\possible Program_Error on later references", Attr
);
6446 Output_Active_Scenarios
(Attr
);
6449 -- Treat the attribute as an immediate invocation of the target when
6450 -- switch -gnatd.o (conservative elaboration order for indirect calls)
6451 -- is in effect. Note that the prior elaboration of the unit containing
6452 -- the target is ensured processing the corresponding call marker.
6454 if Debug_Flag_Dot_O
then
6456 (N
=> Build_Access_Marker
(Target_Id
),
6457 In_Partial_Fin
=> In_Partial_Fin
,
6458 In_Task_Body
=> In_Task_Body
);
6460 -- Otherwise ensure that the unit with the corresponding body is
6461 -- elaborated prior to the main unit.
6464 Ensure_Prior_Elaboration
6466 Unit_Id
=> Target_Attrs
.Unit_Id
,
6467 In_Partial_Fin
=> In_Partial_Fin
,
6468 In_Task_Body
=> In_Task_Body
);
6472 -----------------------------
6473 -- Process_Activation_Call --
6474 -----------------------------
6476 procedure Process_Activation_Call
6478 Call_Attrs
: Call_Attributes
;
6479 In_Partial_Fin
: Boolean;
6480 In_Task_Body
: Boolean)
6482 procedure Process_Task_Object
(Obj_Id
: Entity_Id
; Typ
: Entity_Id
);
6483 -- Perform ABE checks and diagnostics for object Obj_Id with type Typ.
6484 -- Typ may be a task type or a composite type with at least one task
6487 procedure Process_Task_Objects
(List
: List_Id
);
6488 -- Perform ABE checks and diagnostics for all task objects found in
6491 -------------------------
6492 -- Process_Task_Object --
6493 -------------------------
6495 procedure Process_Task_Object
(Obj_Id
: Entity_Id
; Typ
: Entity_Id
) is
6496 Base_Typ
: constant Entity_Id
:= Base_Type
(Typ
);
6498 Comp_Id
: Entity_Id
;
6499 Task_Attrs
: Task_Attributes
;
6502 if Is_Task_Type
(Typ
) then
6503 Extract_Task_Attributes
6505 Attrs
=> Task_Attrs
);
6507 Process_Single_Activation
6509 Call_Attrs
=> Call_Attrs
,
6511 Task_Attrs
=> Task_Attrs
,
6512 In_Partial_Fin
=> In_Partial_Fin
,
6513 In_Task_Body
=> In_Task_Body
);
6515 -- Examine the component type when the object is an array
6517 elsif Is_Array_Type
(Typ
) and then Has_Task
(Base_Typ
) then
6518 Process_Task_Object
(Obj_Id
, Component_Type
(Typ
));
6520 -- Examine individual component types when the object is a record
6522 elsif Is_Record_Type
(Typ
) and then Has_Task
(Base_Typ
) then
6523 Comp_Id
:= First_Component
(Typ
);
6524 while Present
(Comp_Id
) loop
6525 Process_Task_Object
(Obj_Id
, Etype
(Comp_Id
));
6526 Next_Component
(Comp_Id
);
6529 end Process_Task_Object
;
6531 --------------------------
6532 -- Process_Task_Objects --
6533 --------------------------
6535 procedure Process_Task_Objects
(List
: List_Id
) is
6537 Item_Id
: Entity_Id
;
6538 Item_Typ
: Entity_Id
;
6541 -- Examine the contents of the list looking for an object declaration
6542 -- of a task type or one that contains a task within.
6544 Item
:= First
(List
);
6545 while Present
(Item
) loop
6546 if Nkind
(Item
) = N_Object_Declaration
then
6547 Item_Id
:= Defining_Entity
(Item
);
6548 Item_Typ
:= Etype
(Item_Id
);
6550 if Has_Task
(Item_Typ
) then
6551 Process_Task_Object
(Item_Id
, Item_Typ
);
6557 end Process_Task_Objects
;
6564 -- Start of processing for Process_Activation_Call
6567 -- Nothing to do when the activation is a guaranteed ABE
6569 if Is_Known_Guaranteed_ABE
(Call
) then
6573 -- Find the proper context of the activation call where all task objects
6574 -- being activated are declared. This is usually the immediate parent of
6577 Context
:= Parent
(Call
);
6579 -- In the case of package bodies, the activation call is in the handled
6580 -- sequence of statements, but the task objects are in the declaration
6581 -- list of the body.
6583 if Nkind
(Context
) = N_Handled_Sequence_Of_Statements
6584 and then Nkind
(Parent
(Context
)) = N_Package_Body
6586 Context
:= Parent
(Context
);
6589 -- Process all task objects defined in both the spec and body when the
6590 -- activation call precedes the "begin" of a package body.
6592 if Nkind
(Context
) = N_Package_Body
then
6595 (Unit_Declaration_Node
(Corresponding_Spec
(Context
)));
6597 Process_Task_Objects
(Visible_Declarations
(Spec
));
6598 Process_Task_Objects
(Private_Declarations
(Spec
));
6599 Process_Task_Objects
(Declarations
(Context
));
6601 -- Process all task objects defined in the spec when the activation call
6602 -- appears at the end of a package spec.
6604 elsif Nkind
(Context
) = N_Package_Specification
then
6605 Process_Task_Objects
(Visible_Declarations
(Context
));
6606 Process_Task_Objects
(Private_Declarations
(Context
));
6608 -- Otherwise the context of the activation is some construct with a
6609 -- declarative part. Note that the corresponding record type of a task
6610 -- type is controlled. Because of this, the finalization machinery must
6611 -- relocate the task object to the handled statements of the construct
6612 -- to perform proper finalization in case of an exception. Examine the
6613 -- statements of the construct rather than the declarations.
6616 pragma Assert
(Nkind
(Context
) = N_Handled_Sequence_Of_Statements
);
6618 Process_Task_Objects
(Statements
(Context
));
6620 end Process_Activation_Call
;
6622 ---------------------------------------------
6623 -- Process_Activation_Conditional_ABE_Impl --
6624 ---------------------------------------------
6626 procedure Process_Activation_Conditional_ABE_Impl
6628 Call_Attrs
: Call_Attributes
;
6630 Task_Attrs
: Task_Attributes
;
6631 In_Partial_Fin
: Boolean;
6632 In_Task_Body
: Boolean)
6634 Check_OK
: constant Boolean :=
6635 not Is_Ignored_Ghost_Entity
(Obj_Id
)
6636 and then not Task_Attrs
.Ghost_Mode_Ignore
6637 and then Is_Elaboration_Checks_OK_Id
(Obj_Id
)
6638 and then Task_Attrs
.Elab_Checks_OK
;
6639 -- A run-time ABE check may be installed only when the object and the
6640 -- task type have active elaboration checks, and both are not ignored
6641 -- Ghost constructs.
6643 Root
: constant Node_Id
:= Root_Scenario
;
6646 -- Output relevant information when switch -gnatel (info messages on
6647 -- implicit Elaborate[_All] pragmas) is in effect.
6649 if Elab_Info_Messages
then
6651 ("info: activation of & during elaboration", Call
, Obj_Id
);
6654 -- Nothing to do when the activation is a guaranteed ABE
6656 if Is_Known_Guaranteed_ABE
(Call
) then
6659 -- Nothing to do when the root scenario appears at the declaration
6660 -- level and the task is in the same unit, but outside this context.
6662 -- task type Task_Typ; -- task declaration
6664 -- procedure Proc is
6665 -- function A ... is
6667 -- if Some_Condition then
6671 -- <activation call> -- activation site
6676 -- X : ... := A; -- root scenario
6679 -- task body Task_Typ is
6683 -- In the example above, the context of X is the declarative list of
6684 -- Proc. The "elaboration" of X may reach the activation of T whose body
6685 -- is defined outside of X's context. The task body is relevant only
6686 -- when Proc is invoked, but this happens only in "normal" elaboration,
6687 -- therefore the task body must not be considered if this is not the
6690 -- Performance note: parent traversal
6692 elsif Is_Up_Level_Target
(Task_Attrs
.Task_Decl
) then
6695 -- Nothing to do when the activation is ABE-safe
6699 -- task type Task_Typ;
6702 -- package body Gen is
6703 -- task body Task_Typ is
6710 -- procedure Main is
6711 -- package Nested is
6715 -- package body Nested is
6716 -- package Inst is new Gen;
6717 -- T : Inst.Task_Typ;
6719 -- <activation call> -- safe activation
6723 elsif Is_Safe_Activation
(Call
, Task_Attrs
.Task_Decl
) then
6725 -- Note that the task body must still be examined for any nested
6730 -- The activation call and the task body are both in the main unit
6732 elsif Present
(Task_Attrs
.Body_Decl
)
6733 and then In_Extended_Main_Code_Unit
(Task_Attrs
.Body_Decl
)
6735 -- If the root scenario appears prior to the task body, then this is
6736 -- a possible ABE with respect to the root scenario.
6738 -- task type Task_Typ;
6740 -- function A ... is
6742 -- if Some_Condition then
6748 -- package body Pack is
6751 -- <activation call> -- activation of T
6756 -- X : ... := A; -- root scenario
6758 -- task body Task_Typ is -- task body
6762 -- Y : ... := A; -- root scenario
6764 -- IMPORTANT: The activation of T is a possible ABE for X, but
6765 -- not for Y. Intalling an unconditional ABE raise prior to the
6766 -- activation call would be wrong as it will fail for Y as well
6767 -- but in Y's case the activation of T is never an ABE.
6769 if Earlier_In_Extended_Unit
(Root
, Task_Attrs
.Body_Decl
) then
6771 -- Do not emit any ABE diagnostics when the activation occurs in
6772 -- a partial finalization context because this leads to confusing
6775 if In_Partial_Fin
then
6778 -- ABE diagnostics are emitted only in the static model because
6779 -- there is a well-defined order to visiting scenarios. Without
6780 -- this order diagnostics appear jumbled and result in unwanted
6783 elsif Static_Elaboration_Checks
then
6784 Error_Msg_Sloc
:= Sloc
(Call
);
6786 ("??task & will be activated # before elaboration of its "
6789 ("\Program_Error may be raised at run time", Obj_Id
);
6791 Output_Active_Scenarios
(Obj_Id
);
6794 -- Install a conditional run-time ABE check to verify that the
6795 -- task body has been elaborated prior to the activation call.
6801 Target_Id
=> Task_Attrs
.Spec_Id
,
6802 Target_Decl
=> Task_Attrs
.Task_Decl
,
6803 Target_Body
=> Task_Attrs
.Body_Decl
);
6807 -- Otherwise the task body is not available in this compilation or it
6808 -- resides in an external unit. Install a run-time ABE check to verify
6809 -- that the task body has been elaborated prior to the activation call
6810 -- when the dynamic model is in effect.
6812 elsif Dynamic_Elaboration_Checks
and then Check_OK
then
6816 Id
=> Task_Attrs
.Unit_Id
);
6819 -- Both the activation call and task type are subject to SPARK_Mode
6820 -- On, this triggers the SPARK rules for task activation. Compared to
6821 -- calls and instantiations, task activation in SPARK does not require
6822 -- the presence of Elaborate[_All] pragmas in case the task type is
6823 -- defined outside the main unit. This is because SPARK utilizes a
6824 -- special policy which activates all tasks after the main unit has
6825 -- finished its elaboration.
6827 if Call_Attrs
.SPARK_Mode_On
and Task_Attrs
.SPARK_Mode_On
then
6830 -- Otherwise the Ada rules are in effect. Ensure that the unit with the
6831 -- task body is elaborated prior to the main unit.
6834 Ensure_Prior_Elaboration
6836 Unit_Id
=> Task_Attrs
.Unit_Id
,
6837 In_Partial_Fin
=> In_Partial_Fin
,
6838 In_Task_Body
=> In_Task_Body
);
6842 (N
=> Task_Attrs
.Body_Decl
,
6843 In_Partial_Fin
=> In_Partial_Fin
,
6844 In_Task_Body
=> True);
6845 end Process_Activation_Conditional_ABE_Impl
;
6847 procedure Process_Activation_Conditional_ABE
is
6848 new Process_Activation_Call
(Process_Activation_Conditional_ABE_Impl
);
6850 --------------------------------------------
6851 -- Process_Activation_Guaranteed_ABE_Impl --
6852 --------------------------------------------
6854 procedure Process_Activation_Guaranteed_ABE_Impl
6856 Call_Attrs
: Call_Attributes
;
6858 Task_Attrs
: Task_Attributes
;
6859 In_Partial_Fin
: Boolean;
6860 In_Task_Body
: Boolean)
6862 pragma Unreferenced
(Call_Attrs
);
6863 pragma Unreferenced
(In_Partial_Fin
);
6864 pragma Unreferenced
(In_Task_Body
);
6866 Check_OK
: constant Boolean :=
6867 not Is_Ignored_Ghost_Entity
(Obj_Id
)
6868 and then not Task_Attrs
.Ghost_Mode_Ignore
6869 and then Is_Elaboration_Checks_OK_Id
(Obj_Id
)
6870 and then Task_Attrs
.Elab_Checks_OK
;
6871 -- A run-time ABE check may be installed only when the object and the
6872 -- task type have active elaboration checks, and both are not ignored
6873 -- Ghost constructs.
6876 -- Nothing to do when the root scenario appears at the declaration
6877 -- level and the task is in the same unit, but outside this context.
6879 -- task type Task_Typ; -- task declaration
6881 -- procedure Proc is
6882 -- function A ... is
6884 -- if Some_Condition then
6888 -- <activation call> -- activation site
6893 -- X : ... := A; -- root scenario
6896 -- task body Task_Typ is
6900 -- In the example above, the context of X is the declarative list of
6901 -- Proc. The "elaboration" of X may reach the activation of T whose body
6902 -- is defined outside of X's context. The task body is relevant only
6903 -- when Proc is invoked, but this happens only in "normal" elaboration,
6904 -- therefore the task body must not be considered if this is not the
6907 -- Performance note: parent traversal
6909 if Is_Up_Level_Target
(Task_Attrs
.Task_Decl
) then
6912 -- Nothing to do when the activation is ABE-safe
6916 -- task type Task_Typ;
6919 -- package body Gen is
6920 -- task body Task_Typ is
6927 -- procedure Main is
6928 -- package Nested is
6932 -- package body Nested is
6933 -- package Inst is new Gen;
6934 -- T : Inst.Task_Typ;
6936 -- <activation call> -- safe activation
6940 elsif Is_Safe_Activation
(Call
, Task_Attrs
.Task_Decl
) then
6943 -- An activation call leads to a guaranteed ABE when the activation
6944 -- call and the task appear within the same context ignoring library
6945 -- levels, and the body of the task has not been seen yet or appears
6946 -- after the activation call.
6948 -- procedure Guaranteed_ABE is
6949 -- task type Task_Typ;
6951 -- package Nested is
6955 -- package body Nested is
6958 -- <activation call> -- guaranteed ABE
6961 -- task body Task_Typ is
6966 -- Performance note: parent traversal
6968 elsif Is_Guaranteed_ABE
6970 Target_Decl
=> Task_Attrs
.Task_Decl
,
6971 Target_Body
=> Task_Attrs
.Body_Decl
)
6973 Error_Msg_Sloc
:= Sloc
(Call
);
6975 ("??task & will be activated # before elaboration of its body",
6977 Error_Msg_N
("\Program_Error will be raised at run time", Obj_Id
);
6979 -- Mark the activation call as a guaranteed ABE
6981 Set_Is_Known_Guaranteed_ABE
(Call
);
6983 -- Install a run-time ABE failue because this activation call will
6984 -- always result in an ABE.
6992 end Process_Activation_Guaranteed_ABE_Impl
;
6994 procedure Process_Activation_Guaranteed_ABE
is
6995 new Process_Activation_Call
(Process_Activation_Guaranteed_ABE_Impl
);
7001 procedure Process_Call
7003 Call_Attrs
: Call_Attributes
;
7004 Target_Id
: Entity_Id
;
7005 In_Partial_Fin
: Boolean;
7006 In_Task_Body
: Boolean)
7008 function In_Initialization_Context
(N
: Node_Id
) return Boolean;
7009 -- Determine whether arbitrary node N appears within a type init proc,
7010 -- primitive [Deep_]Initialize, or a block created for initialization
7013 function Is_Partial_Finalization_Proc
return Boolean;
7014 pragma Inline
(Is_Partial_Finalization_Proc
);
7015 -- Determine whether call Call with target Target_Id invokes a partial
7016 -- finalization procedure.
7018 -------------------------------
7019 -- In_Initialization_Context --
7020 -------------------------------
7022 function In_Initialization_Context
(N
: Node_Id
) return Boolean is
7024 Spec_Id
: Entity_Id
;
7027 -- Climb the parent chain looking for initialization actions
7030 while Present
(Par
) loop
7032 -- A block may be part of the initialization actions of a default
7033 -- initialized object.
7035 if Nkind
(Par
) = N_Block_Statement
7036 and then Is_Initialization_Block
(Par
)
7040 -- A subprogram body may denote an initialization routine
7042 elsif Nkind
(Par
) = N_Subprogram_Body
then
7043 Spec_Id
:= Unique_Defining_Entity
(Par
);
7045 -- The current subprogram body denotes a type init proc or
7046 -- primitive [Deep_]Initialize.
7048 if Is_Init_Proc
(Spec_Id
)
7049 or else Is_Controlled_Proc
(Spec_Id
, Name_Initialize
)
7050 or else Is_TSS
(Spec_Id
, TSS_Deep_Initialize
)
7055 -- Prevent the search from going too far
7057 elsif Is_Body_Or_Package_Declaration
(Par
) then
7061 Par
:= Parent
(Par
);
7065 end In_Initialization_Context
;
7067 ----------------------------------
7068 -- Is_Partial_Finalization_Proc --
7069 ----------------------------------
7071 function Is_Partial_Finalization_Proc
return Boolean is
7073 -- To qualify, the target must denote primitive [Deep_]Finalize or a
7074 -- finalizer procedure, and the call must appear in an initialization
7078 (Is_Controlled_Proc
(Target_Id
, Name_Finalize
)
7079 or else Is_Finalizer_Proc
(Target_Id
)
7080 or else Is_TSS
(Target_Id
, TSS_Deep_Finalize
))
7081 and then In_Initialization_Context
(Call
);
7082 end Is_Partial_Finalization_Proc
;
7086 Partial_Fin_On
: Boolean;
7087 SPARK_Rules_On
: Boolean;
7088 Target_Attrs
: Target_Attributes
;
7090 -- Start of processing for Process_Call
7093 Extract_Target_Attributes
7094 (Target_Id
=> Target_Id
,
7095 Attrs
=> Target_Attrs
);
7097 -- The call occurs in a partial finalization context when a prior
7098 -- scenario is already in that mode, or when the target denotes a
7099 -- [Deep_]Finalize primitive or a finalizer within an initialization
7102 Partial_Fin_On
:= In_Partial_Fin
or else Is_Partial_Finalization_Proc
;
7104 -- The SPARK rules are in effect when both the call and target are
7105 -- subject to SPARK_Mode On.
7108 Call_Attrs
.SPARK_Mode_On
and Target_Attrs
.SPARK_Mode_On
;
7110 -- Output relevant information when switch -gnatel (info messages on
7111 -- implicit Elaborate[_All] pragmas) is in effect.
7113 if Elab_Info_Messages
then
7116 Target_Id
=> Target_Id
,
7118 In_SPARK
=> SPARK_Rules_On
);
7121 -- Check whether the invocation of an entry clashes with an existing
7124 if Is_Protected_Entry
(Target_Id
) then
7125 Check_Restriction
(No_Entry_Calls_In_Elaboration_Code
, Call
);
7127 elsif Is_Task_Entry
(Target_Id
) then
7128 Check_Restriction
(No_Entry_Calls_In_Elaboration_Code
, Call
);
7130 -- Task entry calls are never processed because the entry being
7131 -- invoked does not have a corresponding "body", it has a select.
7136 -- Nothing to do when the call is a guaranteed ABE
7138 if Is_Known_Guaranteed_ABE
(Call
) then
7141 -- Nothing to do when the root scenario appears at the declaration level
7142 -- and the target is in the same unit, but outside this context.
7144 -- function B ...; -- target declaration
7146 -- procedure Proc is
7147 -- function A ... is
7149 -- if Some_Condition then
7150 -- return B; -- call site
7154 -- X : ... := A; -- root scenario
7157 -- function B ... is
7161 -- In the example above, the context of X is the declarative region of
7162 -- Proc. The "elaboration" of X may eventually reach B which is defined
7163 -- outside of X's context. B is relevant only when Proc is invoked, but
7164 -- this happens only by means of "normal" elaboration, therefore B must
7165 -- not be considered if this is not the case.
7167 -- Performance note: parent traversal
7169 elsif Is_Up_Level_Target
(Target_Attrs
.Spec_Decl
) then
7172 -- The SPARK rules are verified only when -gnatd.v (enforce SPARK
7173 -- elaboration rules in SPARK code) is in effect.
7175 elsif SPARK_Rules_On
and Debug_Flag_Dot_V
then
7178 Call_Attrs
=> Call_Attrs
,
7179 Target_Id
=> Target_Id
,
7180 Target_Attrs
=> Target_Attrs
,
7181 In_Partial_Fin
=> In_Partial_Fin
);
7183 -- Otherwise the Ada rules are in effect, or SPARK code is allowed to
7184 -- violate the SPARK rules.
7189 Call_Attrs
=> Call_Attrs
,
7190 Target_Id
=> Target_Id
,
7191 Target_Attrs
=> Target_Attrs
,
7192 In_Partial_Fin
=> Partial_Fin_On
,
7193 In_Task_Body
=> In_Task_Body
);
7196 -- Inspect the target body (and barried function) for other suitable
7197 -- elaboration scenarios.
7199 Traverse_Body
(Target_Attrs
.Body_Barf
, Partial_Fin_On
, In_Task_Body
);
7200 Traverse_Body
(Target_Attrs
.Body_Decl
, Partial_Fin_On
, In_Task_Body
);
7203 ----------------------
7204 -- Process_Call_Ada --
7205 ----------------------
7207 procedure Process_Call_Ada
7209 Call_Attrs
: Call_Attributes
;
7210 Target_Id
: Entity_Id
;
7211 Target_Attrs
: Target_Attributes
;
7212 In_Partial_Fin
: Boolean;
7213 In_Task_Body
: Boolean)
7215 Check_OK
: constant Boolean :=
7216 not Call_Attrs
.Ghost_Mode_Ignore
7217 and then not Target_Attrs
.Ghost_Mode_Ignore
7218 and then Call_Attrs
.Elab_Checks_OK
7219 and then Target_Attrs
.Elab_Checks_OK
;
7220 -- A run-time ABE check may be installed only when both the call and the
7221 -- target have active elaboration checks, and both are not ignored Ghost
7225 -- Nothing to do for an Ada dispatching call because there are no ABE
7226 -- diagnostics for either models. ABE checks for the dynamic model are
7227 -- handled by Install_Primitive_Elaboration_Check.
7229 if Call_Attrs
.Is_Dispatching
then
7232 -- Nothing to do when the call is ABE-safe
7235 -- function Gen ...;
7237 -- function Gen ... is
7243 -- procedure Main is
7244 -- function Inst is new Gen;
7245 -- X : ... := Inst; -- safe call
7248 elsif Is_Safe_Call
(Call
, Target_Attrs
) then
7251 -- The call and the target body are both in the main unit
7253 elsif Present
(Target_Attrs
.Body_Decl
)
7254 and then In_Extended_Main_Code_Unit
(Target_Attrs
.Body_Decl
)
7256 Process_Call_Conditional_ABE
7258 Call_Attrs
=> Call_Attrs
,
7259 Target_Id
=> Target_Id
,
7260 Target_Attrs
=> Target_Attrs
,
7261 In_Partial_Fin
=> In_Partial_Fin
);
7263 -- Otherwise the target body is not available in this compilation or it
7264 -- resides in an external unit. Install a run-time ABE check to verify
7265 -- that the target body has been elaborated prior to the call site when
7266 -- the dynamic model is in effect.
7268 elsif Dynamic_Elaboration_Checks
and then Check_OK
then
7272 Id
=> Target_Attrs
.Unit_Id
);
7275 -- Ensure that the unit with the target body is elaborated prior to the
7276 -- main unit. The implicit Elaborate[_All] is generated only when the
7277 -- call has elaboration checks enabled. This behaviour parallels that of
7278 -- the old ABE mechanism.
7280 if Call_Attrs
.Elab_Checks_OK
then
7281 Ensure_Prior_Elaboration
7283 Unit_Id
=> Target_Attrs
.Unit_Id
,
7284 In_Partial_Fin
=> In_Partial_Fin
,
7285 In_Task_Body
=> In_Task_Body
);
7287 end Process_Call_Ada
;
7289 ----------------------------------
7290 -- Process_Call_Conditional_ABE --
7291 ----------------------------------
7293 procedure Process_Call_Conditional_ABE
7295 Call_Attrs
: Call_Attributes
;
7296 Target_Id
: Entity_Id
;
7297 Target_Attrs
: Target_Attributes
;
7298 In_Partial_Fin
: Boolean)
7300 Check_OK
: constant Boolean :=
7301 not Call_Attrs
.Ghost_Mode_Ignore
7302 and then not Target_Attrs
.Ghost_Mode_Ignore
7303 and then Call_Attrs
.Elab_Checks_OK
7304 and then Target_Attrs
.Elab_Checks_OK
;
7305 -- A run-time ABE check may be installed only when both the call and the
7306 -- target have active elaboration checks, and both are not ignored Ghost
7309 Root
: constant Node_Id
:= Root_Scenario
;
7312 -- If the root scenario appears prior to the target body, then this is a
7313 -- possible ABE with respect to the root scenario.
7317 -- function A ... is
7319 -- if Some_Condition then
7320 -- return B; -- call site
7324 -- X : ... := A; -- root scenario
7326 -- function B ... is -- target body
7330 -- Y : ... := A; -- root scenario
7332 -- IMPORTANT: The call to B from A is a possible ABE for X, but not for
7333 -- Y. Installing an unconditional ABE raise prior to the call to B would
7334 -- be wrong as it will fail for Y as well, but in Y's case the call to B
7337 if Earlier_In_Extended_Unit
(Root
, Target_Attrs
.Body_Decl
) then
7339 -- Do not emit any ABE diagnostics when the call occurs in a partial
7340 -- finalization context because this leads to confusing noise.
7342 if In_Partial_Fin
then
7345 -- ABE diagnostics are emitted only in the static model because there
7346 -- is a well-defined order to visiting scenarios. Without this order
7347 -- diagnostics appear jumbled and result in unwanted noise.
7349 elsif Static_Elaboration_Checks
then
7350 Error_Msg_NE
("??cannot call & before body seen", Call
, Target_Id
);
7351 Error_Msg_N
("\Program_Error may be raised at run time", Call
);
7353 Output_Active_Scenarios
(Call
);
7356 -- Install a conditional run-time ABE check to verify that the target
7357 -- body has been elaborated prior to the call.
7363 Target_Id
=> Target_Attrs
.Spec_Id
,
7364 Target_Decl
=> Target_Attrs
.Spec_Decl
,
7365 Target_Body
=> Target_Attrs
.Body_Decl
);
7368 end Process_Call_Conditional_ABE
;
7370 ---------------------------------
7371 -- Process_Call_Guaranteed_ABE --
7372 ---------------------------------
7374 procedure Process_Call_Guaranteed_ABE
7376 Call_Attrs
: Call_Attributes
;
7377 Target_Id
: Entity_Id
)
7379 Target_Attrs
: Target_Attributes
;
7382 Extract_Target_Attributes
7383 (Target_Id
=> Target_Id
,
7384 Attrs
=> Target_Attrs
);
7386 -- Nothing to do when the root scenario appears at the declaration level
7387 -- and the target is in the same unit, but outside this context.
7389 -- function B ...; -- target declaration
7391 -- procedure Proc is
7392 -- function A ... is
7394 -- if Some_Condition then
7395 -- return B; -- call site
7399 -- X : ... := A; -- root scenario
7402 -- function B ... is
7406 -- In the example above, the context of X is the declarative region of
7407 -- Proc. The "elaboration" of X may eventually reach B which is defined
7408 -- outside of X's context. B is relevant only when Proc is invoked, but
7409 -- this happens only by means of "normal" elaboration, therefore B must
7410 -- not be considered if this is not the case.
7412 -- Performance note: parent traversal
7414 if Is_Up_Level_Target
(Target_Attrs
.Spec_Decl
) then
7417 -- Nothing to do when the call is ABE-safe
7420 -- function Gen ...;
7422 -- function Gen ... is
7428 -- procedure Main is
7429 -- function Inst is new Gen;
7430 -- X : ... := Inst; -- safe call
7433 elsif Is_Safe_Call
(Call
, Target_Attrs
) then
7436 -- A call leads to a guaranteed ABE when the call and the target appear
7437 -- within the same context ignoring library levels, and the body of the
7438 -- target has not been seen yet or appears after the call.
7440 -- procedure Guaranteed_ABE is
7441 -- function Func ...;
7443 -- package Nested is
7444 -- Obj : ... := Func; -- guaranteed ABE
7447 -- function Func ... is
7452 -- Performance note: parent traversal
7454 elsif Is_Guaranteed_ABE
7456 Target_Decl
=> Target_Attrs
.Spec_Decl
,
7457 Target_Body
=> Target_Attrs
.Body_Decl
)
7459 Error_Msg_NE
("??cannot call & before body seen", Call
, Target_Id
);
7460 Error_Msg_N
("\Program_Error will be raised at run time", Call
);
7462 -- Mark the call as a guarnateed ABE
7464 Set_Is_Known_Guaranteed_ABE
(Call
);
7466 -- Install a run-time ABE failure because the call will always result
7467 -- in an ABE. The failure is installed when both the call and target
7468 -- have enabled elaboration checks, and both are not ignored Ghost
7471 if Call_Attrs
.Elab_Checks_OK
7472 and then Target_Attrs
.Elab_Checks_OK
7473 and then not Call_Attrs
.Ghost_Mode_Ignore
7474 and then not Target_Attrs
.Ghost_Mode_Ignore
7481 end Process_Call_Guaranteed_ABE
;
7483 ------------------------
7484 -- Process_Call_SPARK --
7485 ------------------------
7487 procedure Process_Call_SPARK
7489 Call_Attrs
: Call_Attributes
;
7490 Target_Id
: Entity_Id
;
7491 Target_Attrs
: Target_Attributes
;
7492 In_Partial_Fin
: Boolean)
7495 -- A call to a source target or to a target which emulates Ada or SPARK
7496 -- semantics imposes an Elaborate_All requirement on the context of the
7497 -- main unit. Determine whether the context has a pragma strong enough
7498 -- to meet the requirement. The check is orthogonal to the ABE effects
7501 if Target_Attrs
.From_Source
7502 or else Is_Ada_Semantic_Target
(Target_Id
)
7503 or else Is_SPARK_Semantic_Target
(Target_Id
)
7505 Meet_Elaboration_Requirement
7507 Target_Id
=> Target_Id
,
7508 Req_Nam
=> Name_Elaborate_All
);
7511 -- Nothing to do when the call is ABE-safe
7514 -- function Gen ...;
7516 -- function Gen ... is
7522 -- procedure Main is
7523 -- function Inst is new Gen;
7524 -- X : ... := Inst; -- safe call
7527 if Is_Safe_Call
(Call
, Target_Attrs
) then
7530 -- The call and the target body are both in the main unit
7532 elsif Present
(Target_Attrs
.Body_Decl
)
7533 and then In_Extended_Main_Code_Unit
(Target_Attrs
.Body_Decl
)
7535 Process_Call_Conditional_ABE
7537 Call_Attrs
=> Call_Attrs
,
7538 Target_Id
=> Target_Id
,
7539 Target_Attrs
=> Target_Attrs
,
7540 In_Partial_Fin
=> In_Partial_Fin
);
7542 -- Otherwise the target body is not available in this compilation or it
7543 -- resides in an external unit. There is no need to guarantee the prior
7544 -- elaboration of the unit with the target body because either the main
7545 -- unit meets the Elaborate_All requirement imposed by the call, or the
7546 -- program is illegal.
7551 end Process_Call_SPARK
;
7553 ----------------------------
7554 -- Process_Guaranteed_ABE --
7555 ----------------------------
7557 procedure Process_Guaranteed_ABE
(N
: Node_Id
) is
7558 Call_Attrs
: Call_Attributes
;
7559 Target_Id
: Entity_Id
;
7562 -- Add the current scenario to the stack of active scenarios
7564 Push_Active_Scenario
(N
);
7566 -- Only calls, instantiations, and task activations may result in a
7569 if Is_Suitable_Call
(N
) then
7570 Extract_Call_Attributes
7572 Target_Id
=> Target_Id
,
7573 Attrs
=> Call_Attrs
);
7575 if Is_Activation_Proc
(Target_Id
) then
7576 Process_Activation_Guaranteed_ABE
7578 Call_Attrs
=> Call_Attrs
,
7579 In_Partial_Fin
=> False,
7580 In_Task_Body
=> False);
7583 Process_Call_Guaranteed_ABE
7585 Call_Attrs
=> Call_Attrs
,
7586 Target_Id
=> Target_Id
);
7589 elsif Is_Suitable_Instantiation
(N
) then
7590 Process_Instantiation_Guaranteed_ABE
(N
);
7593 -- Remove the current scenario from the stack of active scenarios once
7594 -- all ABE diagnostics and checks have been performed.
7596 Pop_Active_Scenario
(N
);
7597 end Process_Guaranteed_ABE
;
7599 ---------------------------
7600 -- Process_Instantiation --
7601 ---------------------------
7603 procedure Process_Instantiation
7604 (Exp_Inst
: Node_Id
;
7605 In_Partial_Fin
: Boolean;
7606 In_Task_Body
: Boolean)
7608 Gen_Attrs
: Target_Attributes
;
7611 Inst_Attrs
: Instantiation_Attributes
;
7612 Inst_Id
: Entity_Id
;
7614 SPARK_Rules_On
: Boolean;
7615 -- This flag is set when the SPARK rules are in effect
7618 Extract_Instantiation_Attributes
7619 (Exp_Inst
=> Exp_Inst
,
7623 Attrs
=> Inst_Attrs
);
7625 Extract_Target_Attributes
(Gen_Id
, Gen_Attrs
);
7627 -- The SPARK rules are in effect when both the instantiation and generic
7628 -- are subject to SPARK_Mode On.
7630 SPARK_Rules_On
:= Inst_Attrs
.SPARK_Mode_On
and Gen_Attrs
.SPARK_Mode_On
;
7632 -- Output relevant information when switch -gnatel (info messages on
7633 -- implicit Elaborate[_All] pragmas) is in effect.
7635 if Elab_Info_Messages
then
7640 In_SPARK
=> SPARK_Rules_On
);
7643 -- Nothing to do when the instantiation is a guaranteed ABE
7645 if Is_Known_Guaranteed_ABE
(Inst
) then
7648 -- Nothing to do when the root scenario appears at the declaration level
7649 -- and the generic is in the same unit, but outside this context.
7652 -- procedure Gen is ...; -- generic declaration
7654 -- procedure Proc is
7655 -- function A ... is
7657 -- if Some_Condition then
7659 -- procedure I is new Gen; -- instantiation site
7664 -- X : ... := A; -- root scenario
7671 -- In the example above, the context of X is the declarative region of
7672 -- Proc. The "elaboration" of X may eventually reach Gen which appears
7673 -- outside of X's context. Gen is relevant only when Proc is invoked,
7674 -- but this happens only by means of "normal" elaboration, therefore
7675 -- Gen must not be considered if this is not the case.
7677 -- Performance note: parent traversal
7679 elsif Is_Up_Level_Target
(Gen_Attrs
.Spec_Decl
) then
7682 -- The SPARK rules are verified only when -gnatd.v (enforce SPARK
7683 -- elaboration rules in SPARK code) is in effect.
7685 elsif SPARK_Rules_On
and Debug_Flag_Dot_V
then
7686 Process_Instantiation_SPARK
7687 (Exp_Inst
=> Exp_Inst
,
7689 Inst_Attrs
=> Inst_Attrs
,
7691 Gen_Attrs
=> Gen_Attrs
,
7692 In_Partial_Fin
=> In_Partial_Fin
);
7694 -- Otherwise the Ada rules are in effect, or SPARK code is allowed to
7695 -- violate the SPARK rules.
7698 Process_Instantiation_Ada
7699 (Exp_Inst
=> Exp_Inst
,
7701 Inst_Attrs
=> Inst_Attrs
,
7703 Gen_Attrs
=> Gen_Attrs
,
7704 In_Partial_Fin
=> In_Partial_Fin
,
7705 In_Task_Body
=> In_Task_Body
);
7707 end Process_Instantiation
;
7709 -------------------------------
7710 -- Process_Instantiation_Ada --
7711 -------------------------------
7713 procedure Process_Instantiation_Ada
7714 (Exp_Inst
: Node_Id
;
7716 Inst_Attrs
: Instantiation_Attributes
;
7718 Gen_Attrs
: Target_Attributes
;
7719 In_Partial_Fin
: Boolean;
7720 In_Task_Body
: Boolean)
7722 Check_OK
: constant Boolean :=
7723 not Inst_Attrs
.Ghost_Mode_Ignore
7724 and then not Gen_Attrs
.Ghost_Mode_Ignore
7725 and then Inst_Attrs
.Elab_Checks_OK
7726 and then Gen_Attrs
.Elab_Checks_OK
;
7727 -- A run-time ABE check may be installed only when both the instance and
7728 -- the generic have active elaboration checks and both are not ignored
7729 -- Ghost constructs.
7732 -- Nothing to do when the instantiation is ABE-safe
7739 -- package body Gen is
7744 -- procedure Main is
7745 -- package Inst is new Gen (ABE); -- safe instantiation
7748 if Is_Safe_Instantiation
(Inst
, Gen_Attrs
) then
7751 -- The instantiation and the generic body are both in the main unit
7753 elsif Present
(Gen_Attrs
.Body_Decl
)
7754 and then In_Extended_Main_Code_Unit
(Gen_Attrs
.Body_Decl
)
7756 Process_Instantiation_Conditional_ABE
7757 (Exp_Inst
=> Exp_Inst
,
7759 Inst_Attrs
=> Inst_Attrs
,
7761 Gen_Attrs
=> Gen_Attrs
,
7762 In_Partial_Fin
=> In_Partial_Fin
);
7764 -- Otherwise the generic body is not available in this compilation or it
7765 -- resides in an external unit. Install a run-time ABE check to verify
7766 -- that the generic body has been elaborated prior to the instantiation
7767 -- when the dynamic model is in effect.
7769 elsif Dynamic_Elaboration_Checks
and then Check_OK
then
7772 Ins_Nod
=> Exp_Inst
,
7773 Id
=> Gen_Attrs
.Unit_Id
);
7776 -- Ensure that the unit with the generic body is elaborated prior to
7777 -- the main unit. No implicit pragma Elaborate[_All] is generated if
7778 -- the instantiation has elaboration checks suppressed. This behaviour
7779 -- parallels that of the old ABE mechanism.
7781 if Inst_Attrs
.Elab_Checks_OK
then
7782 Ensure_Prior_Elaboration
7784 Unit_Id
=> Gen_Attrs
.Unit_Id
,
7785 In_Partial_Fin
=> In_Partial_Fin
,
7786 In_Task_Body
=> In_Task_Body
);
7788 end Process_Instantiation_Ada
;
7790 -------------------------------------------
7791 -- Process_Instantiation_Conditional_ABE --
7792 -------------------------------------------
7794 procedure Process_Instantiation_Conditional_ABE
7795 (Exp_Inst
: Node_Id
;
7797 Inst_Attrs
: Instantiation_Attributes
;
7799 Gen_Attrs
: Target_Attributes
;
7800 In_Partial_Fin
: Boolean)
7802 Check_OK
: constant Boolean :=
7803 not Inst_Attrs
.Ghost_Mode_Ignore
7804 and then not Gen_Attrs
.Ghost_Mode_Ignore
7805 and then Inst_Attrs
.Elab_Checks_OK
7806 and then Gen_Attrs
.Elab_Checks_OK
;
7807 -- A run-time ABE check may be installed only when both the instance and
7808 -- the generic have active elaboration checks and both are not ignored
7809 -- Ghost constructs.
7811 Root
: constant Node_Id
:= Root_Scenario
;
7814 -- If the root scenario appears prior to the generic body, then this is
7815 -- a possible ABE with respect to the root scenario.
7822 -- function A ... is
7824 -- if Some_Condition then
7826 -- package Inst is new Gen; -- instantiation site
7830 -- X : ... := A; -- root scenario
7832 -- package body Gen is -- generic body
7836 -- Y : ... := A; -- root scenario
7838 -- IMPORTANT: The instantiation of Gen is a possible ABE for X, but not
7839 -- for Y. Installing an unconditional ABE raise prior to the instance
7840 -- site would be wrong as it will fail for Y as well, but in Y's case
7841 -- the instantiation of Gen is never an ABE.
7843 if Earlier_In_Extended_Unit
(Root
, Gen_Attrs
.Body_Decl
) then
7845 -- Do not emit any ABE diagnostics when the instantiation occurs in a
7846 -- partial finalization context because this leads to unwanted noise.
7848 if In_Partial_Fin
then
7851 -- ABE diagnostics are emitted only in the static model because there
7852 -- is a well-defined order to visiting scenarios. Without this order
7853 -- diagnostics appear jumbled and result in unwanted noise.
7855 elsif Static_Elaboration_Checks
then
7857 ("??cannot instantiate & before body seen", Inst
, Gen_Id
);
7858 Error_Msg_N
("\Program_Error may be raised at run time", Inst
);
7860 Output_Active_Scenarios
(Inst
);
7863 -- Install a conditional run-time ABE check to verify that the
7864 -- generic body has been elaborated prior to the instantiation.
7869 Ins_Nod
=> Exp_Inst
,
7870 Target_Id
=> Gen_Attrs
.Spec_Id
,
7871 Target_Decl
=> Gen_Attrs
.Spec_Decl
,
7872 Target_Body
=> Gen_Attrs
.Body_Decl
);
7875 end Process_Instantiation_Conditional_ABE
;
7877 ------------------------------------------
7878 -- Process_Instantiation_Guaranteed_ABE --
7879 ------------------------------------------
7881 procedure Process_Instantiation_Guaranteed_ABE
(Exp_Inst
: Node_Id
) is
7882 Gen_Attrs
: Target_Attributes
;
7885 Inst_Attrs
: Instantiation_Attributes
;
7886 Inst_Id
: Entity_Id
;
7889 Extract_Instantiation_Attributes
7890 (Exp_Inst
=> Exp_Inst
,
7894 Attrs
=> Inst_Attrs
);
7896 Extract_Target_Attributes
(Gen_Id
, Gen_Attrs
);
7898 -- Nothing to do when the root scenario appears at the declaration level
7899 -- and the generic is in the same unit, but outside this context.
7902 -- procedure Gen is ...; -- generic declaration
7904 -- procedure Proc is
7905 -- function A ... is
7907 -- if Some_Condition then
7909 -- procedure I is new Gen; -- instantiation site
7914 -- X : ... := A; -- root scenario
7921 -- In the example above, the context of X is the declarative region of
7922 -- Proc. The "elaboration" of X may eventually reach Gen which appears
7923 -- outside of X's context. Gen is relevant only when Proc is invoked,
7924 -- but this happens only by means of "normal" elaboration, therefore
7925 -- Gen must not be considered if this is not the case.
7927 -- Performance note: parent traversal
7929 if Is_Up_Level_Target
(Gen_Attrs
.Spec_Decl
) then
7932 -- Nothing to do when the instantiation is ABE-safe
7939 -- package body Gen is
7944 -- procedure Main is
7945 -- package Inst is new Gen (ABE); -- safe instantiation
7948 elsif Is_Safe_Instantiation
(Inst
, Gen_Attrs
) then
7951 -- An instantiation leads to a guaranteed ABE when the instantiation and
7952 -- the generic appear within the same context ignoring library levels,
7953 -- and the body of the generic has not been seen yet or appears after
7954 -- the instantiation.
7956 -- procedure Guaranteed_ABE is
7960 -- package Nested is
7961 -- procedure Inst is new Gen; -- guaranteed ABE
7969 -- Performance note: parent traversal
7971 elsif Is_Guaranteed_ABE
7973 Target_Decl
=> Gen_Attrs
.Spec_Decl
,
7974 Target_Body
=> Gen_Attrs
.Body_Decl
)
7977 ("??cannot instantiate & before body seen", Inst
, Gen_Id
);
7978 Error_Msg_N
("\Program_Error will be raised at run time", Inst
);
7980 -- Mark the instantiation as a guarantee ABE. This automatically
7981 -- suppresses the instantiation of the generic body.
7983 Set_Is_Known_Guaranteed_ABE
(Inst
);
7985 -- Install a run-time ABE failure because the instantiation will
7986 -- always result in an ABE. The failure is installed when both the
7987 -- instance and the generic have enabled elaboration checks, and both
7988 -- are not ignored Ghost constructs.
7990 if Inst_Attrs
.Elab_Checks_OK
7991 and then Gen_Attrs
.Elab_Checks_OK
7992 and then not Inst_Attrs
.Ghost_Mode_Ignore
7993 and then not Gen_Attrs
.Ghost_Mode_Ignore
7997 Ins_Nod
=> Exp_Inst
);
8000 end Process_Instantiation_Guaranteed_ABE
;
8002 ---------------------------------
8003 -- Process_Instantiation_SPARK --
8004 ---------------------------------
8006 procedure Process_Instantiation_SPARK
8007 (Exp_Inst
: Node_Id
;
8009 Inst_Attrs
: Instantiation_Attributes
;
8011 Gen_Attrs
: Target_Attributes
;
8012 In_Partial_Fin
: Boolean)
8017 -- A source instantiation imposes an Elaborate[_All] requirement on the
8018 -- context of the main unit. Determine whether the context has a pragma
8019 -- strong enough to meet the requirement. The check is orthogonal to the
8020 -- ABE ramifications of the instantiation.
8022 if Nkind
(Inst
) = N_Package_Instantiation
then
8023 Req_Nam
:= Name_Elaborate_All
;
8025 Req_Nam
:= Name_Elaborate
;
8028 Meet_Elaboration_Requirement
8030 Target_Id
=> Gen_Id
,
8031 Req_Nam
=> Req_Nam
);
8033 -- Nothing to do when the instantiation is ABE-safe
8040 -- package body Gen is
8045 -- procedure Main is
8046 -- package Inst is new Gen (ABE); -- safe instantiation
8049 if Is_Safe_Instantiation
(Inst
, Gen_Attrs
) then
8052 -- The instantiation and the generic body are both in the main unit
8054 elsif Present
(Gen_Attrs
.Body_Decl
)
8055 and then In_Extended_Main_Code_Unit
(Gen_Attrs
.Body_Decl
)
8057 Process_Instantiation_Conditional_ABE
8058 (Exp_Inst
=> Exp_Inst
,
8060 Inst_Attrs
=> Inst_Attrs
,
8062 Gen_Attrs
=> Gen_Attrs
,
8063 In_Partial_Fin
=> In_Partial_Fin
);
8065 -- Otherwise the generic body is not available in this compilation or
8066 -- it resides in an external unit. There is no need to guarantee the
8067 -- prior elaboration of the unit with the generic body because either
8068 -- the main unit meets the Elaborate[_All] requirement imposed by the
8069 -- instantiation, or the program is illegal.
8074 end Process_Instantiation_SPARK
;
8076 ---------------------------------
8077 -- Process_Variable_Assignment --
8078 ---------------------------------
8080 procedure Process_Variable_Assignment
(Asmt
: Node_Id
) is
8081 Var_Id
: constant Entity_Id
:= Entity
(Extract_Assignment_Name
(Asmt
));
8082 Prag
: constant Node_Id
:= SPARK_Pragma
(Var_Id
);
8084 SPARK_Rules_On
: Boolean;
8085 -- This flag is set when the SPARK rules are in effect
8088 -- The SPARK rules are in effect when both the assignment and the
8089 -- variable are subject to SPARK_Mode On.
8093 and then Get_SPARK_Mode_From_Annotation
(Prag
) = On
8094 and then Is_SPARK_Mode_On_Node
(Asmt
);
8096 -- Output relevant information when switch -gnatel (info messages on
8097 -- implicit Elaborate[_All] pragmas) is in effect.
8099 if Elab_Info_Messages
then
8101 (Msg
=> "assignment to & during elaboration",
8105 In_SPARK
=> SPARK_Rules_On
);
8108 -- The SPARK rules are in effect. These rules are applied regardless of
8109 -- whether -gnatd.v (enforce SPARK elaboration rules in SPARK code) is
8110 -- in effect because the static model cannot ensure safe assignment of
8113 if SPARK_Rules_On
then
8114 Process_Variable_Assignment_SPARK
8118 -- Otherwise the Ada rules are in effect
8121 Process_Variable_Assignment_Ada
8125 end Process_Variable_Assignment
;
8127 -------------------------------------
8128 -- Process_Variable_Assignment_Ada --
8129 -------------------------------------
8131 procedure Process_Variable_Assignment_Ada
8135 Var_Decl
: constant Node_Id
:= Declaration_Node
(Var_Id
);
8136 Spec_Id
: constant Entity_Id
:= Find_Top_Unit
(Var_Decl
);
8139 -- Emit a warning when an uninitialized variable declared in a package
8140 -- spec without a pragma Elaborate_Body is initialized by elaboration
8141 -- code within the corresponding body.
8143 if not Warnings_Off
(Var_Id
)
8144 and then not Is_Initialized
(Var_Decl
)
8145 and then not Has_Pragma_Elaborate_Body
(Spec_Id
)
8147 -- Generate an implicit Elaborate_Body in the spec
8149 Set_Elaborate_Body_Desirable
(Spec_Id
);
8152 ("??variable & can be accessed by clients before this "
8153 & "initialization", Asmt
, Var_Id
);
8156 ("\add pragma ""Elaborate_Body"" to spec & to ensure proper "
8157 & "initialization", Asmt
, Spec_Id
);
8159 Output_Active_Scenarios
(Asmt
);
8161 end Process_Variable_Assignment_Ada
;
8163 ---------------------------------------
8164 -- Process_Variable_Assignment_SPARK --
8165 ---------------------------------------
8167 procedure Process_Variable_Assignment_SPARK
8171 Var_Decl
: constant Node_Id
:= Declaration_Node
(Var_Id
);
8172 Spec_Id
: constant Entity_Id
:= Find_Top_Unit
(Var_Decl
);
8175 -- Emit an error when an initialized variable declared in a package spec
8176 -- without pragma Elaborate_Body is further modified by elaboration code
8177 -- within the corresponding body.
8179 if Is_Initialized
(Var_Decl
)
8180 and then not Has_Pragma_Elaborate_Body
(Spec_Id
)
8183 ("variable & modified by elaboration code in package body",
8187 ("\add pragma ""Elaborate_Body"" to spec & to ensure full "
8188 & "initialization", Asmt
, Spec_Id
);
8190 Output_Active_Scenarios
(Asmt
);
8192 end Process_Variable_Assignment_SPARK
;
8194 --------------------------------
8195 -- Process_Variable_Reference --
8196 --------------------------------
8198 procedure Process_Variable_Reference
(Ref
: Node_Id
) is
8199 Var_Attrs
: Variable_Attributes
;
8203 Extract_Variable_Reference_Attributes
8206 Attrs
=> Var_Attrs
);
8208 if Is_Read
(Ref
) then
8209 Process_Variable_Reference_Read
8212 Attrs
=> Var_Attrs
);
8214 end Process_Variable_Reference
;
8216 -------------------------------------
8217 -- Process_Variable_Reference_Read --
8218 -------------------------------------
8220 procedure Process_Variable_Reference_Read
8223 Attrs
: Variable_Attributes
)
8226 -- Output relevant information when switch -gnatel (info messages on
8227 -- implicit Elaborate[_All] pragmas) is in effect.
8229 if Elab_Info_Messages
then
8231 (Msg
=> "read of variable & during elaboration",
8238 -- Nothing to do when the variable appears within the main unit because
8239 -- diagnostics on reads are relevant only for external variables.
8241 if Is_Same_Unit
(Attrs
.Unit_Id
, Cunit_Entity
(Main_Unit
)) then
8244 -- Nothing to do when the variable is already initialized. Note that the
8245 -- variable may be further modified by the external unit.
8247 elsif Is_Initialized
(Declaration_Node
(Var_Id
)) then
8250 -- Nothing to do when the external unit guarantees the initialization of
8251 -- the variable by means of pragma Elaborate_Body.
8253 elsif Has_Pragma_Elaborate_Body
(Attrs
.Unit_Id
) then
8256 -- A variable read imposes an Elaborate requirement on the context of
8257 -- the main unit. Determine whether the context has a pragma strong
8258 -- enough to meet the requirement.
8261 Meet_Elaboration_Requirement
8263 Target_Id
=> Var_Id
,
8264 Req_Nam
=> Name_Elaborate
);
8266 end Process_Variable_Reference_Read
;
8268 --------------------------
8269 -- Push_Active_Scenario --
8270 --------------------------
8272 procedure Push_Active_Scenario
(N
: Node_Id
) is
8274 Scenario_Stack
.Append
(N
);
8275 end Push_Active_Scenario
;
8277 ----------------------
8278 -- Process_Scenario --
8279 ----------------------
8281 procedure Process_Scenario
8283 In_Partial_Fin
: Boolean := False;
8284 In_Task_Body
: Boolean := False)
8286 Call_Attrs
: Call_Attributes
;
8287 Target_Id
: Entity_Id
;
8290 -- Add the current scenario to the stack of active scenarios
8292 Push_Active_Scenario
(N
);
8296 if Is_Suitable_Access
(N
) then
8297 Process_Access
(N
, In_Partial_Fin
, In_Task_Body
);
8301 elsif Is_Suitable_Call
(N
) then
8303 -- In general, only calls found within the main unit are processed
8304 -- because the ALI information supplied to binde is for the main
8305 -- unit only. However, to preserve the consistency of the tree and
8306 -- ensure proper serialization of internal names, external calls
8307 -- also receive corresponding call markers (see Build_Call_Marker).
8308 -- Regardless of the reason, external calls must not be processed.
8310 if In_Main_Context
(N
) then
8311 Extract_Call_Attributes
8313 Target_Id
=> Target_Id
,
8314 Attrs
=> Call_Attrs
);
8316 if Is_Activation_Proc
(Target_Id
) then
8317 Process_Activation_Conditional_ABE
8319 Call_Attrs
=> Call_Attrs
,
8320 In_Partial_Fin
=> In_Partial_Fin
,
8321 In_Task_Body
=> In_Task_Body
);
8326 Call_Attrs
=> Call_Attrs
,
8327 Target_Id
=> Target_Id
,
8328 In_Partial_Fin
=> In_Partial_Fin
,
8329 In_Task_Body
=> In_Task_Body
);
8335 elsif Is_Suitable_Instantiation
(N
) then
8336 Process_Instantiation
(N
, In_Partial_Fin
, In_Task_Body
);
8338 -- Variable assignments
8340 elsif Is_Suitable_Variable_Assignment
(N
) then
8341 Process_Variable_Assignment
(N
);
8343 -- Variable references
8345 elsif Is_Suitable_Variable_Reference
(N
) then
8347 -- In general, only variable references found within the main unit
8348 -- are processed because the ALI information supplied to binde is for
8349 -- the main unit only. However, to preserve the consistency of the
8350 -- tree and ensure proper serialization of internal names, external
8351 -- variable references also receive corresponding variable reference
8352 -- markers (see Build_Varaible_Reference_Marker). Regardless of the
8353 -- reason, external variable references must not be processed.
8355 if In_Main_Context
(N
) then
8356 Process_Variable_Reference
(N
);
8360 -- Remove the current scenario from the stack of active scenarios once
8361 -- all ABE diagnostics and checks have been performed.
8363 Pop_Active_Scenario
(N
);
8364 end Process_Scenario
;
8366 ---------------------------------
8367 -- Record_Elaboration_Scenario --
8368 ---------------------------------
8370 procedure Record_Elaboration_Scenario
(N
: Node_Id
) is
8371 Level
: Enclosing_Level_Kind
;
8373 Declaration_Level_OK
: Boolean;
8374 -- This flag is set when a particular scenario is allowed to appear at
8375 -- the declaration level.
8378 -- Assume that the scenario must not appear at the declaration level
8380 Declaration_Level_OK
:= False;
8382 -- Nothing to do for ASIS. As a result, no ABE checks and diagnostics
8383 -- are performed in this mode.
8388 -- Nothing to do when the scenario is being preanalyzed
8390 elsif Preanalysis_Active
then
8394 -- Ensure that a library-level call does not appear in a preelaborated
8395 -- unit. The check must come before ignoring scenarios within external
8396 -- units or inside generics because calls in those context must also be
8399 if Is_Suitable_Call
(N
) then
8400 Check_Preelaborated_Call
(N
);
8403 -- Nothing to do when the scenario does not appear within the main unit
8405 if not In_Main_Context
(N
) then
8408 -- Scenarios within a generic unit are never considered because generics
8409 -- cannot be elaborated.
8411 elsif Inside_A_Generic
then
8414 -- Scenarios which do not fall in one of the elaboration categories
8415 -- listed below are not considered. The categories are:
8417 -- 'Access for entries, operators, and subprograms
8418 -- Assignments to variables
8419 -- Calls (includes task activation)
8421 -- Reads of variables
8423 elsif Is_Suitable_Access
(N
) then
8425 -- Signal any enclosing local exception handlers that the 'Access may
8426 -- raise Program_Error due to a failed ABE check when switch -gnatd.o
8427 -- (conservative elaboration order for indirect calls) is in effect.
8428 -- Marking the exception handlers ensures proper expansion by both
8429 -- the front and back end restriction when No_Exception_Propagation
8432 if Debug_Flag_Dot_O
then
8433 Possible_Local_Raise
(N
, Standard_Program_Error
);
8436 elsif Is_Suitable_Call
(N
) or else Is_Suitable_Instantiation
(N
) then
8437 Declaration_Level_OK
:= True;
8439 -- Signal any enclosing local exception handlers that the call or
8440 -- instantiation may raise Program_Error due to a failed ABE check.
8441 -- Marking the exception handlers ensures proper expansion by both
8442 -- the front and back end restriction when No_Exception_Propagation
8445 Possible_Local_Raise
(N
, Standard_Program_Error
);
8447 elsif Is_Suitable_Variable_Assignment
(N
)
8448 or else Is_Suitable_Variable_Reference
(N
)
8452 -- Otherwise the input does not denote a suitable scenario
8458 -- The static model imposes additional restrictions on the placement of
8459 -- scenarios. In contrast, the dynamic model assumes that every scenario
8460 -- will be elaborated or invoked at some point.
8462 if Static_Elaboration_Checks
then
8464 -- Performance note: parent traversal
8466 Level
:= Find_Enclosing_Level
(N
);
8468 -- Declaration-level scenario
8470 if Declaration_Level_OK
and then Level
= Declaration_Level
then
8473 -- Library-level scenario
8475 elsif Level
in Library_Level
then
8478 -- Instantiation library-level scenario
8480 elsif Level
= Instantiation
then
8483 -- Otherwise the scenario does not appear at the proper level and
8484 -- cannot possibly act as a top-level scenario.
8491 -- Perform early detection of guaranteed ABEs in order to suppress the
8492 -- instantiation of generic bodies as gigi cannot handle certain types
8493 -- of premature instantiations.
8495 Process_Guaranteed_ABE
(N
);
8497 -- At this point all checks have been performed. Record the scenario for
8498 -- later processing by the ABE phase.
8500 Top_Level_Scenarios
.Append
(N
);
8501 Set_Is_Recorded_Top_Level_Scenario
(N
);
8502 end Record_Elaboration_Scenario
;
8504 ---------------------------------------
8505 -- Recorded_Top_Level_Scenarios_Hash --
8506 ---------------------------------------
8508 function Recorded_Top_Level_Scenarios_Hash
8509 (Key
: Node_Id
) return Recorded_Top_Level_Scenarios_Index
8513 Recorded_Top_Level_Scenarios_Index
8514 (Key
mod Recorded_Top_Level_Scenarios_Max
);
8515 end Recorded_Top_Level_Scenarios_Hash
;
8521 function Root_Scenario
return Node_Id
is
8522 package Stack
renames Scenario_Stack
;
8525 -- Ensure that the scenario stack has at least one active scenario in
8526 -- it. The one at the bottom (index First) is the root scenario.
8528 pragma Assert
(Stack
.Last
>= Stack
.First
);
8529 return Stack
.Table
(Stack
.First
);
8532 ----------------------------------------
8533 -- Set_Is_Recorded_Top_Level_Scenario --
8534 ----------------------------------------
8536 procedure Set_Is_Recorded_Top_Level_Scenario
8538 Val
: Boolean := True)
8541 Recorded_Top_Level_Scenarios
.Set
(N
, Val
);
8542 end Set_Is_Recorded_Top_Level_Scenario
;
8544 -------------------------------
8545 -- Static_Elaboration_Checks --
8546 -------------------------------
8548 function Static_Elaboration_Checks
return Boolean is
8550 return not Dynamic_Elaboration_Checks
;
8551 end Static_Elaboration_Checks
;
8557 procedure Traverse_Body
8559 In_Partial_Fin
: Boolean;
8560 In_Task_Body
: Boolean)
8562 procedure Find_And_Process_Nested_Scenarios
;
8563 pragma Inline
(Find_And_Process_Nested_Scenarios
);
8564 -- Examine the declarations and statements of subprogram body N for
8565 -- suitable scenarios. Save each discovered scenario and process it
8568 procedure Process_Nested_Scenarios
(Nested
: Elist_Id
);
8569 pragma Inline
(Process_Nested_Scenarios
);
8570 -- Invoke Process_Scenario on each individual scenario whith appears in
8573 ---------------------------------------
8574 -- Find_And_Process_Nested_Scenarios --
8575 ---------------------------------------
8577 procedure Find_And_Process_Nested_Scenarios
is
8578 Body_Id
: constant Entity_Id
:= Defining_Entity
(N
);
8580 function Is_Potential_Scenario
8581 (Nod
: Node_Id
) return Traverse_Result
;
8582 -- Determine whether arbitrary node Nod denotes a suitable scenario.
8583 -- If it does, save it in the Nested_Scenarios list of the subprogram
8584 -- body, and process it.
8586 procedure Save_Scenario
(Nod
: Node_Id
);
8587 pragma Inline
(Save_Scenario
);
8588 -- Save scenario Nod in the Nested_Scenarios list of the subprogram
8591 procedure Traverse_List
(List
: List_Id
);
8592 pragma Inline
(Traverse_List
);
8593 -- Invoke Traverse_Potential_Scenarios on each node in list List
8595 procedure Traverse_Potential_Scenarios
is
8596 new Traverse_Proc
(Is_Potential_Scenario
);
8598 ---------------------------
8599 -- Is_Potential_Scenario --
8600 ---------------------------
8602 function Is_Potential_Scenario
8603 (Nod
: Node_Id
) return Traverse_Result
8608 -- Skip constructs which do not have elaboration of their own and
8609 -- need to be elaborated by other means such as invocation, task
8612 if Is_Non_Library_Level_Encapsulator
(Nod
) then
8615 -- Terminate the traversal of a task body with an accept statement
8616 -- when no entry calls in elaboration are allowed because the task
8617 -- will block at run-time and the remaining statements will not be
8620 elsif Nkind_In
(Original_Node
(Nod
), N_Accept_Statement
,
8622 and then Restriction_Active
(No_Entry_Calls_In_Elaboration_Code
)
8626 -- Certain nodes carry semantic lists which act as repositories
8627 -- until expansion transforms the node and relocates the contents.
8628 -- Examine these lists in case expansion is disabled.
8630 elsif Nkind_In
(Nod
, N_And_Then
, N_Or_Else
) then
8631 Traverse_List
(Actions
(Nod
));
8633 elsif Nkind_In
(Nod
, N_Elsif_Part
, N_Iteration_Scheme
) then
8634 Traverse_List
(Condition_Actions
(Nod
));
8636 elsif Nkind
(Nod
) = N_If_Expression
then
8637 Traverse_List
(Then_Actions
(Nod
));
8638 Traverse_List
(Else_Actions
(Nod
));
8640 elsif Nkind_In
(Nod
, N_Component_Association
,
8641 N_Iterated_Component_Association
)
8643 Traverse_List
(Loop_Actions
(Nod
));
8647 -- Save a suitable scenario in the Nested_Scenarios list of the
8648 -- subprogram body. As a result any subsequent traversals of the
8649 -- subprogram body started from a different top-level scenario no
8650 -- longer need to reexamine the tree.
8652 elsif Is_Suitable_Scenario
(Nod
) then
8653 Save_Scenario
(Nod
);
8654 Process_Scenario
(Nod
, In_Partial_Fin
, In_Task_Body
);
8658 end Is_Potential_Scenario
;
8664 procedure Save_Scenario
(Nod
: Node_Id
) is
8668 Nested
:= Nested_Scenarios
(Body_Id
);
8671 Nested
:= New_Elmt_List
;
8672 Set_Nested_Scenarios
(Body_Id
, Nested
);
8675 Append_Elmt
(Nod
, Nested
);
8682 procedure Traverse_List
(List
: List_Id
) is
8686 Item
:= First
(List
);
8687 while Present
(Item
) loop
8688 Traverse_Potential_Scenarios
(Item
);
8693 -- Start of processing for Find_And_Process_Nested_Scenarios
8696 -- Examine the declarations for suitable scenarios
8698 Traverse_List
(Declarations
(N
));
8700 -- Examine the handled sequence of statements. This also includes any
8701 -- exceptions handlers.
8703 Traverse_Potential_Scenarios
(Handled_Statement_Sequence
(N
));
8704 end Find_And_Process_Nested_Scenarios
;
8706 ------------------------------
8707 -- Process_Nested_Scenarios --
8708 ------------------------------
8710 procedure Process_Nested_Scenarios
(Nested
: Elist_Id
) is
8711 Nested_Elmt
: Elmt_Id
;
8714 Nested_Elmt
:= First_Elmt
(Nested
);
8715 while Present
(Nested_Elmt
) loop
8717 (N
=> Node
(Nested_Elmt
),
8718 In_Partial_Fin
=> In_Partial_Fin
,
8719 In_Task_Body
=> In_Task_Body
);
8721 Next_Elmt
(Nested_Elmt
);
8723 end Process_Nested_Scenarios
;
8729 -- Start of processing for Traverse_Body
8732 -- Nothing to do when there is no body
8737 elsif Nkind
(N
) /= N_Subprogram_Body
then
8741 -- Nothing to do if the body was already traversed during the processing
8742 -- of the same top-level scenario.
8744 if Visited_Bodies
.Get
(N
) then
8747 -- Otherwise mark the body as traversed
8750 Visited_Bodies
.Set
(N
, True);
8753 Nested
:= Nested_Scenarios
(Defining_Entity
(N
));
8755 -- The subprogram body was already examined as part of the elaboration
8756 -- graph starting from a different top-level scenario. There is no need
8757 -- to traverse the declarations and statements again because this will
8758 -- yield the exact same scenarios. Use the nested scenarios collected
8759 -- during the first inspection of the body.
8761 if Present
(Nested
) then
8762 Process_Nested_Scenarios
(Nested
);
8764 -- Otherwise examine the declarations and statements of the subprogram
8765 -- body for suitable scenarios, save and process them accordingly.
8768 Find_And_Process_Nested_Scenarios
;
8772 ---------------------------------
8773 -- Update_Elaboration_Scenario --
8774 ---------------------------------
8776 procedure Update_Elaboration_Scenario
(New_N
: Node_Id
; Old_N
: Node_Id
) is
8777 package Scenarios
renames Top_Level_Scenarios
;
8780 -- Nothing to do when the old and new scenarios are one and the same
8782 if Old_N
= New_N
then
8785 -- A scenario is being transformed by Atree.Rewrite. Update all relevant
8786 -- internal data structures to reflect this change. This ensures that a
8787 -- potential run-time conditional ABE check or a guaranteed ABE failure
8788 -- is inserted at the proper place in the tree.
8790 elsif Is_Scenario
(Old_N
)
8791 and then Is_Recorded_Top_Level_Scenario
(Old_N
)
8793 -- Performance note: list traversal
8795 for Index
in Scenarios
.First
.. Scenarios
.Last
loop
8796 if Scenarios
.Table
(Index
) = Old_N
then
8797 Scenarios
.Table
(Index
) := New_N
;
8799 -- The old top-level scenario is no longer recorded, but the
8802 Set_Is_Recorded_Top_Level_Scenario
(Old_N
, False);
8803 Set_Is_Recorded_Top_Level_Scenario
(New_N
);
8808 -- A recorded top-level scenario must be in the table of recorded
8809 -- top-level scenarios.
8811 pragma Assert
(False);
8813 end Update_Elaboration_Scenario
;
8815 -------------------------
8816 -- Visited_Bodies_Hash --
8817 -------------------------
8819 function Visited_Bodies_Hash
(Key
: Node_Id
) return Visited_Bodies_Index
is
8821 return Visited_Bodies_Index
(Key
mod Visited_Bodies_Max
);
8822 end Visited_Bodies_Hash
;