[multiple changes]

2011-08-04  Emmanuel Briot  <briot@adacore.com>

	* prj-proc.adb, prj-nmsc.adb, prj-env.adb (Process_Declarative_Items):
	Add support for overriding the Project_Path in aggregate projects.

2011-08-04  Robert Dewar  <dewar@adacore.com>

	* a-cofove.ads: Minor reformatting.

2011-08-04  Hristian Kirtchev  <kirtchev@adacore.com>

	* exp_ch7.adb (Build_Adjust_Or_Finalize_Statements): Update the comment
	on the generated code.
	(Build_Finalize_Statements): Update the comment on the generated code.
	(Build_Initialize_Statements): Update the comment on the generated code.
	(Build_Object_Declarations): Add local variable Result. The object
	declarations are now built in sequence.
	* rtsfind.ads: Add RE_Exception_Occurrence_Access to tables RE_Id and
	RE_Unit_Table.

2011-08-04  Robert Dewar  <dewar@adacore.com>

	* checks.adb, alfa.adb, alfa.ads: Minor reformatting.

2011-08-04  Eric Botcazou  <ebotcazou@adacore.com>

	* einfo.ads (Elaboration_Entity): Document new definition and use.
	(Elaboration_Entity_Required): Adjust to above change.
	* exp_attr.adb (Expand_N_Attribute_Reference): Likewise.
	* exp_ch12.adb: And with and use for Snames.
	(Expand_N_Generic_Instantiation): Test 'Elaborated attribute.
	* exp_util.adb (Set_Elaboration_Flag): Likewise.
	* sem_attr.adb (Analyze_Attribute) <Check_Library_Unit>: Delete.
	<Check_Unit_Name>: Deal with N_Expanded_Name.
	<Attribute_Elaborated>: Extend to all unit names.
	* sem_elab.adb: And with and use for Uintp.
	(Check_Internal_Call_Continue): Adjust to Elaboration_Entity change.
	* sem_util.ads (Build_Elaboration_Entity): Adjust comment.
	* sem_util.adb (Build_Elaboration_Entity): Change type to Integer.
	* bindgen.adb (Gen_Elab_Externals_Ada): New local subprogram taken
	from Gen_Adainit_Ada.
	(Gen_Elab_Externals_C): Likewise, but taken from Gen_Adainit_C.
	(Gen_Adafinal_Ada): Remove redundant test.  In the non-main program
	case, do not call System.Standard_Library.Adafinal; instead call
	finalize_library if needed.
	(Gen_Adafinal_C): Likewise.
	(Gen_Adainit_Ada): Do not set SSL.Finalize_Library_Objects in the
	non-main program case.
	(Gen_Adainit_C): Generate a couple of external declarations here.
	In the main program case, set SSL.Finalize_Library_Objects.
	(Gen_Elab_Calls_Ada): Adjust to Elaboration_Entity change.
	(Gen_Elab_Calls_C): Likewise.
	(Gen_Finalize_Library_Ada): Likewise.  Skip SAL interface units.
	(Gen_Finalize_Library_C): Likewise.  Generate a full function.
	(Gen_Main_C): Put back call to Ada_Final and don't finalize library
	objects here.
	(Gen_Output_File_Ada): Generate pragma Linker_Destructor for Ada_Final
	if -a is specified.  Call Gen_Elab_Externals_Ada.  Move around call to
	Gen_Adafinal_Ada.
	(Gen_Output_File_C): Generate __attribute__((destructor)) for Ada_Final
	if -a is specified.  Call Gen_Elab_Externals_C.  Remove useless couple
	of external declarations.  Call Gen_Finalize_Library_C.

From-SVN: r177318
This commit is contained in:
Arnaud Charlet 2011-08-04 09:45:20 +02:00
parent 316d9d4f9f
commit 824e932015
19 changed files with 659 additions and 410 deletions

View File

