Commit 39c20502 by Yannick Moy Committed by Pierre-Marie de Rodat

[Ada] Fix binding of ghost units with finalizer

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
parent 58b8c5a8
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
......
......@@ -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;
--------------------------
......
......@@ -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
......
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.
......
-- { dg-do link }
-- { dg-options "-gnata -g" }
with Ghost6_Pkg;
procedure Ghost6 is
X : Ghost6_Pkg.T with Ghost;
begin
null;
end Ghost6;
with Ada.Finalization;
package Ghost6_Pkg with
Ghost
is
type T is new Ada.Finalization.Controlled with null record;
end Ghost6_Pkg;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment