From 39c20502ef7398766a8c9520c4210c2df9769d15 Mon Sep 17 00:00:00 2001 From: Yannick Moy Date: Tue, 23 Jul 2019 08:13:01 +0000 Subject: [PATCH] [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 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 | 7 +++++++ gcc/ada/exp_ch7.adb | 7 +++++++ gcc/ada/exp_dbug.adb | 8 ++++++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gnat.dg/ghost6.adb | 10 ++++++++++ gcc/testsuite/gnat.dg/ghost6_pkg.ads | 7 +++++++ 6 files changed, 43 insertions(+) create mode 100644 gcc/testsuite/gnat.dg/ghost6.adb create mode 100644 gcc/testsuite/gnat.dg/ghost6_pkg.ads diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index db77736f321..0f7cd2d4838 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,10 @@ +2019-07-23 Yannick Moy + + * 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 * repinfo.adb (List_Entities): Also list compiled-generated diff --git a/gcc/ada/exp_ch7.adb b/gcc/ada/exp_ch7.adb index 2ca4109444f..b00fc9291d0 100644 --- a/gcc/ada/exp_ch7.adb +++ b/gcc/ada/exp_ch7.adb @@ -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; -------------------------- diff --git a/gcc/ada/exp_dbug.adb b/gcc/ada/exp_dbug.adb index 388d247d609..f0df5e25baf 100644 --- a/gcc/ada/exp_dbug.adb +++ b/gcc/ada/exp_dbug.adb @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2b3e4770fb7..0ef05ddfa73 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-07-23 Yannick Moy + + * gnat.dg/ghost6.adb, gnat.dg/ghost6_pkg.ads: New testcase. + 2019-07-22 Sylvia Taylor * 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 index 00000000000..01a2417ad53 --- /dev/null +++ b/gcc/testsuite/gnat.dg/ghost6.adb @@ -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 index 00000000000..7fbd942b5e2 --- /dev/null +++ b/gcc/testsuite/gnat.dg/ghost6_pkg.ads @@ -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; -- 2.30.2