@ -1,3 +1,66 @@
2011-08-04 Emmanuel Briot <briot@adacore.com>
* prj-proc.adb, prj-nmsc.adb, prj-env.adb (Process_Declarative_Items):
Add support for overriding the Project_Path in aggregate projects.
2011-08-04 Robert Dewar <dewar@adacore.com>
* a-cofove.ads: Minor reformatting.
2011-08-04 Hristian Kirtchev <kirtchev@adacore.com>
* exp_ch7.adb (Build_Adjust_Or_Finalize_Statements): Update the comment
on the generated code.
(Build_Finalize_Statements): Update the comment on the generated code.
(Build_Initialize_Statements): Update the comment on the generated code.
(Build_Object_Declarations): Add local variable Result. The object
declarations are now built in sequence.
* rtsfind.ads: Add RE_Exception_Occurrence_Access to tables RE_Id and
RE_Unit_Table.
2011-08-04 Robert Dewar <dewar@adacore.com>
* checks.adb, alfa.adb, alfa.ads: Minor reformatting.
2011-08-04 Eric Botcazou <ebotcazou@adacore.com>
* einfo.ads (Elaboration_Entity): Document new definition and use.
(Elaboration_Entity_Required): Adjust to above change.
* exp_attr.adb (Expand_N_Attribute_Reference): Likewise.
* exp_ch12.adb: And with and use for Snames.
(Expand_N_Generic_Instantiation): Test 'Elaborated attribute.
* exp_util.adb (Set_Elaboration_Flag): Likewise.
* sem_attr.adb (Analyze_Attribute) <Check_Library_Unit>: Delete.
<Check_Unit_Name>: Deal with N_Expanded_Name.
<Attribute_Elaborated>: Extend to all unit names.
* sem_elab.adb: And with and use for Uintp.
(Check_Internal_Call_Continue): Adjust to Elaboration_Entity change.
* sem_util.ads (Build_Elaboration_Entity): Adjust comment.
* sem_util.adb (Build_Elaboration_Entity): Change type to Integer.
* bindgen.adb (Gen_Elab_Externals_Ada): New local subprogram taken
from Gen_Adainit_Ada.
(Gen_Elab_Externals_C): Likewise, but taken from Gen_Adainit_C.
(Gen_Adafinal_Ada): Remove redundant test. In the non-main program
case, do not call System.Standard_Library.Adafinal; instead call
finalize_library if needed.
(Gen_Adafinal_C): Likewise.
(Gen_Adainit_Ada): Do not set SSL.Finalize_Library_Objects in the
non-main program case.
(Gen_Adainit_C): Generate a couple of external declarations here.
In the main program case, set SSL.Finalize_Library_Objects.
(Gen_Elab_Calls_Ada): Adjust to Elaboration_Entity change.
(Gen_Elab_Calls_C): Likewise.
(Gen_Finalize_Library_Ada): Likewise. Skip SAL interface units.
(Gen_Finalize_Library_C): Likewise. Generate a full function.
(Gen_Main_C): Put back call to Ada_Final and don't finalize library
objects here.
(Gen_Output_File_Ada): Generate pragma Linker_Destructor for Ada_Final
if -a is specified. Call Gen_Elab_Externals_Ada. Move around call to
Gen_Adafinal_Ada.
(Gen_Output_File_C): Generate __attribute__((destructor)) for Ada_Final
if -a is specified. Call Gen_Elab_Externals_C. Remove useless couple
of external declarations.  Call Gen_Finalize_Library_C.
2011-08-04 Emmanuel Briot <briot@adacore.com> 2011-08-04 Emmanuel Briot <briot@adacore.com>
* prj.adb, prj.ads, makeutl.adb, makeutl.ads (Complete_Mains, * prj.adb, prj.ads, makeutl.adb, makeutl.ads (Complete_Mains,

View File

@ -143,8 +143,9 @@ package Ada.Containers.Formal_Vectors is
(Container : Vector; (Container : Vector;
Index : Index_Type) return Element_Type; Index : Index_Type) return Element_Type;
function Element (Container : Vector; Position : Cursor) function Element
return Element_Type; (Container : Vector;
Position : Cursor) return Element_Type;
procedure Replace_Element procedure Replace_Element
(Container : in out Vector; (Container : in out Vector;
@ -388,7 +389,7 @@ private
for Vector'Read use Read; for Vector'Read use Read;
type Cursor is record type Cursor is record
Valid : Boolean := True; Valid : Boolean := True;
Index : Index_Type := Index_Type'First; Index : Index_Type := Index_Type'First;
end record; end record;

View File

@ -144,17 +144,6 @@ package body ALFA is
end loop; end loop;
end dalfa; end dalfa;
----------------
-- Initialize --
----------------
procedure Initialize_ALFA_Tables is
begin
ALFA_File_Table.Init;
ALFA_Scope_Table.Init;
ALFA_Xref_Table.Init;
end Initialize_ALFA_Tables;
------------------------- -------------------------
-- Get_Entity_For_Decl -- -- Get_Entity_For_Decl --
------------------------- -------------------------
@ -223,6 +212,17 @@ package body ALFA is
return E; return E;
end Get_Unique_Entity_For_Decl; end Get_Unique_Entity_For_Decl;
----------------
-- Initialize --
----------------
procedure Initialize_ALFA_Tables is
begin
ALFA_File_Table.Init;
ALFA_Scope_Table.Init;
ALFA_Xref_Table.Init;
end Initialize_ALFA_Tables;
----------- -----------
-- palfa -- -- palfa --
----------- -----------

View File

@ -316,10 +316,6 @@ package ALFA is
-- Subprograms -- -- Subprograms --
----------------- -----------------
procedure dalfa;
-- Debug routine to dump internal ALFA tables. This is a raw format dump
-- showing exactly what the tables contain.
procedure Initialize_ALFA_Tables; procedure Initialize_ALFA_Tables;
-- Reset tables for a new compilation -- Reset tables for a new compilation
@ -330,6 +326,10 @@ package ALFA is
-- Return the entity which represents declaration N, so that matching -- Return the entity which represents declaration N, so that matching
-- declaration and body have the same entity. -- declaration and body have the same entity.
procedure dalfa;
-- Debug routine to dump internal ALFA tables. This is a raw format dump
-- showing exactly what the tables contain.
procedure palfa; procedure palfa;
-- Debugging procedure to output contents of ALFA binary tables in the -- Debugging procedure to output contents of ALFA binary tables in the
-- format in which they appear in an ALI file. -- format in which they appear in an ALI file.

View File

@ -72,6 +72,7 @@ package body Bindgen is
-- unit unconditionally, which is unpleasand, especially for ZFP etc.) -- unit unconditionally, which is unpleasand, especially for ZFP etc.)
Lib_Final_Built : Boolean := False; Lib_Final_Built : Boolean := False;
-- Flag indicating whether the finalize_library rountine has been built
---------------------------------- ----------------------------------
-- Interface_State Pragma Table -- -- Interface_State Pragma Table --
@ -244,6 +245,12 @@ package body Bindgen is
procedure Gen_Adafinal_C; procedure Gen_Adafinal_C;
-- Generate the Adafinal procedure (C code case) -- Generate the Adafinal procedure (C code case)
procedure Gen_Elab_Externals_Ada;
-- Generate sequence of external declarations for elaboration (Ada)
procedure Gen_Elab_Externals_C;
-- Generate sequence of external declarations for elaboration (C)
procedure Gen_Elab_Calls_Ada; procedure Gen_Elab_Calls_Ada;
-- Generate sequence of elaboration calls (Ada code case) -- Generate sequence of elaboration calls (Ada code case)
@ -421,13 +428,15 @@ package body Bindgen is
begin begin
WBI (" procedure " & Ada_Final_Name.all & " is"); WBI (" procedure " & Ada_Final_Name.all & " is");
-- Do nothing if finalization is disabled if not Bind_Main_Program then
if Cumulative_Restrictions.Set (No_Finalization) then
WBI (" begin"); WBI (" begin");
WBI (" null;"); if Lib_Final_Built then
WBI (" finalize_library;");
else
WBI (" null;");
end if;
-- General case -- Main program case
elsif VM_Target = No_VM then elsif VM_Target = No_VM then
WBI (" procedure s_stalib_adafinal;"); WBI (" procedure s_stalib_adafinal;");
@ -455,7 +464,17 @@ package body Bindgen is
procedure Gen_Adafinal_C is procedure Gen_Adafinal_C is
begin begin
WBI ("void " & Ada_Final_Name.all & " (void) {"); WBI ("void " & Ada_Final_Name.all & " (void) {");
WBI (" system__standard_library__adafinal ();");
if not Bind_Main_Program then
if Lib_Final_Built then
WBI (" finalize_library ();");
end if;
-- Main program case
else
WBI (" system__standard_library__adafinal ();");
end if;
WBI ("}"); WBI ("}");
WBI (""); WBI ("");
end Gen_Adafinal_C; end Gen_Adafinal_C;
@ -471,86 +490,6 @@ package body Bindgen is
begin begin
WBI (" procedure " & Ada_Init_Name.all & " is"); WBI (" procedure " & Ada_Init_Name.all & " is");
-- Generate externals for elaboration entities
for E in Elab_Order.First .. Elab_Order.Last loop
declare
Unum : constant Unit_Id := Elab_Order.Table (E);
U : Unit_Record renames Units.Table (Unum);
begin
-- Check for Elab_Entity to be set for this unit
if U.Set_Elab_Entity
-- Don't generate reference for stand alone library
and then not U.SAL_Interface
-- Don't generate reference for predefined file in No_Run_Time
-- mode, since we don't include the object files in this case
and then not
(No_Run_Time_Mode
and then Is_Predefined_File_Name (U.Sfile))
then
Set_String (" ");
Set_String ("E");
Set_Unit_Number (Unum);
case VM_Target is
when No_VM | JVM_Target =>
Set_String (" : Boolean; pragma Import (Ada, ");
when CLI_Target =>
Set_String (" : Boolean; pragma Import (CIL, ");
end case;
Set_String ("E");
Set_Unit_Number (Unum);
Set_String (", """);
Get_Name_String (U.Uname);
-- In the case of JGNAT we need to emit an Import name that
-- includes the class name (using '$' separators in the case
-- of a child unit name).
if VM_Target /= No_VM then
for J in 1 .. Name_Len - 2 loop
if VM_Target = CLI_Target
or else Name_Buffer (J) /= '.'
then
Set_Char (Name_Buffer (J));
else
Set_String ("$");
end if;
end loop;
if VM_Target /= CLI_Target or else U.Unit_Kind = 's' then
Set_String (".");
else
Set_String ("_pkg.");
end if;
-- If the unit name is very long, then split the
-- Import link name across lines using "&" (occurs
-- in some C2 tests).
if 2 * Name_Len + 60 > Hostparm.Max_Line_Length then
Set_String (""" &");
Write_Statement_Buffer;
Set_String (" """);
end if;
end if;
Set_Unit_Name;
Set_String ("_E"");");
Write_Statement_Buffer;
end if;
end;
end loop;
Write_Statement_Buffer;
-- If the standard library is suppressed, then the only global variables -- If the standard library is suppressed, then the only global variables
-- that might be needed (by the Ravenscar profile) are the priority and -- that might be needed (by the Ravenscar profile) are the priority and
-- the processor for the environment task. -- the processor for the environment task.
@ -927,38 +866,39 @@ package body Bindgen is
WBI (" Initialize_Stack_Limit;"); WBI (" Initialize_Stack_Limit;");
end if; end if;
-- Attach Finalize_Library to the right soft link. Do it only when not -- In the main program case, attach finalize_library to the soft link.
-- using a restricted run time, in which case tasks are -- Do it only when not using a restricted run time, in which case tasks
-- non-terminating, so we do not want library-level finalization. -- are non-terminating, so we do not want library-level finalization.
if not Configurable_Run_Time_On_Target then if Bind_Main_Program
if not Suppress_Standard_Library_On_Target then and then not Configurable_Run_Time_On_Target
WBI (""); and then not Suppress_Standard_Library_On_Target
then
if VM_Target = No_VM then WBI ("");
if Lib_Final_Built then
Set_String (" Finalize_Library_Objects := ");
Set_String ("Finalize_Library'access;");
else
Set_String (" Finalize_Library_Objects := null;");
end if;
-- On VM targets use regular Ada to set the soft link
if VM_Target = No_VM then
if Lib_Final_Built then
Set_String (" Finalize_Library_Objects := ");
Set_String ("finalize_library'access;");
else else
if Lib_Final_Built then Set_String (" Finalize_Library_Objects := null;");
Set_String
(" System.Soft_Links.Finalize_Library_Objects");
Set_String (" := Finalize_Library'access;");
else
Set_String
(" System.Soft_Links.Finalize_Library_Objects");
Set_String (" := null;");
end if;
end if; end if;
Write_Statement_Buffer; -- On VM targets use regular Ada to set the soft link
else
if Lib_Final_Built then
Set_String
(" System.Soft_Links.Finalize_Library_Objects");
Set_String (" := finalize_library'access;");
else
Set_String
(" System.Soft_Links.Finalize_Library_Objects");
Set_String (" := null;");
end if;
end if; end if;
Write_Statement_Buffer;
end if; end if;
-- Generate elaboration calls -- Generate elaboration calls
@ -1001,40 +941,6 @@ package body Bindgen is
WBI ("void " & Ada_Init_Name.all & " (void)"); WBI ("void " & Ada_Init_Name.all & " (void)");
WBI ("{"); WBI ("{");
-- Generate externals for elaboration entities
for E in Elab_Order.First .. Elab_Order.Last loop
declare
Unum : constant Unit_Id := Elab_Order.Table (E);
U : Unit_Record renames Units.Table (Unum);
begin
-- Check for Elab entity to be set for this unit
if U.Set_Elab_Entity
-- Don't generate reference for stand alone library
and then not U.SAL_Interface
-- Don't generate reference for predefined file in No_Run_Time
-- mode, since we don't include the object files in this case
and then not
(No_Run_Time_Mode
and then Is_Predefined_File_Name (U.Sfile))
then
Set_String (" extern char ");
Get_Name_String (U.Uname);
Set_Unit_Name;
Set_String ("_E;");
Write_Statement_Buffer;
end if;
end;
end loop;
Write_Statement_Buffer;
-- Standard library suppressed -- Standard library suppressed
if Suppress_Standard_Library_On_Target then if Suppress_Standard_Library_On_Target then
@ -1217,22 +1123,26 @@ package body Bindgen is
Set_String (";"); Set_String (";");
Write_Statement_Buffer; Write_Statement_Buffer;
-- Import entry point for elaboration time signal handler
-- installation, and indication of if it's been called previously.
WBI (" extern int __gnat_handler_installed;");
WBI (""); WBI ("");
-- Install elaboration time signal handler -- Install elaboration time signal handler
WBI (" if (__gnat_handler_installed == 0)"); WBI (" if (__gnat_handler_installed == 0)");
WBI (" {"); WBI (" __gnat_install_handler ();");
WBI (" __gnat_install_handler ();");
WBI (" }");
-- Call feature enable/disable routine -- Import entry point for environment feature enable/disable
-- routine, and indication that it's been called previously.
if OpenVMS_On_Target then if OpenVMS_On_Target then
WBI (" extern int __gnat_features_set;");
WBI ("");
WBI (" if (__gnat_features_set == 0)"); WBI (" if (__gnat_features_set == 0)");
WBI (" {"); WBI (" __gnat_set_features ();");
WBI (" __gnat_set_features ();");
WBI (" }");
end if; end if;
end if; end if;
@ -1269,6 +1179,27 @@ package body Bindgen is
Write_Statement_Buffer; Write_Statement_Buffer;
end if; end if;
-- In the main program case, attach finalize_library to the soft link.
-- Do it only when not using a restricted run time, in which case tasks
-- are non-terminating, so we do not want library-level finalization.
if Bind_Main_Program
and then not Configurable_Run_Time_On_Target
and then not Suppress_Standard_Library_On_Target
then
WBI ("");
WBI (" extern void (*__gnat_finalize_library_objects)(void);");
if Lib_Final_Built then
Set_String (" __gnat_finalize_library_objects = ");
Set_String ("&finalize_library;");
else
Set_String (" __gnat_finalize_library_objects = 0;");
end if;
Write_Statement_Buffer;
end if;
-- Generate elaboration calls -- Generate elaboration calls
WBI (""); WBI ("");
@ -1277,6 +1208,130 @@ package body Bindgen is
WBI (""); WBI ("");
end Gen_Adainit_C; end Gen_Adainit_C;
----------------------------
-- Gen_Elab_Externals_Ada --
----------------------------
procedure Gen_Elab_Externals_Ada is
begin
for E in Elab_Order.First .. Elab_Order.Last loop
declare
Unum : constant Unit_Id := Elab_Order.Table (E);
U : Unit_Record renames Units.Table (Unum);
begin
-- Check for Elab_Entity to be set for this unit
if U.Set_Elab_Entity
-- Don't generate reference for stand alone library
and then not U.SAL_Interface
-- Don't generate reference for predefined file in No_Run_Time
-- mode, since we don't include the object files in this case
and then not
(No_Run_Time_Mode
and then Is_Predefined_File_Name (U.Sfile))
then
Set_String (" ");
Set_String ("E");
Set_Unit_Number (Unum);
case VM_Target is
when No_VM | JVM_Target =>
Set_String (" : Integer; pragma Import (Ada, ");
when CLI_Target =>
Set_String (" : Integer; pragma Import (CIL, ");
end case;
Set_String ("E");
Set_Unit_Number (Unum);
Set_String (", """);
Get_Name_String (U.Uname);
-- In the case of JGNAT we need to emit an Import name that
-- includes the class name (using '$' separators in the case
-- of a child unit name).
if VM_Target /= No_VM then
for J in 1 .. Name_Len - 2 loop
if VM_Target = CLI_Target
or else Name_Buffer (J) /= '.'
then
Set_Char (Name_Buffer (J));
else
Set_String ("$");
end if;
end loop;
if VM_Target /= CLI_Target or else U.Unit_Kind = 's' then
Set_String (".");
else
Set_String ("_pkg.");
end if;
-- If the unit name is very long, then split the
-- Import link name across lines using "&" (occurs
-- in some C2 tests).
if 2 * Name_Len + 60 > Hostparm.Max_Line_Length then
Set_String (""" &");
Write_Statement_Buffer;
Set_String (" """);
end if;
end if;
Set_Unit_Name;
Set_String ("_E"");");
Write_Statement_Buffer;
end if;
end;
end loop;
WBI ("");
end Gen_Elab_Externals_Ada;
--------------------------
-- Gen_Elab_Externals_C --
--------------------------
procedure Gen_Elab_Externals_C is
begin
for E in Elab_Order.First .. Elab_Order.Last loop
declare
Unum : constant Unit_Id := Elab_Order.Table (E);
U : Unit_Record renames Units.Table (Unum);
begin
-- Check for Elab entity to be set for this unit
if U.Set_Elab_Entity
-- Don't generate reference for stand alone library
and then not U.SAL_Interface
-- Don't generate reference for predefined file in No_Run_Time
-- mode, since we don't include the object files in this case
and then not
(No_Run_Time_Mode
and then Is_Predefined_File_Name (U.Sfile))
then
Set_String ("extern int ");
Get_Name_String (U.Uname);
Set_Unit_Name;
Set_String ("_E;");
Write_Statement_Buffer;
end if;
end;
end loop;
WBI ("");
end Gen_Elab_Externals_C;
------------------------ ------------------------
-- Gen_Elab_Calls_Ada -- -- Gen_Elab_Calls_Ada --
------------------------ ------------------------
@ -1306,51 +1361,55 @@ package body Bindgen is
if No_Run_Time_Mode and then Is_Predefined_File_Name (U.Sfile) then if No_Run_Time_Mode and then Is_Predefined_File_Name (U.Sfile) then
null; null;
-- Likewise if this is an interface to a stand alone library
elsif U.SAL_Interface then
null;
-- Case of no elaboration code -- Case of no elaboration code
elsif U.No_Elab then elsif U.No_Elab then
-- The only case in which we have to do something is if -- The only case in which we have to do something is if this
-- this is a body, with a separate spec, where the separate -- is a body, with a separate spec, where the separate spec
-- spec has an elaboration entity defined. -- has an elaboration entity defined. In that case, this is
-- where we increment the elaboration entity.
-- In that case, this is where we set the elaboration entity if U.Utype = Is_Body
-- to True, we do not need to test if this has already been
-- done, since it is quicker to set the flag than to test it.
if not U.SAL_Interface and then U.Utype = Is_Body
and then Units.Table (Unum_Spec).Set_Elab_Entity and then Units.Table (Unum_Spec).Set_Elab_Entity
then then
Set_String (" E"); Set_String (" E");
Set_Unit_Number (Unum_Spec); Set_Unit_Number (Unum_Spec);
Set_String (" := True;"); Set_String (" := E");
Set_Unit_Number (Unum_Spec);
Set_String (" + 1;");
Write_Statement_Buffer; Write_Statement_Buffer;
end if; end if;
-- Here if elaboration code is present. If binding a library -- Here if elaboration code is present. If binding a library
-- or if there is a non-Ada main subprogram then we generate: -- or if there is a non-Ada main subprogram then we generate:
-- if not uname_E then -- if uname_E = 0 then
-- uname'elab_[spec|body]; -- uname'elab_[spec|body];
-- uname_E := True;
-- end if; -- end if;
-- uname_E := uname_E + 1;
-- Otherwise, elaboration routines are called unconditionally: -- Otherwise, elaboration routines are called unconditionally:
-- uname'elab_[spec|body]; -- uname'elab_[spec|body];
-- uname_E := True; -- uname_E := uname_E + 1;
-- The uname_E assignment is skipped if this is a separate spec, -- The uname_E increment is skipped if this is a separate spec,
-- since the assignment will be done when we process the body. -- since it will be done when we process the body.
elsif not U.SAL_Interface then else
if Force_Checking_Of_Elaboration_Flags or if Force_Checking_Of_Elaboration_Flags or
Interface_Library_Unit or Interface_Library_Unit or
(not Bind_Main_Program) (not Bind_Main_Program)
then then
Set_String (" if not E"); Set_String (" if E");
Set_Unit_Number (Unum_Spec); Set_Unit_Number (Unum_Spec);
Set_String (" then"); Set_String (" = 0 then");
Write_Statement_Buffer; Write_Statement_Buffer;
Set_String (" "); Set_String (" ");
end if; end if;
@ -1386,26 +1445,21 @@ package body Bindgen is
Set_Char (';'); Set_Char (';');
Write_Statement_Buffer; Write_Statement_Buffer;
if U.Utype /= Is_Spec then
if Force_Checking_Of_Elaboration_Flags or
Interface_Library_Unit or
(not Bind_Main_Program)
then
Set_String (" ");
end if;
Set_String (" E");
Set_Unit_Number (Unum_Spec);
Set_String (" := True;");
Write_Statement_Buffer;
end if;
if Force_Checking_Of_Elaboration_Flags or if Force_Checking_Of_Elaboration_Flags or
Interface_Library_Unit or Interface_Library_Unit or
(not Bind_Main_Program) (not Bind_Main_Program)
then then
WBI (" end if;"); WBI (" end if;");
end if; end if;
if U.Utype /= Is_Spec then
Set_String (" E");
Set_Unit_Number (Unum_Spec);
Set_String (" := E");
Set_Unit_Number (Unum_Spec);
Set_String (" + 1;");
Write_Statement_Buffer;
end if;
end if; end if;
end; end;
end loop; end loop;
@ -1440,40 +1494,47 @@ package body Bindgen is
if No_Run_Time_Mode and then Is_Predefined_File_Name (U.Sfile) then if No_Run_Time_Mode and then Is_Predefined_File_Name (U.Sfile) then
null; null;
-- Likewise if this is an interface to a stand alone library
elsif U.SAL_Interface then
null;
-- Case of no elaboration code -- Case of no elaboration code
elsif U.No_Elab then elsif U.No_Elab then
-- The only case in which we have to do something is if -- The only case in which we have to do something is if this
-- this is a body, with a separate spec, where the separate -- is a body, with a separate spec, where the separate spec
-- spec has an elaboration entity defined. -- has an elaboration entity defined. In that case, this is
-- where we increment the elaboration entity.
-- In that case, this is where we set the elaboration entity if U.Utype = Is_Body
-- to True, we do not need to test if this has already been
-- done, since it is quicker to set the flag than to test it.
if not U.SAL_Interface and then U.Utype = Is_Body
and then Units.Table (Unum_Spec).Set_Elab_Entity and then Units.Table (Unum_Spec).Set_Elab_Entity
then then
Set_String (" ");
Get_Name_String (U.Uname); Get_Name_String (U.Uname);
Set_String (" ");
Set_Unit_Name; Set_Unit_Name;
Set_String ("_E = 1;"); Set_String ("_E++;");
Write_Statement_Buffer; Write_Statement_Buffer;
end if; end if;
-- Here if elaboration code is present. If binding a library -- Here if elaboration code is present. If binding a library
-- or if there is a non-Ada main subprogram then we generate: -- or if there is a non-Ada main subprogram then we generate:
-- if (uname_E == 0) { -- if (uname_E == 0)
-- uname__elab[s|b] (); -- uname__elab[s|b] ();
-- uname_E++; -- uname_E++;
-- }
-- The uname_E assignment is skipped if this is a separate spec, -- Otherwise, elaboration routines are called unconditionally:
-- since the assignment will be done when we process the body.
elsif not U.SAL_Interface then -- uname__elab[s|b] ();
-- uname_E++;
-- The uname_E increment is skipped if this is a separate spec,
-- since it will be done when we process the body.
else
Get_Name_String (U.Uname); Get_Name_String (U.Uname);
if Force_Checking_Of_Elaboration_Flags or if Force_Checking_Of_Elaboration_Flags or
@ -1482,7 +1543,7 @@ package body Bindgen is
then then
Set_String (" if ("); Set_String (" if (");
Set_Unit_Name; Set_Unit_Name;
Set_String ("_E == 0) {"); Set_String ("_E == 0)");
Write_Statement_Buffer; Write_Statement_Buffer;
Set_String (" "); Set_String (" ");
end if; end if;
@ -1495,25 +1556,11 @@ package body Bindgen is
Write_Statement_Buffer; Write_Statement_Buffer;
if U.Utype /= Is_Spec then if U.Utype /= Is_Spec then
if Force_Checking_Of_Elaboration_Flags or
Interface_Library_Unit or
(not Bind_Main_Program)
then
Set_String (" ");
end if;
Set_String (" "); Set_String (" ");
Set_Unit_Name; Set_Unit_Name;
Set_String ("_E++;"); Set_String ("_E++;");
Write_Statement_Buffer; Write_Statement_Buffer;
end if; end if;
if Force_Checking_Of_Elaboration_Flags or
Interface_Library_Unit or
(not Bind_Main_Program)
then
WBI (" }");
end if;
end if; end if;
end; end;
end loop; end loop;
@ -1542,6 +1589,8 @@ package body Bindgen is
Write_Statement_Buffer; Write_Statement_Buffer;
end if; end if;
end loop; end loop;
WBI ("/* END ELABORATION DEFINITIONS */");
WBI (""); WBI ("");
end Gen_Elab_Defs_C; end Gen_Elab_Defs_C;
@ -1602,12 +1651,13 @@ package body Bindgen is
if U.Unit_Kind = 'p' if U.Unit_Kind = 'p'
and then U.Has_Finalizer and then U.Has_Finalizer
and then not U.Is_Generic and then not U.Is_Generic
and then not U.SAL_Interface
and then not U.No_Elab and then not U.No_Elab
then then
if not Lib_Final_Built then if not Lib_Final_Built then
Lib_Final_Built := True; Lib_Final_Built := True;
WBI (" procedure Finalize_Library is"); WBI (" procedure finalize_library is");
-- The following flag is used to check for library-level -- The following flag is used to check for library-level
-- exceptions raised during finalization. The symbol comes -- exceptions raised during finalization. The symbol comes
@ -1708,16 +1758,48 @@ package body Bindgen is
Set_String (""");"); Set_String (""");");
Write_Statement_Buffer; Write_Statement_Buffer;
WBI (" begin"); -- If binding a library or if there is a non-Ada main subprogram
-- then we generate:
-- Generate: -- begin
-- uname_E := uname_E - 1;
-- if uname_E = 0 then
-- F<Count>;
-- end if;
-- end;
-- Otherwise, finalization routines are called unconditionally:
-- begin
-- uname_E := uname_E - 1;
-- F<Count>; -- F<Count>;
-- end; -- end;
WBI (" begin");
Set_String (" E");
Set_Unit_Number (Unum);
Set_String (" := E");
Set_Unit_Number (Unum);
Set_String (" - 1;");
Write_Statement_Buffer;
if Interface_Library_Unit or (not Bind_Main_Program) then
Set_String (" if E");
Set_Unit_Number (Unum);
Set_String (" = 0 then");
Write_Statement_Buffer;
Set_String (" ");
end if;
Set_String (" F"); Set_String (" F");
Set_Int (Count); Set_Int (Count);
Set_Char (';'); Set_Char (';');
Write_Statement_Buffer; Write_Statement_Buffer;
if Interface_Library_Unit or (not Bind_Main_Program) then
WBI (" end if;");
end if;
WBI (" end;"); WBI (" end;");
Count := Count + 1; Count := Count + 1;
@ -1762,7 +1844,7 @@ package body Bindgen is
end if; end if;
WBI (" end if;"); WBI (" end if;");
WBI (" end Finalize_Library;"); WBI (" end finalize_library;");
WBI (""); WBI ("");
end if; end if;
end Gen_Finalize_Library_Ada; end Gen_Finalize_Library_Ada;
@ -1777,8 +1859,6 @@ package body Bindgen is
Unum : Unit_Id; Unum : Unit_Id;
begin begin
WBI (" /* BEGIN FINALIZE */");
for E in reverse Elab_Order.First .. Elab_Order.Last loop for E in reverse Elab_Order.First .. Elab_Order.Last loop
Unum := Elab_Order.Table (E); Unum := Elab_Order.Table (E);
U := Units.Table (Unum); U := Units.Table (Unum);
@ -1788,9 +1868,14 @@ package body Bindgen is
if U.Unit_Kind = 'p' if U.Unit_Kind = 'p'
and then U.Has_Finalizer and then U.Has_Finalizer
and then not U.Is_Generic and then not U.Is_Generic
and then not U.SAL_Interface
and then not U.No_Elab and then not U.No_Elab
then then
Set_String (" "); if not Lib_Final_Built then
Lib_Final_Built := True;
WBI ("static void finalize_library(void) {");
end if;
-- Dealing with package bodies is a little complicated. In such -- Dealing with package bodies is a little complicated. In such
-- cases we must retrieve the package spec since it contains the -- cases we must retrieve the package spec since it contains the
@ -1803,6 +1888,34 @@ package body Bindgen is
Uspec := U; Uspec := U;
end if; end if;
Get_Name_String (Uspec.Uname);
-- If binding a library or if there is a non-Ada main subprogram
-- then we generate:
-- uname_E--;
-- if (uname_E == 0)
-- uname__finalize[S|B] ();
-- Otherwise, finalization routines are called unconditionally:
-- uname_E--;
-- uname__finalize[S|B] ();
Set_String (" ");
Set_Unit_Name;
Set_String ("_E--;");
Write_Statement_Buffer;
if Interface_Library_Unit or (not Bind_Main_Program) then
Set_String (" if (");
Set_Unit_Name;
Set_String ("_E == 0)");
Write_Statement_Buffer;
Set_String (" ");
end if;
Set_String (" ");
Get_Name_String (Uspec.Uname); Get_Name_String (Uspec.Uname);
Set_Unit_Name; Set_Unit_Name;
Set_String ("__finalize"); Set_String ("__finalize");
@ -1826,8 +1939,10 @@ package body Bindgen is
end if; end if;
end loop; end loop;
WBI (" /* END FINALIZE */"); if Lib_Final_Built then
WBI (""); WBI ("}");
WBI ("");
end if;
end Gen_Finalize_Library_C; end Gen_Finalize_Library_C;
--------------------------------- ---------------------------------
@ -2124,15 +2239,10 @@ package body Bindgen is
---------------- ----------------
procedure Gen_Main_C is procedure Gen_Main_C is
Needs_Library_Finalization : constant Boolean :=
not Configurable_Run_Time_On_Target
and then Has_Finalizer;
-- For restricted run-time libraries (ZFP and Ravenscar) tasks are
-- non-terminating, so we do not want library-level finalization.
begin begin
if Exit_Status_Supported_On_Target then if Exit_Status_Supported_On_Target then
WBI ("#include <stdlib.h>"); WBI ("#include <stdlib.h>");
WBI ("");
Set_String ("int "); Set_String ("int ");
else else
Set_String ("void "); Set_String ("void ");
@ -2190,7 +2300,7 @@ package body Bindgen is
WBI (" gnat_argc = argc;"); WBI (" gnat_argc = argc;");
WBI (" gnat_argv = argv;"); WBI (" gnat_argv = argv;");
WBI (" gnat_envp = envp;"); WBI (" gnat_envp = envp;");
WBI (" "); WBI ("");
-- If configurable run-time, then nothing to do, since in this case -- If configurable run-time, then nothing to do, since in this case
-- the gnat_argc/argv/envp variables are entirely suppressed. -- the gnat_argc/argv/envp variables are entirely suppressed.
@ -2239,7 +2349,6 @@ package body Bindgen is
if not No_Main_Subprogram then if not No_Main_Subprogram then
WBI (" __gnat_break_start ();"); WBI (" __gnat_break_start ();");
WBI (" ");
-- Output main program name -- Output main program name
@ -2266,10 +2375,8 @@ package body Bindgen is
-- Call adafinal if finalization active -- Call adafinal if finalization active
if not Cumulative_Restrictions.Set (No_Finalization) if not Cumulative_Restrictions.Set (No_Finalization) then
and then Needs_Library_Finalization WBI (" " & Ada_Final_Name.all & " ();");
then
Gen_Finalize_Library_C;
end if; end if;
-- Outputs the dynamic stack measurement if needed -- Outputs the dynamic stack measurement if needed
@ -2798,29 +2905,29 @@ package body Bindgen is
"""__gnat_ada_main_program_name"");"); """__gnat_ada_main_program_name"");");
end if; end if;
if not Cumulative_Restrictions.Set (No_Finalization) then
WBI ("");
WBI (" procedure " & Ada_Final_Name.all & ";");
WBI (" pragma Export (C, " & Ada_Final_Name.all & ", """ &
Ada_Final_Name.all & """);");
end if;
WBI (""); WBI ("");
WBI (" procedure " & Ada_Init_Name.all & ";"); WBI (" procedure " & Ada_Init_Name.all & ";");
WBI (" pragma Export (C, " & Ada_Init_Name.all & ", """ & WBI (" pragma Export (C, " & Ada_Init_Name.all & ", """ &
Ada_Init_Name.all & """);"); Ada_Init_Name.all & """);");
-- If -a has been specified use pragma Linker_Constructor for the init -- If -a has been specified use pragma Linker_Constructor for the init
-- procedure. No need to use a similar pragma for the final procedure as -- procedure and pragma Linker_Destructor for the final procedure.
-- global finalization will occur when the executable finishes execution
-- and for plugins (shared stand-alone libraries that can be
-- "unloaded"), finalization should not occur automatically, otherwise
-- the main executable may not continue to work properly.
if Use_Pragma_Linker_Constructor then if Use_Pragma_Linker_Constructor then
WBI (" pragma Linker_Constructor (" & Ada_Init_Name.all & ");"); WBI (" pragma Linker_Constructor (" & Ada_Init_Name.all & ");");
end if; end if;
if not Cumulative_Restrictions.Set (No_Finalization) then
WBI ("");
WBI (" procedure " & Ada_Final_Name.all & ";");
WBI (" pragma Export (C, " & Ada_Final_Name.all & ", """ &
Ada_Final_Name.all & """);");
if Use_Pragma_Linker_Constructor then
WBI (" pragma Linker_Destructor (" & Ada_Final_Name.all & ");");
end if;
end if;
if Bind_Main_Program and then VM_Target = No_VM then if Bind_Main_Program and then VM_Target = No_VM then
-- If we have the standard library, then Break_Start is defined -- If we have the standard library, then Break_Start is defined
@ -2933,6 +3040,10 @@ package body Bindgen is
WBI (""); WBI ("");
WBI ("package body " & Ada_Main & " is"); WBI ("package body " & Ada_Main & " is");
WBI (" pragma Warnings (Off);"); WBI (" pragma Warnings (Off);");
WBI ("");
-- Generate externals for elaboration entities
Gen_Elab_Externals_Ada;
if not Suppress_Standard_Library_On_Target then if not Suppress_Standard_Library_On_Target then
@ -2964,11 +3075,11 @@ package body Bindgen is
-- Generate the adafinal routine unless there is no finalization to do -- Generate the adafinal routine unless there is no finalization to do
if not Cumulative_Restrictions.Set (No_Finalization) then if not Cumulative_Restrictions.Set (No_Finalization) then
Gen_Adafinal_Ada;
if Needs_Library_Finalization then if Needs_Library_Finalization then
Gen_Finalize_Library_Ada; Gen_Finalize_Library_Ada;
end if; end if;
Gen_Adafinal_Ada;
end if; end if;
Gen_Adainit_Ada; Gen_Adainit_Ada;
@ -3019,14 +3130,8 @@ package body Bindgen is
Resolve_Binder_Options; Resolve_Binder_Options;
WBI ("extern void " & Ada_Final_Name.all & " (void);");
-- If -a has been specified use __attribute__((constructor)) for the -- If -a has been specified use __attribute__((constructor)) for the
-- init procedure. No need to use a similar featute for the final -- init procedure and __attribute__((destructor)) for the final one.
-- procedure as global finalization will occur when the executable
-- finishes execution and for plugins (shared stand-alone libraries that
-- can be "unloaded"), finalization should not occur automatically,
-- otherwise the main executable may not continue to work properly.
if Use_Pragma_Linker_Constructor then if Use_Pragma_Linker_Constructor then
WBI ("extern void " & Ada_Init_Name.all & WBI ("extern void " & Ada_Init_Name.all &
@ -3035,6 +3140,15 @@ package body Bindgen is
WBI ("extern void " & Ada_Init_Name.all & " (void);"); WBI ("extern void " & Ada_Init_Name.all & " (void);");
end if; end if;
if not Cumulative_Restrictions.Set (No_Finalization) then
if Use_Pragma_Linker_Constructor then
WBI ("extern void " & Ada_Final_Name.all &
" (void) __attribute__((destructor));");
else
WBI ("extern void " & Ada_Final_Name.all & " (void);");
end if;
end if;
WBI ("extern void system__standard_library__adafinal (void);"); WBI ("extern void system__standard_library__adafinal (void);");
if not No_Main_Subprogram then if not No_Main_Subprogram then
@ -3099,29 +3213,15 @@ package body Bindgen is
WBI (""); WBI ("");
-- Generate externals for elaboration entities
Gen_Elab_Externals_C;
Gen_Elab_Defs_C; Gen_Elab_Defs_C;
if Needs_Library_Finalization then if Needs_Library_Finalization then
Gen_Finalize_Library_Defs_C; Gen_Finalize_Library_Defs_C;
end if; end if;
-- Imported variables used only when we have a runtime
if not Suppress_Standard_Library_On_Target then
-- Track elaboration/finalization phase
WBI ("extern int __gnat_handler_installed;");
WBI ("");
-- Track feature enable/disable on VMS
if OpenVMS_On_Target then
WBI ("extern int __gnat_features_set;");
WBI ("");
end if;
end if;
-- Write argv/argc exit status stuff if main program case -- Write argv/argc exit status stuff if main program case
if Bind_Main_Program then if Bind_Main_Program then
@ -3174,8 +3274,8 @@ package body Bindgen is
-- (for the debugger to get initial control) is defined in this file. -- (for the debugger to get initial control) is defined in this file.
if Suppress_Standard_Library_On_Target then if Suppress_Standard_Library_On_Target then
WBI ("");
WBI ("void __gnat_break_start (void) {}"); WBI ("void __gnat_break_start (void) {}");
WBI ("");
end if; end if;
-- Generate the __gnat_version and __gnat_ada_main_program_name info -- Generate the __gnat_version and __gnat_ada_main_program_name info
@ -3184,7 +3284,6 @@ package body Bindgen is
-- when a C program uses 2 Ada libraries) -- when a C program uses 2 Ada libraries)
if Bind_Main_Program then if Bind_Main_Program then
WBI ("");
WBI ("char __gnat_version[] = """ & Ver_Prefix & WBI ("char __gnat_version[] = """ & Ver_Prefix &
Gnat_Version_String & """;"); Gnat_Version_String & """;");
@ -3193,12 +3292,16 @@ package body Bindgen is
Set_Main_Program_Name; Set_Main_Program_Name;
Set_String (""";"); Set_String (""";");
Write_Statement_Buffer; Write_Statement_Buffer;
WBI ("");
end if; end if;
-- Generate the adafinal routine. In no runtime mode, this is not -- Generate the adafinal routine unless there is no finalization to do
-- needed, since there is no finalization to do.
if not Cumulative_Restrictions.Set (No_Finalization) then if not Cumulative_Restrictions.Set (No_Finalization) then
if Needs_Library_Finalization then
Gen_Finalize_Library_C;
end if;
Gen_Adafinal_C; Gen_Adafinal_C;
end if; end if;

View File

@ -3463,7 +3463,7 @@ package body Checks is
if Enable_Overflow_Checks if Enable_Overflow_Checks
and then not Is_Entity_Name (N) and then not Is_Entity_Name (N)
and then (Lor < Lo or else Hir > Hi) and then (Lor < Lo or else Hir > Hi)
then then
OK := False; OK := False;
return; return;

View File

@ -934,32 +934,34 @@ package Einfo is
-- to the spec as possible. -- to the spec as possible.
-- Elaboration_Entity (Node13) -- Elaboration_Entity (Node13)
-- Present in generic and non-generic package and subprogram -- Present in generic and non-generic package and subprogram entities.
-- entities. This is a boolean entity associated with the unit that -- This is a counter associated with the unit that is initially set to
-- is initially set to False, and is set True when the unit is -- zero, is incremented when an elaboration request for the unit is
-- elaborated. This is used for two purposes. First, it is used to -- made, and is decremented when a finalization request for the unit
-- implement required access before elaboration checks (the flag -- is made. This is used for three purposes. First, it is used to
-- must be true to call a subprogram at elaboration time). Second, -- implement access before elaboration checks (the counter must be
-- it is used to guard against repeated execution of the generated -- non-zero to call a subprogram at elaboration time). Second, it is
-- elaboration code. -- used to guard against repeated execution of the elaboration code.
-- Third, it is used to ensure that the finalization code is executed
-- only after all clients have requested it.
-- --
-- Note that we always allocate this flag, and set this field, but -- Note that we always allocate this counter, and set this field, but
-- we do not always actually use it. It is only used if it is needed -- we do not always actually use it. It is only used if it is needed
-- for access-before-elaboration use (see Elaboration_Entity_Required -- for access before elaboration use (see Elaboration_Entity_Required
-- flag) or if either the spec or the body has elaboration code. If -- flag) or if either the spec or the body has elaboration code. If
-- neither of these two conditions holds, then the entity is still -- neither of these two conditions holds, then the entity is still
-- allocated (since we don't know early enough whether or not there -- allocated (since we don't know early enough whether or not there
-- is elaboration code), but is simply not used for any purpose. -- is elaboration code), but is simply not used for any purpose.
-- Elaboration_Entity_Required (Flag174) -- Elaboration_Entity_Required (Flag174)
-- Present in generics and non-generic package and subprogram -- Present in generic and non-generic package and subprogram entities.
-- entities. Set only if Elaboration_Entity is non-Empty to indicate -- Set only if Elaboration_Entity is non-Empty to indicate that the
-- that the boolean is required to be set even if there is no other -- counter is required to be non-zero even if there is no other
-- elaboration code. This occurs when the Elaboration_Entity flag -- elaboration code. This occurs when the Elaboration_Entity counter
-- is used for required access-before-elaboration checking. If the -- is used for access before elaboration checks. If the counter is
-- flag is only for preventing multiple execution of the elaboration -- only used to prevent multiple execution of the elaboration code,
-- code, then if there is no other elaboration code, obviously there -- then if there is no other elaboration code, obviously there is no
-- is no need to set the flag. -- need to set the flag.
-- Enclosing_Scope (Node18) -- Enclosing_Scope (Node18)
-- Present in labels. Denotes the innermost enclosing construct that -- Present in labels. Denotes the innermost enclosing construct that

View File

@ -1916,7 +1916,12 @@ package body Exp_Attr is
begin begin
if Present (Elaboration_Entity (Ent)) then if Present (Elaboration_Entity (Ent)) then
Rewrite (N, Rewrite (N,
New_Occurrence_Of (Elaboration_Entity (Ent), Loc)); Make_Op_Ne (Loc,
Left_Opnd =>
New_Occurrence_Of (Elaboration_Entity (Ent), Loc),
Right_Opnd =>
Make_Integer_Literal (Loc, Uint_0)));
Analyze_And_Resolve (N, Typ);
else else
Rewrite (N, New_Occurrence_Of (Standard_True, Loc)); Rewrite (N, New_Occurrence_Of (Standard_True, Loc));
end if; end if;

View File

@ -6,7 +6,7 @@
-- -- -- --
-- B o d y -- -- B o d y --
-- -- -- --
-- Copyright (C) 1997-2007, Free Software Foundation, Inc. -- -- Copyright (C) 1997-2011, Free Software Foundation, Inc. --
-- -- -- --
-- GNAT is free software; you can redistribute it and/or modify it under -- -- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- -- -- terms of the GNU General Public License as published by the Free Soft- --
@ -29,6 +29,7 @@ with Einfo; use Einfo;
with Exp_Util; use Exp_Util; with Exp_Util; use Exp_Util;
with Nmake; use Nmake; with Nmake; use Nmake;
with Sinfo; use Sinfo; with Sinfo; use Sinfo;
with Snames; use Snames;
with Stand; use Stand; with Stand; use Stand;
with Tbuild; use Tbuild; with Tbuild; use Tbuild;
@ -59,7 +60,9 @@ package body Exp_Ch12 is
Condition => Condition =>
Make_Op_Not (Loc, Make_Op_Not (Loc,
Right_Opnd => Right_Opnd =>
New_Occurrence_Of (Elaboration_Entity (Ent), Loc)), Make_Attribute_Reference (Loc,
Attribute_Name => Name_Elaborated,
Prefix => New_Occurrence_Of (Ent, Loc))),
Reason => PE_Access_Before_Elaboration)); Reason => PE_Access_Before_Elaboration));
end if; end if;
end Expand_N_Generic_Instantiation; end Expand_N_Generic_Instantiation;

