Commit 354ae449 by Arnaud Charlet

[multiple changes]

2017-01-13  Javier Miranda  <miranda@adacore.com>

	* einfo.ads (Component_Bit_Offset): Fix documentation.
	* sem_ch13.adb (Check_Record_Representation_Clause): Skip check
	on record holes for components with unknown compile-time offsets.

2017-01-13  Bob Duff  <duff@adacore.com>

	* ali.ads, ali.adb (Static_Elaboration_Model_Used): Remove unused flag.
	* g-locfil.ads: Minor comment fix.

2017-01-13  Bob Duff  <duff@adacore.com>

	* binde.adb (Elab_New): New elaboration order algorithm
	that is expected to cause fewer ABE issues. This is a work in
	progress. The new algorithm is currently disabled, and can be
	enable by the -dp switch, or by modifying the Do_Old and Do_New
	etc. flags and rebuilding. Experimental code is included to
	compare the results of the old and new algorithms.
	* binde.ads: Use GNAT.Dynamic_Tables instead of Table, so we
	can have multiple of these tables, so the old and new algorithms
	can coexist.
	* bindgen.ads (Gen_Output_File): Pass Elab_Order as an 'in'
	parameter of type array. This avoids the global variable, and
	allows bounds checking (which is normally defeated by the tables
	packages). It also ensures that the Elab_Order is read-only
	to Bindgen.
	* bindgen.adb: Pass Elab_Order as an 'in' parameter to all
	subprograms that need it, as above.
	* debug.adb: Document new -dp switch. Modify doc of old -do
	switch.
	* gnatbind.adb (Gnatbind): Make use of new interfaces to Binde
	and Bindgen.  Move writing of closure (-R and -Ra switches)
	to Binde; that's more convenient.

2017-01-13  Ed Schonberg  <schonberg@adacore.com>

	* sem_ch6.adb (Analyze_Expression_Function): If the expression
	function is a completion, all entities referenced in the
	expression are frozen. As a consequence, a reference to an
	uncompleted private type from an enclosing scope is illegal.

