diff mbox series

[COMMITTED,26/35] ada: Ignore ghost nodes in call graph information for dispatching calls

Message ID 20240516092606.41242-26-poulhies@adacore.com
State New
Headers show
Series [COMMITTED,01/35] ada: Fix docs and comments about pragmas for Boolean-valued aspects | expand

Commit Message

Marc Poulhiès May 16, 2024, 9:25 a.m. UTC
From: Piotr Trojanek <trojanek@adacore.com>

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.

Tested on x86_64-pc-linux-gnu, committed on master.

---
 gcc/ada/exp_cg.adb | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)
diff mbox series

Patch

diff --git a/gcc/ada/exp_cg.adb b/gcc/ada/exp_cg.adb
index addf1cae32a..91a6d40a6fa 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