https://gcc.gnu.org/g:c485a154ae0cfa1a63c79a1f3b82d6f2d4a107b5
commit r15-561-gc485a154ae0cfa1a63c79a1f3b82d6f2d4a107b5 Author: Piotr Trojanek <troja...@adacore.com> Date: Mon Feb 26 09:32:20 2024 +0100 ada: Ignore ghost nodes in call graph information for dispatching calls When emitting call graph information, we already skipped calls to ignored ghost entities, but this code was causing crashes (in production builds) and assertion failures (in development builds), because the ignored ghost entities are not fully decorated, e.g. when they come from instances of generic units with default subprograms. With this patch we skip call graph information for ignored ghost entities when they are registered, both as explicit calls and as tagged types that will come with internally generated dispatching subprograms. gcc/ada/ * exp_cg.adb (Generate_CG_Output): Remove code for ignored ghost entities that applied to subprogram calls. (Register_CG_Node): Skip ignored ghost entities, both calls and tagged types, when they are registered. Diff: --- gcc/ada/exp_cg.adb | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/gcc/ada/exp_cg.adb b/gcc/ada/exp_cg.adb index addf1cae32ac..91a6d40a6fa5 100644 --- a/gcc/ada/exp_cg.adb +++ b/gcc/ada/exp_cg.adb @@ -125,14 +125,7 @@ package body Exp_CG is for J in Call_Graph_Nodes.First .. Call_Graph_Nodes.Last loop N := Call_Graph_Nodes.Table (J); - -- No action needed for subprogram calls removed by the expander - -- (for example, calls to ignored ghost entities). - - if Nkind (N) = N_Null_Statement then - pragma Assert (Nkind (Original_Node (N)) in N_Subprogram_Call); - null; - - elsif Nkind (N) in N_Subprogram_Call then + if Nkind (N) in N_Subprogram_Call then Write_Call_Info (N); else pragma Assert (Nkind (N) = N_Defining_Identifier); @@ -358,7 +351,13 @@ package body Exp_CG is procedure Register_CG_Node (N : Node_Id) is begin - if Nkind (N) in N_Subprogram_Call then + -- Skip ignored ghost calls that will be removed by the expander + + if Is_Ignored_Ghost_Node (N) then + null; + + elsif Nkind (N) in N_Subprogram_Call then + if Current_Scope = Main_Unit_Entity or else Entity_Is_In_Main_Unit (Current_Scope) then