View File

@ -2897,6 +2897,7 @@ package body Exp_Ch7 is
is is
A_Expr : Node_Id; A_Expr : Node_Id;
E_Decl : Node_Id; E_Decl : Node_Id;
Result : List_Id;
begin begin
if Restriction_Active (No_Exception_Propagation) then if Restriction_Active (No_Exception_Propagation) then
@ -2907,36 +2908,86 @@ package body Exp_Ch7 is
pragma Assert (Present (E_Id)); pragma Assert (Present (E_Id));
pragma Assert (Present (Raised_Id)); pragma Assert (Present (Raised_Id));
-- Generate: Result := New_List;
-- Exception_Identity (Get_Current_Excep.all.all) =
-- Standard'Abort_Signal'Identity; -- In certain scenarios, finalization can be triggered by an abort. If
-- the finalization itself fails and raises an exception, the resulting
-- Program_Error must be supressed and replaced by an abort signal. In
-- order to detect this scenario, save the state of entry into the
-- finalization code.
if Abort_Allowed then if Abort_Allowed then
A_Expr := declare
Make_Op_Eq (Loc, Temp_Id : constant Entity_Id := Make_Temporary (Loc, 'E');
Left_Opnd =>
Make_Function_Call (Loc, begin
Name => -- Generate:
New_Reference_To (RTE (RE_Exception_Identity), Loc), -- Temp : constant Exception_Occurrence_Access :=
Parameter_Associations => New_List ( -- Get_Current_Excep.all;
Make_Explicit_Dereference (Loc,
Prefix => Append_To (Result,
Make_Function_Call (Loc, Make_Object_Declaration (Loc,
Name => Defining_Identifier => Temp_Id,
Make_Explicit_Dereference (Loc, Constant_Present => True,
Prefix => Object_Definition =>
New_Reference_To New_Reference_To (RTE (RE_Exception_Occurrence_Access), Loc),
(RTE (RE_Get_Current_Excep), Loc)))))), Expression =>
Make_Function_Call (Loc,
Name =>
Make_Explicit_Dereference (Loc,
Prefix =>
New_Reference_To
(RTE (RE_Get_Current_Excep), Loc)))));
-- Generate:
-- Temp /= null
-- and then Exception_Identity (Temp.all) =
-- Standard'Abort_Signal'Identity;
A_Expr :=
Make_And_Then (Loc,
Left_Opnd =>
Make_Op_Ne (Loc,
Left_Opnd =>
New_Reference_To (Temp_Id, Loc),
Right_Opnd =>
Make_Null (Loc)),
Right_Opnd =>
Make_Op_Eq (Loc,
Left_Opnd =>
Make_Function_Call (Loc,
Name =>
New_Reference_To (RTE (RE_Exception_Identity), Loc),
Parameter_Associations => New_List (
Make_Explicit_Dereference (Loc,
Prefix =>
New_Reference_To (Temp_Id, Loc)))),
Right_Opnd =>
Make_Attribute_Reference (Loc,
Prefix =>
New_Reference_To (Stand.Abort_Signal, Loc),
Attribute_Name => Name_Identity)));
end;
-- No abort
Right_Opnd =>
Make_Attribute_Reference (Loc,
Prefix =>
New_Reference_To (Stand.Abort_Signal, Loc),
Attribute_Name => Name_Identity));
else else
A_Expr := New_Reference_To (Standard_False, Loc); A_Expr := New_Reference_To (Standard_False, Loc);
end if; end if;
-- Generate:
-- Abort_Id : constant Boolean := <A_Expr>;
Append_To (Result,
Make_Object_Declaration (Loc,
Defining_Identifier => Abort_Id,
Constant_Present => True,
Object_Definition =>
New_Reference_To (Standard_Boolean, Loc),
Expression => A_Expr));
-- Generate: -- Generate:
-- E_Id : Exception_Occurrence; -- E_Id : Exception_Occurrence;
@ -2947,30 +2998,20 @@ package body Exp_Ch7 is
New_Reference_To (RTE (RE_Exception_Occurrence), Loc)); New_Reference_To (RTE (RE_Exception_Occurrence), Loc));
Set_No_Initialization (E_Decl); Set_No_Initialization (E_Decl);
return Append_To (Result, E_Decl);
New_List (
-- Abort_Id -- Generate:
-- Raised_Id : Boolean := False;
Make_Object_Declaration (Loc, Append_To (Result,
Defining_Identifier => Abort_Id, Make_Object_Declaration (Loc,
Constant_Present => True, Defining_Identifier => Raised_Id,
Object_Definition => Object_Definition =>
New_Reference_To (Standard_Boolean, Loc), New_Reference_To (Standard_Boolean, Loc),
Expression => A_Expr), Expression =>
New_Reference_To (Standard_False, Loc)));
-- E_Id return Result;
E_Decl,
-- Raised_Id
Make_Object_Declaration (Loc,
Defining_Identifier => Raised_Id,
Object_Definition =>
New_Reference_To (Standard_Boolean, Loc),
Expression =>
New_Reference_To (Standard_False, Loc)));
end Build_Object_Declarations; end Build_Object_Declarations;
--------------------------- ---------------------------
@ -4600,9 +4641,12 @@ package body Exp_Ch7 is
-- controlled elements. Generate: -- controlled elements. Generate:
-- declare -- declare
-- Temp : constant Exception_Occurrence_Access :=
-- Get_Current_Excep.all;
-- Abort : constant Boolean := -- Abort : constant Boolean :=
-- Exception_Identity (Get_Current_Excep.all) = -- Temp /= null
-- Standard'Abort_Signal'Identity; -- and then Exception_Identity (Temp_Id.all) =
-- Standard'Abort_Signal'Identity;
-- <or> -- <or>
-- Abort : constant Boolean := False; -- no abort -- Abort : constant Boolean := False; -- no abort
@ -4653,9 +4697,12 @@ package body Exp_Ch7 is
-- exception -- exception
-- when others => -- when others =>
-- declare -- declare
-- Temp : constant Exception_Occurrence_Access :=
-- Get_Current_Excep.all;
-- Abort : constant Boolean := -- Abort : constant Boolean :=
-- Exception_Identity (Get_Current_Excep.all) = -- Temp /= null
-- Standard'Abort_Signal'Identity; -- and then Exception_Identity (Temp_Id.all) =
-- Standard'Abort_Signal'Identity;
-- <or> -- <or>
-- Abort : constant Boolean := False; -- no abort -- Abort : constant Boolean := False; -- no abort
-- E : Exception_Occurence; -- E : Exception_Occurence;
@ -5513,9 +5560,12 @@ package body Exp_Ch7 is
-- may have discriminants and contain variant parts. Generate: -- may have discriminants and contain variant parts. Generate:
-- declare -- declare
-- Temp : constant Exception_Occurrence_Access :=
-- Get_Current_Excep.all;
-- Abort : constant Boolean := -- Abort : constant Boolean :=
-- Exception_Identity (Get_Current_Excep.all) = -- Temp /= null
-- Standard'Abort_Signal'Identity; -- and then Exception_Identity (Temp_Id.all) =
-- Standard'Abort_Signal'Identity;
-- <or> -- <or>
-- Abort : constant Boolean := False; -- no abort -- Abort : constant Boolean := False; -- no abort
-- E : Exception_Occurence; -- E : Exception_Occurence;

