Commit d71b0a9a by Yannick Moy Committed by Pierre-Marie de Rodat

[Ada] Do not expand code inside ignored ghost bodies

While ignored ghost code is not compiled into the executable, it may
lead to compilation errors when it makes use of language features
requiring runtime support that is not available in the available runtime
library.  These errors are spurious, as the executable will never call
in these runtime units.

This patch deactivates the expansion of code inside ignored ghost bodies
of subprograms and packages, so that this code is still checked for
possible semantic errors, but it does not force the presence of useless
runtime units.

There is no impact on the executable produced.

2018-12-11  Yannick Moy  <moy@adacore.com>

gcc/ada/

	* sem_ch6.adb (Analyze_Subprogram_Body_Helper): Deactivate
	expansion in ignored ghost subprogram body.
	* sem_ch7.adb (Analyze_Package_Body_Helper): Deactivate
	expansion in ignored ghost package body.

gcc/testsuite/

	* gnat.dg/ghost4.adb: New testcase.

From-SVN: r267015
parent c1326996
2018-12-11 Yannick Moy <moy@adacore.com>
* sem_ch6.adb (Analyze_Subprogram_Body_Helper): Deactivate
expansion in ignored ghost subprogram body.
* sem_ch7.adb (Analyze_Package_Body_Helper): Deactivate
expansion in ignored ghost package body.
2018-12-11 Ed Schonberg <schonberg@adacore.com> 2018-12-11 Ed Schonberg <schonberg@adacore.com>
* exp_unst.adb (Register_Subprogram): A subprogram whose address * exp_unst.adb (Register_Subprogram): A subprogram whose address
......
...@@ -3370,6 +3370,7 @@ package body Sem_Ch6 is ...@@ -3370,6 +3370,7 @@ package body Sem_Ch6 is
Saved_GM : constant Ghost_Mode_Type := Ghost_Mode; Saved_GM : constant Ghost_Mode_Type := Ghost_Mode;
Saved_IGR : constant Node_Id := Ignored_Ghost_Region; Saved_IGR : constant Node_Id := Ignored_Ghost_Region;
Saved_EA : constant Boolean := Expander_Active;
Saved_ISMP : constant Boolean := Saved_ISMP : constant Boolean :=
Ignore_SPARK_Mode_Pragmas_In_Instance; Ignore_SPARK_Mode_Pragmas_In_Instance;
-- Save the Ghost and SPARK mode-related data to restore on exit -- Save the Ghost and SPARK mode-related data to restore on exit
...@@ -3610,6 +3611,18 @@ package body Sem_Ch6 is ...@@ -3610,6 +3611,18 @@ package body Sem_Ch6 is
end if; end if;
end if; end if;
-- Deactivate expansion inside the body of ignored Ghost entities,
-- as this code will ultimately be ignored. This avoids requiring the
-- presence of run-time units which are not needed. Only do this for
-- user entities, as internally generated entitities might still need
-- to be expanded (e.g. those generated for types).
if Present (Ignored_Ghost_Region)
and then Comes_From_Source (Body_Id)
then
Expander_Active := False;
end if;
-- Previously we scanned the body to look for nested subprograms, and -- Previously we scanned the body to look for nested subprograms, and
-- rejected an inline directive if nested subprograms were present, -- rejected an inline directive if nested subprograms were present,
-- because the back-end would generate conflicting symbols for the -- because the back-end would generate conflicting symbols for the
...@@ -4588,6 +4601,10 @@ package body Sem_Ch6 is ...@@ -4588,6 +4601,10 @@ package body Sem_Ch6 is
end if; end if;
<<Leave>> <<Leave>>
if Present (Ignored_Ghost_Region) then
Expander_Active := Saved_EA;
end if;
Ignore_SPARK_Mode_Pragmas_In_Instance := Saved_ISMP; Ignore_SPARK_Mode_Pragmas_In_Instance := Saved_ISMP;
Restore_Ghost_Region (Saved_GM, Saved_IGR); Restore_Ghost_Region (Saved_GM, Saved_IGR);
end Analyze_Subprogram_Body_Helper; end Analyze_Subprogram_Body_Helper;
......
...@@ -669,6 +669,7 @@ package body Sem_Ch7 is ...@@ -669,6 +669,7 @@ package body Sem_Ch7 is
Saved_GM : constant Ghost_Mode_Type := Ghost_Mode; Saved_GM : constant Ghost_Mode_Type := Ghost_Mode;
Saved_IGR : constant Node_Id := Ignored_Ghost_Region; Saved_IGR : constant Node_Id := Ignored_Ghost_Region;
Saved_EA : constant Boolean := Expander_Active;
Saved_ISMP : constant Boolean := Saved_ISMP : constant Boolean :=
Ignore_SPARK_Mode_Pragmas_In_Instance; Ignore_SPARK_Mode_Pragmas_In_Instance;
-- Save the Ghost and SPARK mode-related data to restore on exit -- Save the Ghost and SPARK mode-related data to restore on exit
...@@ -780,6 +781,18 @@ package body Sem_Ch7 is ...@@ -780,6 +781,18 @@ package body Sem_Ch7 is
Mark_And_Set_Ghost_Body (N, Spec_Id); Mark_And_Set_Ghost_Body (N, Spec_Id);
-- Deactivate expansion inside the body of ignored Ghost entities,
-- as this code will ultimately be ignored. This avoids requiring the
-- presence of run-time units which are not needed. Only do this for
-- user entities, as internally generated entitities might still need
-- to be expanded (e.g. those generated for types).
if Present (Ignored_Ghost_Region)
and then Comes_From_Source (Body_Id)
then
Expander_Active := False;
end if;
-- If the body completes the initial declaration of a compilation unit -- If the body completes the initial declaration of a compilation unit
-- which is subject to pragma Elaboration_Checks, set the model of the -- which is subject to pragma Elaboration_Checks, set the model of the
-- pragma because it applies to all parts of the unit. -- pragma because it applies to all parts of the unit.
...@@ -1075,6 +1088,10 @@ package body Sem_Ch7 is ...@@ -1075,6 +1088,10 @@ package body Sem_Ch7 is
end if; end if;
end if; end if;
if Present (Ignored_Ghost_Region) then
Expander_Active := Saved_EA;
end if;
Ignore_SPARK_Mode_Pragmas_In_Instance := Saved_ISMP; Ignore_SPARK_Mode_Pragmas_In_Instance := Saved_ISMP;
Restore_Ghost_Region (Saved_GM, Saved_IGR); Restore_Ghost_Region (Saved_GM, Saved_IGR);
end Analyze_Package_Body_Helper; end Analyze_Package_Body_Helper;
......
2018-12-11 Yannick Moy <moy@adacore.com>
* gnat.dg/ghost4.adb: New testcase.
2018-12-11 Ed Schonberg <schonberg@adacore.com> 2018-12-11 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/iter4.adb: New testcase. * gnat.dg/iter4.adb: New testcase.
......
pragma Restrictions (No_Secondary_Stack);
procedure Ghost4 is
procedure Dummy with Ghost is
function Slice (S : String) return String is
(S (S'First .. S'First + 3));
X : String := Slice ("hello");
begin
null;
end Dummy;
begin
Dummy;
end Ghost4;
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