[Ada] Task-related circularities in Elaboration order v4.0

Programming / Compilers / GCC - pmderodat [138bc75d-0d04-0410-961f-82ee72b054a4] - 9 July 2019 07:55 EDT

This patch adds another suggestion to the elaboration order diagnostics. An elaboration circularity involving a task activation may be resolved through pragma Restrictions (No_Entry_Calls_In_Elaboration_Code).


-- Source --


-- no_entry_calls.txt

pragma Restrictions (No_Entry_Calls_In_Elaboration_Code);

-- a.ads

package A is task type Task_Typ is entry Start; end Task_Typ;

procedure Proc; end A;

-- a.adb

with B;

package body A is task body Task_Typ is begin accept Start; B.Proc; end Task_Typ;

Elab : Task_Typ;

procedure Proc is null; end A;

-- b.ads

package B is procedure Proc; end B;

-- b.adb

with A;

package body B is procedure Proc is begin A.Proc; end Proc; end B;

-- main.adb

with A;

-- +--> A spec B spec-- | ^ ^ ^-- | | with | |-- | sbb | +----------------+ | sbb-- | | | |-- | | | Invocation |-- | A body ------------> B body-- | ^ | |-- | | Invocation | |-- | +------------------+ |-- | |-- | Invocation |-- +---------------------------+---- The cycle is:---- A body --> A body

procedure Main is begin null; end Main;


-- Compilation and output --


$ gnatmake -f -q main.adb -gnatd_F $ gnatmake -f -q main.adb -gnatec=no_entry_calls.txt error: Elaboration circularity detected info: info: Reason: info: info: unit "a (body)" depends on its own elaboration info: info: Circularity: info: info: unit "a (body)" invokes a construct of unit "a (body)" at elaboration time info: path 1: info: elaboration of unit "a (body)" info: activation of local task declared at "a.ads":2:14 info: call to subprogram "proc" declared at "b.ads":2:14 info: call to subprogram "proc" declared at "a.ads":6:14 info: info: Suggestions: info: info: use pragma Restrictions (No_Entry_Calls_In_Elaboration_Code) info: use the dynamic elaboration model (compiler switch -gnatE) info: gnatmake: *** bind failed.

2019-07-09 Hristian Kirtchev

gcc/ada/

- bindo.ads: Move type Precedence_Kind from the private to the
visible part of the unit.
- bindo-augmentors.adb: Remove the use of global data as it is bad practice. (Augment_Library_Graph): Update the parameter profile. (Is_Visited, Set_Is_Visited): Remove. (Visit_Elaboration_Root, Visit_Elaboration_Roots): Update the parameter profile and comment on usage. (Visit_Vertex): Likewise. Also keep track of which invocation edge activates a task.
- bindo-augmentors.ads (Augment_Library_Graph): Update the parameter profile and comment on usage.
- bindo-builders.adb (Create_Forced_Edge, Create_Spec_And_Body_Edge, Create_With_Edge): Update the call to Add_Edge.
- bindo-diagnostics.adb: Add with end use clauses for Restrict and Rident. (Output_Dynamic_Model_Suggestions): Remove. (Output_Invocation_Related_Suggestions): New routine. (Output_Suggestions): Output all invocation-related suggestions together.
- bindo-elaborators.adb: Remove types Comparator_Ptr and Predicate_Ptr. (Find_Best_Vertex): Update the parameter profile.
- bindo-graphs.adb (Activates_Task): New routine. (Add_Body_Before_Spec_Edge): Update the call to Add_Edge_With_Return. (Add_Edge): Update the parameter profile and the call to Add_Edge_With_Return. (Add_Edge_With_Return): Update the parameter profile and comment on usage. (At_Least_One_Edge_Satisfies): New routine. (Contains_Elaborate_All_Edge): Reimplement. (Contains_Static_Successor_Edge, Contains_Task_Activation): New routine. (Contains_Weak_Static_Successor): Remove. (Is_Static_Successor_Edge): New routine.
- bindo-graphs.ads: Add types LGE_Predicate_Ptr, LGV_Comparator_Ptr, and LGV_Predicate_Ptr. Update type Library_Graph_Edge_Attributes to capture whether an invocation edge activates a task. Update the value of No_Library_Graph_Edge_Attributes. (Activates_Task): Update the parameter profile and comment on usage. (Contains_Static_Successor_Edge, Contains_Task_Activation): New routines. (Contains_Weak_Static_Successor): Remove.
- doc/gnat_ugn/elaboration_order_handling_in_gnat.rst: Update the documentation to reflect the new task-related advice.
- gnat_ugn.texi: Regenerate.

7ed20965ec3 [Ada] Task-related circularities in Elaboration order v4.0
gcc/ada/ChangeLog | 53 +++++
gcc/ada/bindo-augmentors.adb | 146 ++++++-------
gcc/ada/bindo-augmentors.ads | 8 +-
gcc/ada/bindo-builders.adb | 36 ++--
gcc/ada/bindo-diagnostics.adb | 90 ++++----
gcc/ada/bindo-elaborators.adb | 17 +-
gcc/ada/bindo-graphs.adb | 230 ++++++++++++++-------
gcc/ada/bindo-graphs.ads | 52 ++++-
gcc/ada/bindo.ads | 18 +-
.../elaboration_order_handling_in_gnat.rst | 17 ++
gcc/ada/gnat_ugn.texi | 23 +++
11 files changed, 441 insertions(+), 249 deletions(-)

Upstream: gcc.gnu.org


  • Share