View File

@ -6634,7 +6634,7 @@ package body Exp_Util is
Asn := Asn :=
Make_Assignment_Statement (Loc, Make_Assignment_Statement (Loc,
Name => New_Occurrence_Of (Ent, Loc), Name => New_Occurrence_Of (Ent, Loc),
Expression => New_Occurrence_Of (Standard_True, Loc)); Expression => Make_Integer_Literal (Loc, Uint_1));
if Nkind (Parent (N)) = N_Subunit then if Nkind (Parent (N)) = N_Subunit then
Insert_After (Corresponding_Stub (Parent (N)), Asn); Insert_After (Corresponding_Stub (Parent (N)), Asn);

View File

@ -1840,6 +1840,11 @@ package body Prj.Env is
Self.Path := new String'(Tmp.all & Path_Separator & Path); Self.Path := new String'(Tmp.all & Path_Separator & Path);
Free (Tmp); Free (Tmp);
end if; end if;
if Current_Verbosity = High then
Debug_Output ("Adding directories to Project_Path: """
& Path & '"');
end if;
end Add_Directories; end Add_Directories;
-------------------- --------------------

View File

@ -930,7 +930,9 @@ package body Prj.Nmsc is
Project_Path_For_Aggregate : Prj.Env.Project_Search_Path; Project_Path_For_Aggregate : Prj.Env.Project_Search_Path;
procedure Found_Project_File (Path : Path_Information; Rank : Natural); procedure Found_Project_File
(Path : Path_Information;
Rank : Natural);
-- Called for each project file aggregated by Project -- Called for each project file aggregated by Project
procedure Expand_Project_Files is procedure Expand_Project_Files is
@ -942,7 +944,10 @@ package body Prj.Nmsc is
-- Found_Project_File -- -- Found_Project_File --
------------------------ ------------------------
procedure Found_Project_File (Path : Path_Information; Rank : Natural) is procedure Found_Project_File
(Path : Path_Information;
Rank : Natural)
is
pragma Unreferenced (Rank); pragma Unreferenced (Rank);
begin begin
if Path.Name /= Project.Path.Name then if Path.Name /= Project.Path.Name then
@ -5041,8 +5046,8 @@ package body Prj.Nmsc is
Remove_Source_Dirs : Boolean := False; Remove_Source_Dirs : Boolean := False;
procedure Add_To_Or_Remove_From_Source_Dirs procedure Add_To_Or_Remove_From_Source_Dirs
(Path : Path_Information; (Path : Path_Information;
Rank : Natural); Rank : Natural);
-- When Removed = False, the directory Path_Id to the list of -- When Removed = False, the directory Path_Id to the list of
-- source_dirs if not already in the list. When Removed = True, -- source_dirs if not already in the list. When Removed = True,
-- removed directory Path_Id if in the list. -- removed directory Path_Id if in the list.
@ -5055,8 +5060,8 @@ package body Prj.Nmsc is
--------------------------------------- ---------------------------------------
procedure Add_To_Or_Remove_From_Source_Dirs procedure Add_To_Or_Remove_From_Source_Dirs
(Path : Path_Information; (Path : Path_Information;
Rank : Natural) Rank : Natural)
is is
List : String_List_Id; List : String_List_Id;
Prev : String_List_Id; Prev : String_List_Id;
@ -5310,9 +5315,9 @@ package body Prj.Nmsc is
Remove_Source_Dirs := False; Remove_Source_Dirs := False;
Add_To_Or_Remove_From_Source_Dirs Add_To_Or_Remove_From_Source_Dirs
(Path => (Name => Project.Directory.Name, (Path => (Name => Project.Directory.Name,
Display_Name => Project.Directory.Display_Name), Display_Name => Project.Directory.Display_Name),
Rank => 1); Rank => 1);
else else
Remove_Source_Dirs := False; Remove_Source_Dirs := False;

