[Ada] Suppress Initialize_Scalars for Persistent_BSS

If a variable has pragma Persistent_BSS, the compiler now automatically
suppresses implicit initializations caused by Initialize_Scalars and
Normalize_Scalars. Variables with Persistent_BSS cannot be initialized,
and previously a pragma Suppress_Initialization was required before the
pragma Persistent_BSS.

2019-08-20  Bob Duff  <duff@adacore.com>

gcc/ada/

	* sem_prag.adb (Persistent_BSS): If an initialization is present
	because of Initialize_Scalars or Normalize_Scalars, generate an
	implicit pragma Suppress_Initialization to remove that, because
	initialization is not allowed for these variables. Other
	initializations remain illegal.

From-SVN: r274732
This commit is contained in:
Bob Duff 2019-08-20 09:49:51 +00:00 committed by Pierre-Marie de Rodat
parent e0ea5d16a8
commit 9740c24464
2 changed files with 27 additions and 3 deletions

View File

@ -1,3 +1,11 @@
2019-08-20 Bob Duff <duff@adacore.com>
* sem_prag.adb (Persistent_BSS): If an initialization is present
because of Initialize_Scalars or Normalize_Scalars, generate an
implicit pragma Suppress_Initialization to remove that, because
initialization is not allowed for these variables. Other
initializations remain illegal.
2019-08-20 Gary Dismukes <dismukes@adacore.com>
* sem_ch3.adb (OK_For_Limited_Init_In_05): In the case of type

View File

@ -21092,8 +21092,24 @@ package body Sem_Prag is
Decl := Parent (Ent);
if Present (Expression (Decl)) then
Error_Pragma_Arg
("object for pragma% cannot have initialization", Arg1);
-- Variables in Persistent_BSS cannot be initialized, so
-- turn off any initialization that might be caused by
-- pragmas Initialize_Scalars or Normalize_Scalars.
if Kill_Range_Check (Expression (Decl)) then
Prag :=
Make_Pragma (Loc,
Name_Suppress_Initialization,
Pragma_Argument_Associations => New_List (
Make_Pragma_Argument_Association (Loc,
Expression => New_Occurrence_Of (Ent, Loc))));
Insert_Before (N, Prag);
Analyze (Prag);
else
Error_Pragma_Arg
("object for pragma% cannot have initialization", Arg1);
end if;
end if;
if not Is_Potentially_Persistent_Type (Etype (Ent)) then
@ -21104,7 +21120,7 @@ package body Sem_Prag is
Prag :=
Make_Linker_Section_Pragma
(Ent, Sloc (N), ".persistent.bss");
(Ent, Loc, ".persistent.bss");
Insert_After (N, Prag);
Analyze (Prag);