Commit ec225529 by Arnaud Charlet

[multiple changes]

2016-10-13  Hristian Kirtchev  <kirtchev@adacore.com>

	* sem_ch6.adb (Analyze_Expression_Function):
	Remove the aspects of the original expression function has been
	rewritten into a subprogram declaration or a body. Reinsert the
	aspects once they have been analyzed.

2016-10-13  Tristan Gingold  <gingold@adacore.com>

	* exp_ch9.adb (Expand_N_Asynchronous_Select): Return immediately
	on restricted profile.

2016-10-13  Javier Miranda  <miranda@adacore.com>

	* sem_prag.adb
	(Process_Compile_Time_Warning_Or_Error): Register the pragma
	for its validation after the backend has been called only if its
	expression has some occurrence of attributes 'size or 'alignment
	* table.ads (Release_Threshold): New formal.
	(Release): Adding documentation of its new functionality.
	* table.adb (Release): Extend its functionality with a
	Release_Threshold.
	* nlists.adb (Next_Node table): Set its Release_Threshold.
	* atree.adb (Orig_Nodes table): Set its Release_Threshold.
	* atree.ads (Nodes table): Set its Release_Threshold.
	(Flags table): Set its Release_Threshold.
	* alloc.ads (Nodes_Release_Threshold): New constant declaration.
	(Orig_Nodes_Release_Threshold): New constant declaration.
	* debug.adb (switch d.9): Left free.
	* gnat1drv.adb (Post_Compilation_Validation_Checks): Enable
	validation of pragmas Compile_Time_Error and Compile_Time_Warning.