View File

@ -28,6 +28,7 @@ with Opt; use Opt;
with Osint; use Osint; with Osint; use Osint;
with Output; use Output; with Output; use Output;
with Prj.Attr; use Prj.Attr; with Prj.Attr; use Prj.Attr;
with Prj.Env;
with Prj.Err; use Prj.Err; with Prj.Err; use Prj.Err;
with Prj.Ext; use Prj.Ext; with Prj.Ext; use Prj.Ext;
with Prj.Nmsc; use Prj.Nmsc; with Prj.Nmsc; use Prj.Nmsc;
@ -1971,10 +1972,6 @@ package body Prj.Proc is
& Get_Name_String (Index_Name) & ")", New_Value.Value); & Get_Name_String (Index_Name) & ")", New_Value.Value);
end if; end if;
end if; end if;
elsif Name = Snames.Name_Project_Path then
Debug_Output
("Defined project path");
end if; end if;
end Process_Expression_For_Associative_Array; end Process_Expression_For_Associative_Array;
@ -1987,11 +1984,10 @@ package body Prj.Proc is
New_Value : Variable_Value) New_Value : Variable_Value)
is is
Name : constant Name_Id := Name_Of (Current_Item, Node_Tree); Name : constant Name_Id := Name_Of (Current_Item, Node_Tree);
Var : Variable_Id := No_Variable;
Is_Attribute : constant Boolean := Is_Attribute : constant Boolean :=
Kind_Of (Current_Item, Node_Tree) = Kind_Of (Current_Item, Node_Tree) =
N_Attribute_Declaration; N_Attribute_Declaration;
Var : Variable_Id := No_Variable;
begin begin
-- First, find the list where to find the variable or attribute. -- First, find the list where to find the variable or attribute.
@ -2056,6 +2052,29 @@ package body Prj.Proc is
else else
Shared.Variable_Elements.Table (Var).Value := New_Value; Shared.Variable_Elements.Table (Var).Value := New_Value;
end if; end if;
if Name = Snames.Name_Project_Path then
if In_Tree.Is_Root_Tree then
declare
Val : String_List_Id := New_Value.Values;
begin
while Val /= Nil_String loop
Prj.Env.Add_Directories
(Child_Env.Project_Path,
Get_Name_String
(Shared.String_Elements.Table (Val).Value));
Val := Shared.String_Elements.Table (Val).Next;
end loop;
end;
else
if Current_Verbosity = High then
Debug_Output
("'for Project_Path' has no effect except in"
& " root aggregate");
end if;
end if;
end if;
end Process_Expression_Variable_Decl; end Process_Expression_Variable_Decl;
------------------------ ------------------------