From-SVN: r244419
parent 448a1eb3
2017-01-13 Javier Miranda <miranda@adacore.com> 2017-01-13 Javier Miranda <miranda@adacore.com>
* einfo.ads (Component_Bit_Offset): Fix documentation.
* sem_ch13.adb (Check_Record_Representation_Clause): Skip check
on record holes for components with unknown compile-time offsets.
2017-01-13 Bob Duff <duff@adacore.com>
* ali.ads, ali.adb (Static_Elaboration_Model_Used): Remove unused flag.
* g-locfil.ads: Minor comment fix.
2017-01-13 Bob Duff <duff@adacore.com>
* binde.adb (Elab_New): New elaboration order algorithm
that is expected to cause fewer ABE issues. This is a work in
progress. The new algorithm is currently disabled, and can be
enable by the -dp switch, or by modifying the Do_Old and Do_New
etc. flags and rebuilding. Experimental code is included to
compare the results of the old and new algorithms.
* binde.ads: Use GNAT.Dynamic_Tables instead of Table, so we
can have multiple of these tables, so the old and new algorithms
can coexist.
* bindgen.ads (Gen_Output_File): Pass Elab_Order as an 'in'
parameter of type array. This avoids the global variable, and
allows bounds checking (which is normally defeated by the tables
packages). It also ensures that the Elab_Order is read-only
to Bindgen.
* bindgen.adb: Pass Elab_Order as an 'in' parameter to all
subprograms that need it, as above.
* debug.adb: Document new -dp switch. Modify doc of old -do
switch.
* gnatbind.adb (Gnatbind): Make use of new interfaces to Binde
and Bindgen. Move writing of closure (-R and -Ra switches)
to Binde; that's more convenient.
2017-01-13 Ed Schonberg <schonberg@adacore.com>
* sem_ch6.adb (Analyze_Expression_Function): If the expression
function is a completion, all entities referenced in the
expression are frozen. As a consequence, a reference to an
uncompleted private type from an enclosing scope is illegal.
2017-01-13 Javier Miranda <miranda@adacore.com>
* sem_ch6.adb (Freeze_Expr_Types): New subprogram. * sem_ch6.adb (Freeze_Expr_Types): New subprogram.
(Analyze_Subprogram_Body_Helper): At the occurrence of an (Analyze_Subprogram_Body_Helper): At the occurrence of an
expression function declaration that is a completion, its expression function declaration that is a completion, its
......
...@@ -116,7 +116,6 @@ package body ALI is ...@@ -116,7 +116,6 @@ package body ALI is
Partition_Elaboration_Policy_Specified := ' '; Partition_Elaboration_Policy_Specified := ' ';
Queuing_Policy_Specified := ' '; Queuing_Policy_Specified := ' ';
SSO_Default_Specified := False; SSO_Default_Specified := False;
Static_Elaboration_Model_Used := False;
Task_Dispatching_Policy_Specified := ' '; Task_Dispatching_Policy_Specified := ' ';
Unreserve_All_Interrupts_Specified := False; Unreserve_All_Interrupts_Specified := False;
Frontend_Exceptions_Specified := False; Frontend_Exceptions_Specified := False;
...@@ -1996,14 +1995,6 @@ package body ALI is ...@@ -1996,14 +1995,6 @@ package body ALI is
Skip_Eol; Skip_Eol;
-- Check if static elaboration model used
if not Units.Table (Units.Last).Dynamic_Elab
and then not Units.Table (Units.Last).Internal
then
Static_Elaboration_Model_Used := True;
end if;
C := Getc; C := Getc;
-- Scan out With lines for this unit -- Scan out With lines for this unit
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- S p e c -- -- S p e c --
-- -- -- --
-- Copyright (C) 1992-2015, Free Software Foundation, Inc. -- -- Copyright (C) 1992-2016, 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- --
...@@ -523,11 +523,6 @@ package ALI is ...@@ -523,11 +523,6 @@ package ALI is
-- Set to True if at least one ALI file contains '-fstack-check' in its -- Set to True if at least one ALI file contains '-fstack-check' in its
-- argument list. -- argument list.
Static_Elaboration_Model_Used : Boolean := False;
-- Set to False by Initialize_ALI. Set to True if any ALI file for a
-- non-internal unit compiled with the static elaboration model is
-- encountered.
Task_Dispatching_Policy_Specified : Character := ' '; Task_Dispatching_Policy_Specified : Character := ' ';
-- Set to blank by Initialize_ALI. Set to the appropriate task dispatching -- Set to blank by Initialize_ALI. Set to the appropriate task dispatching
-- policy character if an ali file contains a P line setting the -- policy character if an ali file contains a P line setting the
......
...@@ -23,30 +23,38 @@ ...@@ -23,30 +23,38 @@
-- -- -- --
------------------------------------------------------------------------------ ------------------------------------------------------------------------------
-- This package contains the routines to determine elaboration order -- This package contains the routine that determines library-level elaboration
-- order.
with ALI; use ALI; with ALI; use ALI;
with Table; with Namet; use Namet;
with Types; use Types; with Types; use Types;
with GNAT.Dynamic_Tables;
package Binde is package Binde is
-- The following table records the chosen elaboration order. It is used package Unit_Id_Tables is new GNAT.Dynamic_Tables
-- by Gen_Elab_Calls to generate the sequence of elaboration calls. Note (Table_Component_Type => Unit_Id,
-- that units are included in this table even if they have no elaboration Table_Index_Type => Nat,
Table_Low_Bound => 1,
Table_Initial => 500,
Table_Increment => 200);
use Unit_Id_Tables;
subtype Unit_Id_Table is Unit_Id_Tables.Instance;
subtype Unit_Id_Array is Unit_Id_Tables.Table_Type;
procedure Find_Elab_Order
(Elab_Order : out Unit_Id_Table;
First_Main_Lib_File : File_Name_Type);
-- Determine elaboration order.
--
-- The Elab_Order table records the chosen elaboration order. It is used by
-- Gen_Elab_Calls to generate the sequence of elaboration calls. Note that
-- units are included in this table even if they have no elaboration
-- routine, since the table is also used to drive the generation of object -- routine, since the table is also used to drive the generation of object
-- files in the binder output. Gen_Elab_Calls skips any units that have no -- files in the binder output. Gen_Elab_Calls skips any units that have no
-- elaboration routine. -- elaboration routine.
package Elab_Order is new Table.Table (
Table_Component_Type => Unit_Id,
Table_Index_Type => Nat,
Table_Low_Bound => 1,
Table_Initial => 500,
Table_Increment => 200,
Table_Name => "Elab_Order");
procedure Find_Elab_Order;
-- Determine elaboration order
end Binde; end Binde;
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- S p e c -- -- S p e c --
-- -- -- --
-- Copyright (C) 1992-2015, Free Software Foundation, Inc. -- -- Copyright (C) 1992-2016, 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- --
...@@ -32,9 +32,13 @@ ...@@ -32,9 +32,13 @@
-- See the body for exact details of the file that is generated -- See the body for exact details of the file that is generated
with Binde; use Binde;
package Bindgen is package Bindgen is
procedure Gen_Output_File (Filename : String); procedure Gen_Output_File
(Filename : String;
Elab_Order : Unit_Id_Array);
-- Filename is the full path name of the binder output file -- Filename is the full path name of the binder output file
procedure Set_Bind_Env (Key, Value : String); procedure Set_Bind_Env (Key, Value : String);
......
...@@ -181,14 +181,14 @@ package body Debug is ...@@ -181,14 +181,14 @@ package body Debug is
-- dl -- dl
-- dm -- dm
-- dn List details of manipulation of Num_Pred values -- dn List details of manipulation of Num_Pred values
-- do Use old preference for elaboration order -- do Use older preference for elaboration order
-- dp -- dp Use new preference for elaboration order
-- dq -- dq
-- dr -- dr
-- ds -- ds
-- dt -- dt
-- du List units as they are acquired -- du List units as they are acquired
-- dv -- dv Verbose debugging printouts
-- dw -- dw
-- dx Force binder to read xref information from ali files -- dx Force binder to read xref information from ali files
-- dy -- dy
...@@ -809,14 +809,25 @@ package body Debug is ...@@ -809,14 +809,25 @@ package body Debug is
-- the algorithm used to determine a correct order of elaboration. This -- the algorithm used to determine a correct order of elaboration. This
-- is useful in diagnosing any problems in its behavior. -- is useful in diagnosing any problems in its behavior.
-- do Use old elaboration order preference. The new preference rules -- do Use older elaboration order preference. The new preference rules
-- prefer specs with no bodies to specs with bodies, and between two -- prefer specs with no bodies to specs with bodies, and between two
-- specs with bodies, prefers the one whose body is closer to being -- specs with bodies, prefers the one whose body is closer to being
-- able to be elaborated. This is a clear improvement, but we provide -- able to be elaborated. This is a clear improvement, but we provide
-- this debug flag in case of regressions. -- this debug flag in case of regressions.
-- dp Use new elaboration order preference. The new preference rules
-- elaborate all units within a strongly connected component together,
-- with no other units in between. In particular, if a spec/body pair
-- can be elaborated together, it will be. In the new order, the binder
-- behaves as if every pragma Elaborate_All that would be legal is
-- present, even if it does not appear in the source code. NOTE: We
-- intend to reverse the sense of this switch at some point, so the new
-- preference is the default.
-- du List unit name and file name for each unit as it is read in -- du List unit name and file name for each unit as it is read in
-- dv Verbose debugging printouts
-- dx Force the binder to read (and then ignore) the xref information -- dx Force the binder to read (and then ignore) the xref information
-- in ali files (used to check that read circuit is working OK). -- in ali files (used to check that read circuit is working OK).
......
...@@ -670,14 +670,13 @@ package Einfo is ...@@ -670,14 +670,13 @@ package Einfo is
-- stored in a non-standard way, see body for details. -- stored in a non-standard way, see body for details.
-- Component_Bit_Offset (Uint11) -- Component_Bit_Offset (Uint11)
-- Defined in record components (E_Component, E_Discriminant) if a -- Defined in record components (E_Component, E_Discriminant). First
-- component clause applies to the component. First bit position of -- bit position of given component, computed from the first bit and
-- given component, computed from the first bit and position values -- position values given in the component clause. A value of No_Uint
-- given in the component clause. A value of No_Uint means that the -- means that the value is not yet known. The value can be set by the
-- value is not yet known. The value can be set by the appearance of -- appearance of an explicit component clause in a record representation
-- an explicit component clause in a record representation clause, -- clause, or it can be set by the front-end in package Layout, or it can
-- or it can be set by the front-end in package Layout, or it can be -- be set by the backend. By the time backend processing is completed,
-- set by the backend. By the time backend processing is completed,
-- this field is always set. A negative value is used to represent -- this field is always set. A negative value is used to represent
-- a value which is not known at compile time, and must be computed -- a value which is not known at compile time, and must be computed
-- at run-time (this happens if fields of a record have variable -- at run-time (this happens if fields of a record have variable
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- S p e c -- -- S p e c --
-- -- -- --
-- Copyright (C) 1995-2010, AdaCore -- -- Copyright (C) 1995-2016, AdaCore --
-- -- -- --
-- 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- --
...@@ -39,7 +39,7 @@ package GNAT.Lock_Files is ...@@ -39,7 +39,7 @@ package GNAT.Lock_Files is
-- Exception raised if file cannot be locked -- Exception raised if file cannot be locked
subtype Path_Name is String; subtype Path_Name is String;
-- Pathname is used by all services provided in this unit to specified -- Pathname is used by all services provided in this unit to specify
-- directory name and file name. On DOS based systems both directory -- directory name and file name. On DOS based systems both directory
-- separators are handled (i.e. slash and backslash). -- separators are handled (i.e. slash and backslash).
......
...@@ -10374,15 +10374,26 @@ package body Sem_Ch13 is ...@@ -10374,15 +10374,26 @@ package body Sem_Ch13 is
Nbit := Sbit; Nbit := Sbit;
for J in 1 .. Ncomps loop for J in 1 .. Ncomps loop
CEnt := Comps (J); CEnt := Comps (J);
Error_Msg_Uint_1 := Component_Bit_Offset (CEnt) - Nbit;
if Error_Msg_Uint_1 > 0 then declare
Error_Msg_NE CBO : constant Uint := Component_Bit_Offset (CEnt);
("?H?^-bit gap before component&",
Component_Name (Component_Clause (CEnt)), CEnt); begin
end if; -- Skip components with unknown offsets
if CBO /= No_Uint and then CBO >= 0 then
Error_Msg_Uint_1 := CBO - Nbit;
Nbit := Component_Bit_Offset (CEnt) + Esize (CEnt); if Error_Msg_Uint_1 > 0 then
Error_Msg_NE
("?H?^-bit gap before component&",
Component_Name (Component_Clause (CEnt)),
CEnt);
end if;
Nbit := CBO + Esize (CEnt);
end if;
end;
end loop; end loop;
-- Process variant parts recursively if present -- Process variant parts recursively if present
......
...@@ -274,6 +274,7 @@ package body Sem_Ch6 is ...@@ -274,6 +274,7 @@ package body Sem_Ch6 is
New_Spec : Node_Id; New_Spec : Node_Id;
Orig_N : Node_Id; Orig_N : Node_Id;
Ret : Node_Id; Ret : Node_Id;
Ret_Type : Entity_Id;
Prev : Entity_Id; Prev : Entity_Id;
-- If the expression is a completion, Prev is the entity whose -- If the expression is a completion, Prev is the entity whose
...@@ -366,16 +367,34 @@ package body Sem_Ch6 is ...@@ -366,16 +367,34 @@ package body Sem_Ch6 is
then then
Set_Has_Completion (Prev, False); Set_Has_Completion (Prev, False);
Set_Is_Inlined (Prev); Set_Is_Inlined (Prev);
Ret_Type := Etype (Prev);
-- An expression function that is a completion freezes the -- An expression function that is a completion freezes the
-- expression. This means freezing the return type, and if it is -- expression. This means freezing the return type, and if it is an
-- an access type, freezing its designated type as well. -- access type, freezing its designated type as well.
-- Note that we cannot defer this freezing to the analysis of the -- Note that we cannot defer this freezing to the analysis of the
-- expression itself, because a freeze node might appear in a nested -- expression itself, because a freeze node might appear in a nested
-- scope, leading to an elaboration order issue in gigi. -- scope, leading to an elaboration order issue in gigi.
Freeze_Before (N, Etype (Prev)); -- An entity can only be frozen if it has a completion, so we must
-- check this explicitly. If it is declared elsewhere it will have
-- been frozen already, so only types declared in currently opend
-- scopes need to be tested.
if Ekind (Ret_Type) = E_Private_Type
and then In_Open_Scopes (Scope (Ret_Type))
and then not Is_Generic_Type (Ret_Type)
and then not Is_Frozen (Ret_Type)
and then No (Full_View (Ret_Type))
then
Error_Msg_NE
("premature use of private type&",
Result_Definition (Specification (N)), Ret_Type);
else
Freeze_Before (N, Ret_Type);
end if;
if Is_Access_Type (Etype (Prev)) then if Is_Access_Type (Etype (Prev)) then
Freeze_Before (N, Designated_Type (Etype (Prev))); Freeze_Before (N, Designated_Type (Etype (Prev)));
......
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