diff options
author | Yannick Moy <moy@adacore.com> | 2019-07-23 08:13:01 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2019-07-23 08:13:01 +0000 |
commit | 39c20502ef7398766a8c9520c4210c2df9769d15 (patch) | |
tree | 0df1c95911c37142af392c2da93d5aac8422b887 | |
parent | 58b8c5a87b0bac61bb88e802fc742fdc0d3e6699 (diff) | |
download | gcc-39c20502ef7398766a8c9520c4210c2df9769d15.zip gcc-39c20502ef7398766a8c9520c4210c2df9769d15.tar.gz gcc-39c20502ef7398766a8c9520c4210c2df9769d15.tar.bz2 |
[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
-rw-r--r-- | gcc/ada/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/ada/exp_ch7.adb | 7 | ||||
-rw-r--r-- | gcc/ada/exp_dbug.adb | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/ghost6.adb | 10 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/ghost6_pkg.ads | 7 |
6 files changed, 43 insertions, 0 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index db77736..0f7cd2d 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -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 diff --git a/gcc/ada/exp_ch7.adb b/gcc/ada/exp_ch7.adb index 2ca4109..b00fc92 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 388d247..f0df5e2 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 2b3e477..0ef05dd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..01a2417 --- /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 0000000..7fbd942 --- /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; |