View File

@ -504,6 +504,7 @@ package Rtsfind is
RE_Exception_Message, -- Ada.Exceptions RE_Exception_Message, -- Ada.Exceptions
RE_Exception_Name_Simple, -- Ada.Exceptions RE_Exception_Name_Simple, -- Ada.Exceptions
RE_Exception_Occurrence, -- Ada.Exceptions RE_Exception_Occurrence, -- Ada.Exceptions
RE_Exception_Occurrence_Access, -- Ada.Exceptions
RE_Null_Id, -- Ada.Exceptions RE_Null_Id, -- Ada.Exceptions
RE_Null_Occurrence, -- Ada.Exceptions RE_Null_Occurrence, -- Ada.Exceptions
RE_Poll, -- Ada.Exceptions RE_Poll, -- Ada.Exceptions
@ -1682,6 +1683,7 @@ package Rtsfind is
RE_Exception_Message => Ada_Exceptions, RE_Exception_Message => Ada_Exceptions,
RE_Exception_Name_Simple => Ada_Exceptions, RE_Exception_Name_Simple => Ada_Exceptions,
RE_Exception_Occurrence => Ada_Exceptions, RE_Exception_Occurrence => Ada_Exceptions,
RE_Exception_Occurrence_Access => Ada_Exceptions,
RE_Null_Id => Ada_Exceptions, RE_Null_Id => Ada_Exceptions,
RE_Null_Occurrence => Ada_Exceptions, RE_Null_Occurrence => Ada_Exceptions,
RE_Poll => Ada_Exceptions, RE_Poll => Ada_Exceptions,