From-SVN: r241117
parent 62c1b965
2016-10-13 Hristian Kirtchev <kirtchev@adacore.com> 2016-10-13 Hristian Kirtchev <kirtchev@adacore.com>
* sem_ch6.adb (Analyze_Expression_Function):
Remove the aspects of the original expression function has been
rewritten into a subprogram declaration or a body. Reinsert the
aspects once they have been analyzed.
2016-10-13 Tristan Gingold <gingold@adacore.com>
* exp_ch9.adb (Expand_N_Asynchronous_Select): Return immediately
on restricted profile.
2016-10-13 Javier Miranda <miranda@adacore.com>
* sem_prag.adb
(Process_Compile_Time_Warning_Or_Error): Register the pragma
for its validation after the backend has been called only if its
expression has some occurrence of attributes 'size or 'alignment
* table.ads (Release_Threshold): New formal.
(Release): Adding documentation of its new functionality.
* table.adb (Release): Extend its functionality with a
Release_Threshold.
* nlists.adb (Next_Node table): Set its Release_Threshold.
* atree.adb (Orig_Nodes table): Set its Release_Threshold.
* atree.ads (Nodes table): Set its Release_Threshold.
(Flags table): Set its Release_Threshold.
* alloc.ads (Nodes_Release_Threshold): New constant declaration.
(Orig_Nodes_Release_Threshold): New constant declaration.
* debug.adb (switch d.9): Left free.
* gnat1drv.adb (Post_Compilation_Validation_Checks): Enable
validation of pragmas Compile_Time_Error and Compile_Time_Warning.
2016-10-13 Hristian Kirtchev <kirtchev@adacore.com>
* sem_ch6.adb (Create_Extra_Formals): Generate * sem_ch6.adb (Create_Extra_Formals): Generate
an Itype reference for the object extra formal in case the an Itype reference for the object extra formal in case the
subprogram is called within the same or nested scope. subprogram is called within the same or nested scope.
......
...@@ -102,6 +102,7 @@ package Alloc is ...@@ -102,6 +102,7 @@ package Alloc is
Nodes_Initial : constant := 50_000; -- Atree Nodes_Initial : constant := 50_000; -- Atree
Nodes_Increment : constant := 100; Nodes_Increment : constant := 100;
Nodes_Release_Threshold : constant := 100_000;
Notes_Initial : constant := 100; -- Lib Notes_Initial : constant := 100; -- Lib
Notes_Increment : constant := 200; Notes_Increment : constant := 200;
...@@ -111,6 +112,7 @@ package Alloc is ...@@ -111,6 +112,7 @@ package Alloc is
Orig_Nodes_Initial : constant := 50_000; -- Atree Orig_Nodes_Initial : constant := 50_000; -- Atree
Orig_Nodes_Increment : constant := 100; Orig_Nodes_Increment : constant := 100;
Orig_Nodes_Release_Threshold : constant := 100_000;
Pending_Instantiations_Initial : constant := 10; -- Inline Pending_Instantiations_Initial : constant := 10; -- Inline
Pending_Instantiations_Increment : constant := 100; Pending_Instantiations_Increment : constant := 100;
......
...@@ -516,6 +516,7 @@ package body Atree is ...@@ -516,6 +516,7 @@ package body Atree is
Table_Low_Bound => First_Node_Id, Table_Low_Bound => First_Node_Id,
Table_Initial => Alloc.Orig_Nodes_Initial, Table_Initial => Alloc.Orig_Nodes_Initial,
Table_Increment => Alloc.Orig_Nodes_Increment, Table_Increment => Alloc.Orig_Nodes_Increment,
Release_Threshold => Alloc.Orig_Nodes_Release_Threshold,
Table_Name => "Orig_Nodes"); Table_Name => "Orig_Nodes");
-------------------------- --------------------------
......
...@@ -4206,6 +4206,7 @@ package Atree is ...@@ -4206,6 +4206,7 @@ package Atree is
Table_Low_Bound => First_Node_Id, Table_Low_Bound => First_Node_Id,
Table_Initial => Alloc.Nodes_Initial, Table_Initial => Alloc.Nodes_Initial,
Table_Increment => Alloc.Nodes_Increment, Table_Increment => Alloc.Nodes_Increment,
Release_Threshold => Alloc.Nodes_Release_Threshold,
Table_Name => "Nodes"); Table_Name => "Nodes");
-- The following is a parallel table to Nodes, which provides 8 more -- The following is a parallel table to Nodes, which provides 8 more
...@@ -4251,6 +4252,7 @@ package Atree is ...@@ -4251,6 +4252,7 @@ package Atree is
Table_Low_Bound => First_Node_Id, Table_Low_Bound => First_Node_Id,
Table_Initial => Alloc.Nodes_Initial, Table_Initial => Alloc.Nodes_Initial,
Table_Increment => Alloc.Nodes_Increment, Table_Increment => Alloc.Nodes_Increment,
Release_Threshold => Alloc.Nodes_Release_Threshold,
Table_Name => "Flags"); Table_Name => "Flags");
end Atree_Private_Part; end Atree_Private_Part;
......
...@@ -163,7 +163,7 @@ package body Debug is ...@@ -163,7 +163,7 @@ package body Debug is
-- d.6 -- d.6
-- d.7 -- d.7
-- d.8 -- d.8
-- d.9 Enable validation of pragma Compile_Time_[Error/Warning] -- d.9
-- Debug flags for binder (GNATBIND) -- Debug flags for binder (GNATBIND)
...@@ -774,10 +774,6 @@ package body Debug is ...@@ -774,10 +774,6 @@ package body Debug is
-- d.5 By default a subprogram imported generates a subprogram profile. -- d.5 By default a subprogram imported generates a subprogram profile.
-- This debug flag disables this generation when generating C code, -- This debug flag disables this generation when generating C code,
-- assuming a proper #include will be used instead. -- assuming a proper #include will be used instead.
--
-- d.9 Flag used temporarily to enable the validation of pragmas Compile_
-- Time_Error and Compile_Time_Warning after the back end has been
-- called.
------------------------------------------ ------------------------------------------
-- Documentation for Binder Debug Flags -- -- Documentation for Binder Debug Flags --
......
...@@ -7176,6 +7176,13 @@ package body Exp_Ch9 is ...@@ -7176,6 +7176,13 @@ package body Exp_Ch9 is
-- Start of processing for Expand_N_Asynchronous_Select -- Start of processing for Expand_N_Asynchronous_Select
begin begin
-- Asynchronous select is not supported on restricted runtimes. Don't
-- try to expand.
if Restricted_Profile then
return;
end if;
Process_Statements_For_Controlled_Objects (Trig); Process_Statements_For_Controlled_Objects (Trig);
Process_Statements_For_Controlled_Objects (Abrt); Process_Statements_For_Controlled_Objects (Abrt);
......
...@@ -875,18 +875,13 @@ procedure Gnat1drv is ...@@ -875,18 +875,13 @@ procedure Gnat1drv is
-- and alignment annotated by the backend where possible). We need to -- and alignment annotated by the backend where possible). We need to
-- unlock temporarily these tables to reanalyze their expression. -- unlock temporarily these tables to reanalyze their expression.
-- ??? temporarily disabled since it causes regressions with large Atree.Unlock;
-- sources Nlists.Unlock;
Sem.Unlock;
if Debug_Flag_Dot_9 then Sem_Ch13.Validate_Compile_Time_Warning_Errors;
Atree.Unlock; Sem.Lock;
Nlists.Unlock; Nlists.Lock;
Sem.Unlock; Atree.Lock;
Sem_Ch13.Validate_Compile_Time_Warning_Errors;
Sem.Lock;
Nlists.Lock;
Atree.Lock;
end if;
-- Validate unchecked conversions (using the values for size and -- Validate unchecked conversions (using the values for size and
-- alignment annotated by the backend where possible). -- alignment annotated by the backend where possible).
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- B o d y -- -- B o d y --
-- -- -- --
-- Copyright (C) 1992-2014, 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- --
...@@ -90,6 +90,7 @@ package body Nlists is ...@@ -90,6 +90,7 @@ package body Nlists is
Table_Low_Bound => First_Node_Id, Table_Low_Bound => First_Node_Id,
Table_Initial => Alloc.Orig_Nodes_Initial, Table_Initial => Alloc.Orig_Nodes_Initial,
Table_Increment => Alloc.Orig_Nodes_Increment, Table_Increment => Alloc.Orig_Nodes_Increment,
Release_Threshold => Alloc.Orig_Nodes_Release_Threshold,
Table_Name => "Next_Node"); Table_Name => "Next_Node");
package Prev_Node is new Table.Table ( package Prev_Node is new Table.Table (
......
...@@ -274,17 +274,17 @@ package body Sem_Ch6 is ...@@ -274,17 +274,17 @@ package body Sem_Ch6 is
LocX : constant Source_Ptr := Sloc (Expr); LocX : constant Source_Ptr := Sloc (Expr);
Spec : constant Node_Id := Specification (N); Spec : constant Node_Id := Specification (N);
Def_Id : Entity_Id; Asp : Node_Id;
Def_Id : Entity_Id;
New_Body : Node_Id;
New_Spec : Node_Id;
Orig_N : Node_Id;
Ret : Node_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
-- declaration is completed. Def_Id is needed to analyze the spec. -- declaration is completed. Def_Id is needed to analyze the spec.
New_Body : Node_Id;
New_Spec : Node_Id;
Ret : Node_Id;
Asp : Node_Id;
begin begin
-- This is one of the occasions on which we transform the tree during -- This is one of the occasions on which we transform the tree during
-- semantic analysis. If this is a completion, transform the expression -- semantic analysis. If this is a completion, transform the expression
...@@ -392,12 +392,11 @@ package body Sem_Ch6 is ...@@ -392,12 +392,11 @@ package body Sem_Ch6 is
Generate_Reference (Prev, Defining_Entity (N), 'b', Force => True); Generate_Reference (Prev, Defining_Entity (N), 'b', Force => True);
Rewrite (N, New_Body); Rewrite (N, New_Body);
-- Correct the parent pointer of the aspect specification list to -- Remove any existing aspects from the original node because the act
-- reference the rewritten node. -- of rewriting cases the list to be shared between the two nodes.
if Has_Aspects (N) then Orig_N := Original_Node (N);
Set_Parent (Aspect_Specifications (N), N); Remove_Aspects (Orig_N);
end if;
-- Propagate any pragmas that apply to the expression function to the -- Propagate any pragmas that apply to the expression function to the
-- proper body when the expression function acts as a completion. -- proper body when the expression function acts as a completion.
...@@ -406,6 +405,14 @@ package body Sem_Ch6 is ...@@ -406,6 +405,14 @@ package body Sem_Ch6 is
Relocate_Pragmas_To_Body (N); Relocate_Pragmas_To_Body (N);
Analyze (N); Analyze (N);
-- Once the aspects of the generated body has been analyzed, create a
-- copy for ASIS purposes and assciate it with the original node.
if Has_Aspects (N) then
Set_Aspect_Specifications (Orig_N,
New_Copy_List_Tree (Aspect_Specifications (N)));
end if;
-- Prev is the previous entity with the same name, but it is can -- Prev is the previous entity with the same name, but it is can
-- be an unrelated spec that is not completed by the expression -- be an unrelated spec that is not completed by the expression
-- function. In that case the relevant entity is the one in the body. -- function. In that case the relevant entity is the one in the body.
...@@ -451,15 +458,21 @@ package body Sem_Ch6 is ...@@ -451,15 +458,21 @@ package body Sem_Ch6 is
Rewrite (N, Make_Subprogram_Declaration (Loc, Specification => Spec)); Rewrite (N, Make_Subprogram_Declaration (Loc, Specification => Spec));
-- Correct the parent pointer of the aspect specification list to -- Remove any existing aspects from the original node because the act
-- reference the rewritten node. -- of rewriting cases the list to be shared between the two nodes.
if Has_Aspects (N) then Orig_N := Original_Node (N);
Set_Parent (Aspect_Specifications (N), N); Remove_Aspects (Orig_N);
end if;
Analyze (N); Analyze (N);
Def_Id := Defining_Entity (N);
-- Once the aspects of the generated spec has been analyzed, create a
-- copy for ASIS purposes and assciate it with the original node.
if Has_Aspects (N) then
Set_Aspect_Specifications (Orig_N,
New_Copy_List_Tree (Aspect_Specifications (N)));
end if;
-- If aspect SPARK_Mode was specified on the body, it needs to be -- If aspect SPARK_Mode was specified on the body, it needs to be
-- repeated both on the generated spec and the body. -- repeated both on the generated spec and the body.
...@@ -472,6 +485,8 @@ package body Sem_Ch6 is ...@@ -472,6 +485,8 @@ package body Sem_Ch6 is
Set_Aspect_Specifications (New_Body, New_List (Asp)); Set_Aspect_Specifications (New_Body, New_List (Asp));
end if; end if;
Def_Id := Defining_Entity (N);
-- Within a generic pre-analyze the original expression for name -- Within a generic pre-analyze the original expression for name
-- capture. The body is also generated but plays no role in -- capture. The body is also generated but plays no role in
-- this because it is not part of the original source. -- this because it is not part of the original source.
......
...@@ -7015,8 +7015,45 @@ package body Sem_Prag is ...@@ -7015,8 +7015,45 @@ package body Sem_Prag is
------------------------------------------- -------------------------------------------
procedure Process_Compile_Time_Warning_Or_Error is procedure Process_Compile_Time_Warning_Or_Error is
Validation_Needed : Boolean := False;
function Check_Node (N : Node_Id) return Traverse_Result;
-- Tree visitor that checks if N is an attribute reference that can
-- be statically computed by the backend. Validation_Needed is set
-- to True if found.
----------------
-- Check_Node --
----------------
function Check_Node (N : Node_Id) return Traverse_Result is
begin
if Nkind (N) = N_Attribute_Reference
and then Is_Entity_Name (Prefix (N))
then
declare
Attr_Id : constant Attribute_Id :=
Get_Attribute_Id (Attribute_Name (N));
begin
if Attr_Id = Attribute_Alignment
or else Attr_Id = Attribute_Size
then
Validation_Needed := True;
end if;
end;
end if;
return OK;
end Check_Node;
procedure Check_Expression is new Traverse_Proc (Check_Node);
-- Local variables
Arg1x : constant Node_Id := Get_Pragma_Arg (Arg1); Arg1x : constant Node_Id := Get_Pragma_Arg (Arg1);
-- Start of processing for Process_Compile_Time_Warning_Or_Error
begin begin
Check_Arg_Count (2); Check_Arg_Count (2);
Check_No_Identifiers; Check_No_Identifiers;
...@@ -7025,8 +7062,18 @@ package body Sem_Prag is ...@@ -7025,8 +7062,18 @@ package body Sem_Prag is
if Compile_Time_Known_Value (Arg1x) then if Compile_Time_Known_Value (Arg1x) then
Process_Compile_Time_Warning_Or_Error (N, Sloc (Arg1)); Process_Compile_Time_Warning_Or_Error (N, Sloc (Arg1));
-- Register the expression for its validation after the backend has
-- been called if it has occurrences of attributes size or alignment
-- (because they may be statically computed by the backend and hence
-- the whole expression needs to be re-evaluated).
else else
Sem_Ch13.Validate_Compile_Time_Warning_Error (N); Check_Expression (Arg1x);
if Validation_Needed then
Sem_Ch13.Validate_Compile_Time_Warning_Error (N);
end if;
end if; end if;
end Process_Compile_Time_Warning_Or_Error; end Process_Compile_Time_Warning_Or_Error;
...@@ -229,7 +229,6 @@ package body Table is ...@@ -229,7 +229,6 @@ package body Table is
Set_Standard_Output; Set_Standard_Output;
raise Unrecoverable_Error; raise Unrecoverable_Error;
end if; end if;
end Reallocate; end Reallocate;
------------- -------------
...@@ -237,9 +236,36 @@ package body Table is ...@@ -237,9 +236,36 @@ package body Table is
------------- -------------
procedure Release is procedure Release is
Extra_Length : Int;
Size : Memory.size_t;
begin begin
Length := Last_Val - Int (Table_Low_Bound) + 1; Length := Last_Val - Int (Table_Low_Bound) + 1;
Max := Last_Val; Size := Memory.size_t (Length) *
(Table_Type'Component_Size / Storage_Unit);
-- If the size of the table exceeds the release threshold then leave
-- space to store as many extra elements as 0.1% of the table length.
if Release_Threshold > 0
and then Size > Memory.size_t (Release_Threshold)
then
Extra_Length := Length / 1000;
Length := Length + Extra_Length;
Max := Int (Table_Low_Bound) + Length - 1;
if Debug_Flag_D then
Write_Str ("--> Release_Threshold reached (length=");
Write_Int (Int (Size));
Write_Str ("): leaving room space for ");
Write_Int (Extra_Length);
Write_Str (" components");
Write_Eol;
end if;
else
Max := Last_Val;
end if;
Reallocate; Reallocate;
end Release; end Release;
......
...@@ -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- --
...@@ -47,10 +47,11 @@ package Table is ...@@ -47,10 +47,11 @@ package Table is
type Table_Component_Type is private; type Table_Component_Type is private;
type Table_Index_Type is range <>; type Table_Index_Type is range <>;
Table_Low_Bound : Table_Index_Type; Table_Low_Bound : Table_Index_Type;
Table_Initial : Pos; Table_Initial : Pos;
Table_Increment : Nat; Table_Increment : Nat;
Table_Name : String; Table_Name : String;
Release_Threshold : Nat := 0;
package Table is package Table is
...@@ -151,9 +152,15 @@ package Table is ...@@ -151,9 +152,15 @@ package Table is
procedure Release; procedure Release;
-- Storage is allocated in chunks according to the values given in the -- Storage is allocated in chunks according to the values given in the
-- Initial and Increment parameters. A call to Release releases all -- Initial and Increment parameters. If Release_Threshold is 0 or the
-- storage that is allocated, but is not logically part of the current -- length of the table does not exceed this threshold then a call to
-- array value. Current array values are not affected by this call. -- Release releases all storage that is allocated, but is not logically
-- part of the current array value; otherwise the call to Release leaves
-- the current array value plus 0.1% of the current table length free
-- elements located at the end of the table (this parameter facilitates
-- reopening large tables and adding a few elements without allocating a
-- chunk of memory). In both cases current array values are not affected
-- by this call.
procedure Free; procedure Free;
-- Free all allocated memory for the table. A call to init is required -- Free all allocated memory for the table. A call to init is required
......
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