[Ada] Fix binding of ghost units with finalizer
authorYannick Moy <moy@adacore.com>
Tue, 23 Jul 2019 08:13:01 +0000 (08:13 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Tue, 23 Jul 2019 08:13:01 +0000 (08:13 +0000)
Linking of an enabled ghost unit which requires a finalizer lead to an
error, as the name generated by the binder for calling the finalizer was
not the same as the name chosen by the compiler. Now fixed.

2019-07-23  Yannick Moy  <moy@adacore.com>

gcc/ada/

* exp_ch7.adb (Create_Finalizer): Force finalizer not to be
Ghost enabled.
* exp_dbug.adb (Get_External_Name): Explain special case of
Ghost finalizer.

gcc/testsuite/

* gnat.dg/ghost6.adb, gnat.dg/ghost6_pkg.ads: New testcase.

From-SVN: r273720

gcc/ada/ChangeLog
gcc/ada/exp_ch7.adb
gcc/ada/exp_dbug.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/ghost6.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/ghost6_pkg.ads [new file with mode: 0644]

index db77736f321a54fa9f32579b0f056982ece2dd88..0f7cd2d4838938d66eab5c7db8eac357206c9ce9 100644 (file)
@@ -1,3 +1,10 @@
+2019-07-23  Yannick Moy  <moy@adacore.com>
+
+       * exp_ch7.adb (Create_Finalizer): Force finalizer not to be
+       Ghost enabled.
+       * exp_dbug.adb (Get_External_Name): Explain special case of
+       Ghost finalizer.
+
 2019-07-22  Eric Botcazou  <ebotcazou@adacore.com>
 
        * repinfo.adb (List_Entities): Also list compiled-generated
index 2ca4109444f6d8e7b97c78ed9682f4261fe858d1..b00fc9291d0509a29ec19416d61f54022f02f480 100644 (file)
@@ -2035,6 +2035,13 @@ package body Exp_Ch7 is
 
             Analyze (Fin_Body, Suppress => All_Checks);
          end if;
+
+         --  Never consider that the finalizer procedure is enabled Ghost, even
+         --  when the corresponding unit is Ghost, as this would lead to an
+         --  an external name with a ___ghost_ prefix that the binder cannot
+         --  generate, as it has no knowledge of the Ghost status of units.
+
+         Set_Is_Checked_Ghost_Entity (Fin_Id, False);
       end Create_Finalizer;
 
       --------------------------
index 388d247d609b89ba733946cbff56b0792224d11a..f0df5e25baf2e1f0d861a2cc1c158f676d9543a9 100644 (file)
@@ -914,6 +914,14 @@ package body Exp_Dbug is
       --  names produced for Ghost entities, while "__ghost_" can appear in
       --  names of entities inside a child/local package called "Ghost".
 
+      --  The compiler-generated finalizer for an enabled Ghost unit is treated
+      --  specially, as its name must be known to the binder, which has no
+      --  knowledge of Ghost status. In that case, the finalizer is not marked
+      --  as Ghost so that no prefix is added. Note that the special ___ghost_
+      --  prefix is retained when the Ghost unit is ignored, which still allows
+      --  inspecting the final executable for the presence of an ignored Ghost
+      --  finalizer procedure.
+
       if Is_Ghost_Entity (E)
         and then not Is_Compilation_Unit (E)
         and then (Name_Len < 9
index 2b3e4770fb7de796d243e24a8a3f74d9b4bf6f33..0ef05ddfa7344855794a160dec370c9fa83dafae 100644 (file)
@@ -1,3 +1,7 @@
+2019-07-23  Yannick Moy  <moy@adacore.com>
+
+       * gnat.dg/ghost6.adb, gnat.dg/ghost6_pkg.ads: New testcase.
+
 2019-07-22  Sylvia Taylor  <sylvia.taylor@arm.com>
 
        * gcc.target/aarch64/simd/ssra.c: New test.
diff --git a/gcc/testsuite/gnat.dg/ghost6.adb b/gcc/testsuite/gnat.dg/ghost6.adb
new file mode 100644 (file)
index 0000000..01a2417
--- /dev/null
@@ -0,0 +1,10 @@
+--  { dg-do link }
+--  { dg-options "-gnata -g" }
+
+with Ghost6_Pkg;
+
+procedure Ghost6 is
+   X : Ghost6_Pkg.T with Ghost;
+begin
+   null;
+end Ghost6;
diff --git a/gcc/testsuite/gnat.dg/ghost6_pkg.ads b/gcc/testsuite/gnat.dg/ghost6_pkg.ads
new file mode 100644 (file)
index 0000000..7fbd942
--- /dev/null
@@ -0,0 +1,7 @@
+with Ada.Finalization;
+
+package Ghost6_Pkg with
+  Ghost
+is
+   type T is new Ada.Finalization.Controlled with null record;
+end Ghost6_Pkg;