View File

@ -295,9 +295,6 @@ package body Sem_Attr is
procedure Check_Integer_Type; procedure Check_Integer_Type;
-- Verify that prefix of attribute N is an integer type -- Verify that prefix of attribute N is an integer type
procedure Check_Library_Unit;
-- Verify that prefix of attribute N is a library unit
procedure Check_Modular_Integer_Type; procedure Check_Modular_Integer_Type;
-- Verify that prefix of attribute N is a modular integer type -- Verify that prefix of attribute N is a modular integer type
@ -344,8 +341,8 @@ package body Sem_Attr is
-- itself of the form of a library unit name. Note that this is -- itself of the form of a library unit name. Note that this is
-- quite different from Check_Program_Unit, since it only checks -- quite different from Check_Program_Unit, since it only checks
-- the syntactic form of the name, not the semantic identity. This -- the syntactic form of the name, not the semantic identity. This
-- is because it is used with attributes (Elab_Body, Elab_Spec, and -- is because it is used with attributes (Elab_Body, Elab_Spec,
-- UET_Address) which can refer to non-visible unit. -- UET_Address and Elaborated) which can refer to non-visible unit.
procedure Error_Attr (Msg : String; Error_Node : Node_Id); procedure Error_Attr (Msg : String; Error_Node : Node_Id);
pragma No_Return (Error_Attr); pragma No_Return (Error_Attr);
@ -1302,17 +1299,6 @@ package body Sem_Attr is
end if; end if;
end Check_Integer_Type; end Check_Integer_Type;
------------------------
-- Check_Library_Unit --
------------------------
procedure Check_Library_Unit is
begin
if not Is_Compilation_Unit (Entity (P)) then
Error_Attr_P ("prefix of % attribute must be library unit");
end if;
end Check_Library_Unit;
-------------------------------- --------------------------------
-- Check_Modular_Integer_Type -- -- Check_Modular_Integer_Type --
-------------------------------- --------------------------------
@ -1761,7 +1747,9 @@ package body Sem_Attr is
if Nkind (Nod) = N_Identifier then if Nkind (Nod) = N_Identifier then
return; return;
elsif Nkind (Nod) = N_Selected_Component then elsif Nkind (Nod) = N_Selected_Component
or else Nkind (Nod) = N_Expanded_Name
then
Check_Unit_Name (Prefix (Nod)); Check_Unit_Name (Prefix (Nod));
if Nkind (Selector_Name (Nod)) = N_Identifier then if Nkind (Selector_Name (Nod)) = N_Identifier then
@ -3003,7 +2991,7 @@ package body Sem_Attr is
when Attribute_Elaborated => when Attribute_Elaborated =>
Check_E0; Check_E0;
Check_Library_Unit; Check_Unit_Name (P);
Set_Etype (N, Standard_Boolean); Set_Etype (N, Standard_Boolean);
---------- ----------

View File

@ -55,6 +55,7 @@ with Snames; use Snames;
with Stand; use Stand; with Stand; use Stand;
with Table; with Table;
with Tbuild; use Tbuild; with Tbuild; use Tbuild;
with Uintp; use Uintp;
with Uname; use Uname; with Uname; use Uname;
package body Sem_Elab is package body Sem_Elab is
@ -2156,8 +2157,8 @@ package body Sem_Elab is
Make_Object_Declaration (Loce, Make_Object_Declaration (Loce,
Defining_Identifier => Ent, Defining_Identifier => Ent,
Object_Definition => Object_Definition =>
New_Occurrence_Of (Standard_Boolean, Loce), New_Occurrence_Of (Standard_Integer, Loce),
Expression => New_Occurrence_Of (Standard_False, Loce))); Expression => Make_Integer_Literal (Loc, Uint_0)));
-- Set elaboration flag at the point of the body -- Set elaboration flag at the point of the body
@ -2176,10 +2177,12 @@ package body Sem_Elab is
end; end;
end if; end if;
-- Generate check of the elaboration Boolean -- Generate check of the elaboration counter
Insert_Elab_Check (N, Insert_Elab_Check (N,
New_Occurrence_Of (Elaboration_Entity (E), Loc)); Make_Attribute_Reference (Loc,
Attribute_Name => Name_Elaborated,
Prefix => New_Occurrence_Of (E, Loc)));
end if; end if;
-- Generate the warning -- Generate the warning
@ -2419,7 +2422,7 @@ package body Sem_Elab is
not Restriction_Active (No_Entry_Calls_In_Elaboration_Code) not Restriction_Active (No_Entry_Calls_In_Elaboration_Code)
then then
-- Runtime elaboration check required. Generate check of the -- Runtime elaboration check required. Generate check of the
-- elaboration Boolean for the unit containing the entity. -- elaboration counter for the unit containing the entity.
Insert_Elab_Check (N, Insert_Elab_Check (N,
Make_Attribute_Reference (Loc, Make_Attribute_Reference (Loc,

View File

@ -964,9 +964,9 @@ package body Sem_Util is
Make_Object_Declaration (Loc, Make_Object_Declaration (Loc,
Defining_Identifier => Elab_Ent, Defining_Identifier => Elab_Ent,
Object_Definition => Object_Definition =>
New_Occurrence_Of (Standard_Boolean, Loc), New_Occurrence_Of (Standard_Integer, Loc),
Expression => Expression =>
New_Occurrence_Of (Standard_False, Loc)); Make_Integer_Literal (Loc, Uint_0));
Push_Scope (Standard_Standard); Push_Scope (Standard_Standard);
Add_Global_Declaration (Decl); Add_Global_Declaration (Decl);

View File

@ -136,7 +136,7 @@ package Sem_Util is
-- discriminants, and build actual subtype for it if so. -- discriminants, and build actual subtype for it if so.
procedure Build_Elaboration_Entity (N : Node_Id; Spec_Id : Entity_Id); procedure Build_Elaboration_Entity (N : Node_Id; Spec_Id : Entity_Id);
-- Given a compilation unit node N, allocate an elaboration boolean for -- Given a compilation unit node N, allocate an elaboration counter for
-- the compilation unit, and install it in the Elaboration_Entity field -- the compilation unit, and install it in the Elaboration_Entity field
-- of Spec_Id, the entity for the compilation unit. -- of Spec_Id, the entity for the compilation unit.