Commit 8434cfc7 by Arnaud Charlet

[multiple changes]

2015-10-16  Hristian Kirtchev  <kirtchev@adacore.com>

	* exp_ch6.adb (Make_Build_In_Place_Call_In_Object_Declaration):
	Indefinite or limited library level objects are now returned on
	the heap.
	* exp_ch7.adb (Build_Finalization_Master): Add formal
	parameter For_Lib_Level. Add context specific insertion for a
	finalization master created for an access result type related
	to a build-in-place function call used to initialize a library
	level object.
	* exp_ch7.ads (Build_Finalization_Master): Add formal parameter
	For_Lib_Level. Update the comment on usage.
	* sem_util.adb (Mark_Coextensions): Code cleanup.

2015-10-16  Emmanuel Briot  <briot@adacore.com>

	* prj.adb (For_Every_Project_Imported_Context): Fix handling
	of aggregated projects with duplicate names.
	* a-ngelfu.ads: Minor whitespace fix.

From-SVN: r228899
parent f99a9fea
2015-10-16 Hristian Kirtchev <kirtchev@adacore.com>
* exp_ch6.adb (Make_Build_In_Place_Call_In_Object_Declaration):
Indefinite or limited library level objects are now returned on
the heap.
* exp_ch7.adb (Build_Finalization_Master): Add formal
parameter For_Lib_Level. Add context specific insertion for a
finalization master created for an access result type related
to a build-in-place function call used to initialize a library
level object.
* exp_ch7.ads (Build_Finalization_Master): Add formal parameter
For_Lib_Level. Update the comment on usage.
* sem_util.adb (Mark_Coextensions): Code cleanup.
2015-10-16 Emmanuel Briot <briot@adacore.com>
* prj.adb (For_Every_Project_Imported_Context): Fix handling
of aggregated projects with duplicate names.
* a-ngelfu.ads: Minor whitespace fix.
2015-10-16 Ed Schonberg <schonberg@adacore.com> 2015-10-16 Ed Schonberg <schonberg@adacore.com>
* sem_ch13.adb (Build_Predicate_Functions): The expression for * sem_ch13.adb (Build_Predicate_Functions): The expression for
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- S p e c -- -- S p e c --
-- -- -- --
-- Copyright (C) 2012-2014, Free Software Foundation, Inc. -- -- Copyright (C) 2012-2015, Free Software Foundation, Inc. --
-- -- -- --
-- This specification is derived from the Ada Reference Manual for use with -- -- This specification is derived from the Ada Reference Manual for use with --
-- GNAT. The copyright notice above, and the license provisions that follow -- -- GNAT. The copyright notice above, and the license provisions that follow --
...@@ -61,8 +61,7 @@ package Ada.Numerics.Generic_Elementary_Functions is ...@@ -61,8 +61,7 @@ package Ada.Numerics.Generic_Elementary_Functions is
and then (if X >= Float_Type'Succ (0.0) then Sqrt'Result > 0.0); and then (if X >= Float_Type'Succ (0.0) then Sqrt'Result > 0.0);
function Log (X : Float_Type'Base) return Float_Type'Base function Log (X : Float_Type'Base) return Float_Type'Base with
with
Post => (if X = 1.0 then Log'Result = 0.0); Post => (if X = 1.0 then Log'Result = 0.0);
function Log (X, Base : Float_Type'Base) return Float_Type'Base with function Log (X, Base : Float_Type'Base) return Float_Type'Base with
......
...@@ -8921,13 +8921,13 @@ package body Exp_Ch6 is ...@@ -8921,13 +8921,13 @@ package body Exp_Ch6 is
end if; end if;
Add_Unconstrained_Actuals_To_Build_In_Place_Call Add_Unconstrained_Actuals_To_Build_In_Place_Call
(Func_Call, (Function_Call => Func_Call,
Function_Id, Function_Id => Function_Id,
Alloc_Form_Exp => Alloc_Form_Exp =>
New_Occurrence_Of New_Occurrence_Of
(Build_In_Place_Formal (Enclosing_Func, BIP_Alloc_Form), (Build_In_Place_Formal
Loc), (Enclosing_Func, BIP_Alloc_Form), Loc),
Pool_Actual => Pool_Actual); Pool_Actual => Pool_Actual);
-- Otherwise, if enclosing function has a definite result subtype, -- Otherwise, if enclosing function has a definite result subtype,
-- then caller allocation will be used. -- then caller allocation will be used.
...@@ -8979,6 +8979,35 @@ package body Exp_Ch6 is ...@@ -8979,6 +8979,35 @@ package body Exp_Ch6 is
Add_Unconstrained_Actuals_To_Build_In_Place_Call Add_Unconstrained_Actuals_To_Build_In_Place_Call
(Func_Call, Function_Id, Alloc_Form => Caller_Allocation); (Func_Call, Function_Id, Alloc_Form => Caller_Allocation);
-- The allocation for indefinite library level objects occurs on the
-- heap as opposed to the secondary stack. This accomodates DLLs where
-- the secondary stack is destroyed after each library unload. This is
-- a hybrid mechanism where a stack-allocated object lives on the heap.
elsif Is_Library_Level_Entity (Defining_Identifier (Object_Decl))
and then not Restriction_Active (No_Implicit_Heap_Allocations)
then
Add_Unconstrained_Actuals_To_Build_In_Place_Call
(Func_Call, Function_Id, Alloc_Form => Global_Heap);
Caller_Object := Empty;
-- Create a finalization master for the access result type to ensure
-- that the heap allocation can properly chain the object and later
-- finalize it when the library unit does out of scope.
if Needs_Finalization (Etype (Func_Call)) then
Build_Finalization_Master
(Typ => Ptr_Typ,
For_Lib_Level => True,
Insertion_Node => Ptr_Typ_Decl);
Fmaster_Actual :=
Make_Attribute_Reference (Loc,
Prefix =>
New_Occurrence_Of (Finalization_Master (Ptr_Typ), Loc),
Attribute_Name => Name_Unrestricted_Access);
end if;
-- In other indefinite cases, pass an indication to do the allocation -- In other indefinite cases, pass an indication to do the allocation
-- on the secondary stack and set Caller_Object to Empty so that a null -- on the secondary stack and set Caller_Object to Empty so that a null
-- value will be passed for the caller's object address. A transient -- value will be passed for the caller's object address. A transient
......
...@@ -763,6 +763,7 @@ package body Exp_Ch7 is ...@@ -763,6 +763,7 @@ package body Exp_Ch7 is
procedure Build_Finalization_Master procedure Build_Finalization_Master
(Typ : Entity_Id; (Typ : Entity_Id;
For_Anonymous : Boolean := False; For_Anonymous : Boolean := False;
For_Lib_Level : Boolean := False;
For_Private : Boolean := False; For_Private : Boolean := False;
Context_Scope : Entity_Id := Empty; Context_Scope : Entity_Id := Empty;
Insertion_Node : Node_Id := Empty) Insertion_Node : Node_Id := Empty)
...@@ -1039,6 +1040,15 @@ package body Exp_Ch7 is ...@@ -1039,6 +1040,15 @@ package body Exp_Ch7 is
Pop_Scope; Pop_Scope;
-- The finalization master belongs to an access result type related
-- to a build-in-place function call used to initialize a library
-- level object. The master must be inserted in front of the access
-- result type declaration denoted by Insertion_Node.
elsif For_Lib_Level then
pragma Assert (Present (Insertion_Node));
Insert_Actions (Insertion_Node, Actions);
-- Otherwise the finalization master and its initialization become a -- Otherwise the finalization master and its initialization become a
-- part of the freeze node. -- part of the freeze node.
......
...@@ -100,18 +100,21 @@ package Exp_Ch7 is ...@@ -100,18 +100,21 @@ package Exp_Ch7 is
procedure Build_Finalization_Master procedure Build_Finalization_Master
(Typ : Entity_Id; (Typ : Entity_Id;
For_Anonymous : Boolean := False; For_Anonymous : Boolean := False;
For_Lib_Level : Boolean := False;
For_Private : Boolean := False; For_Private : Boolean := False;
Context_Scope : Entity_Id := Empty; Context_Scope : Entity_Id := Empty;
Insertion_Node : Node_Id := Empty); Insertion_Node : Node_Id := Empty);
-- Build a finalization master for an access type. The designated type may -- Build a finalization master for an access type. The designated type may
-- not necessarely be controlled or need finalization actions depending on -- not necessarely be controlled or need finalization actions depending on
-- the context. Flag For_Anonymous must be set when creating a master for -- the context. Flag For_Anonymous must be set when creating a master for
-- an anonymous access type. Flag For_Private must be set when the -- an anonymous access type. Flag For_Lib_Level must be set when creating
-- designated type contains a private component. Parameters Context_Scope -- a master for a build-in-place function call access result type. Flag
-- and Insertion_Node must be used in conjunction with flags For_Anonymous -- For_Private must be set when the designated type contains a private
-- and For_Private. Context_Scope is the scope of the context where the -- component. Parameters Context_Scope and Insertion_Node must be used in
-- finalization master must be analyzed. Insertion_Node is the insertion -- conjunction with flags For_Anonymous and For_Private. Context_Scope is
-- point before which the master is inserted. -- the scope of the context where the finalization master must be analyzed.
-- Insertion_Node is the insertion point before which the master is to be
-- inserted.
procedure Build_Late_Proc (Typ : Entity_Id; Nam : Name_Id); procedure Build_Late_Proc (Typ : Entity_Id; Nam : Name_Id);
-- Build one controlling procedure when a late body overrides one of -- Build one controlling procedure when a late body overrides one of
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- B o d y -- -- B o d y --
-- -- -- --
-- Copyright (C) 2001-2014, Free Software Foundation, Inc. -- -- Copyright (C) 2001-2015, 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- --
...@@ -592,9 +592,14 @@ package body Prj is ...@@ -592,9 +592,14 @@ package body Prj is
In_Aggregate_Lib : Boolean; In_Aggregate_Lib : Boolean;
From_Encapsulated_Lib : Boolean) From_Encapsulated_Lib : Boolean)
is is
package Name_Id_Set is
new Ada.Containers.Ordered_Sets (Element_Type => Path_Name_Type);
Seen_Name : Name_Id_Set.Set; Seen_Name : Name_Id_Set.Set;
-- This set is needed to ensure that we do not handle the same -- This set is needed to ensure that we do not handle the same
-- project twice in the context of aggregate libraries. -- project twice in the context of aggregate libraries.
-- Since duplicate project names are possible in the context of
-- aggregated projects, we need to check the full paths
procedure Recursive_Check procedure Recursive_Check
(Project : Project_Id; (Project : Project_Id;
...@@ -673,12 +678,12 @@ package body Prj is ...@@ -673,12 +678,12 @@ package body Prj is
-- Start of processing for Recursive_Check -- Start of processing for Recursive_Check
begin begin
if not Seen_Name.Contains (Project.Name) then if not Seen_Name.Contains (Project.Path.Name) then
-- Even if a project is aggregated multiple times in an -- Even if a project is aggregated multiple times in an
-- aggregated library, we will only return it once. -- aggregated library, we will only return it once.
Seen_Name.Include (Project.Name); Seen_Name.Include (Project.Path.Name);
if not Imported_First then if not Imported_First then
Action Action
......
...@@ -14214,41 +14214,55 @@ package body Sem_Util is ...@@ -14214,41 +14214,55 @@ package body Sem_Util is
-- Start of processing Mark_Coextensions -- Start of processing Mark_Coextensions
begin begin
case Nkind (Context_Nod) is -- An allocator that appears on the right hand side of an assignment is
-- treated as a potentially dynamic coextension when the right hand side
-- is an allocator or a qualified expression.
-- Comment here ??? -- Obj := new ...'(new Coextension ...);
when N_Assignment_Statement => if Nkind (Context_Nod) = N_Assignment_Statement then
Is_Dynamic := Nkind (Expression (Context_Nod)) = N_Allocator; Is_Dynamic :=
Nkind_In (Expression (Context_Nod), N_Allocator,
N_Qualified_Expression);
-- An allocator that is a component of a returned aggregate -- An allocator that appears within the expression of a simple return
-- must be dynamic. -- statement is treated as a potentially dynamic coextension when the
-- expression is either aggregate, allocator or qualified expression.
when N_Simple_Return_Statement => -- return (new Coextension ...);
declare -- return new ...'(new Coextension ...);
Expr : constant Node_Id := Expression (Context_Nod);
begin
Is_Dynamic :=
Nkind (Expr) = N_Allocator
or else
(Nkind (Expr) = N_Qualified_Expression
and then Nkind (Expression (Expr)) = N_Aggregate);
end;
-- An alloctor within an object declaration in an extended return elsif Nkind (Context_Nod) = N_Simple_Return_Statement then
-- statement is of necessity dynamic. Is_Dynamic :=
Nkind_In (Expression (Context_Nod), N_Aggregate,
N_Allocator,
N_Qualified_Expression);
when N_Object_Declaration => -- An alloctor that appears within the initialization expression of an
Is_Dynamic := Nkind (Root_Nod) = N_Allocator -- object declaration is considered a potentially dynamic coextension
or else -- when the initialization expression is an allocator or a qualified
Nkind (Parent (Context_Nod)) = N_Extended_Return_Statement; -- expression.
-- This routine should not be called for constructs which may not -- Obj : ... := new ...'(new Coextension ...);
-- contain coextensions.
when others => -- A similar case arises when the object declaration is part of an
raise Program_Error; -- extended return statement.
end case;
-- return Obj : ... := new ...'(new Coextension ...);
-- return Obj : ... := (new Coextension ...);
elsif Nkind (Context_Nod) = N_Object_Declaration then
Is_Dynamic :=
Nkind_In (Root_Nod, N_Allocator, N_Qualified_Expression)
or else
Nkind (Parent (Context_Nod)) = N_Extended_Return_Statement;
-- This routine should not be called with constructs which may not
-- contain coextensions.
else
raise Program_Error;
end if;
Mark_Allocators (Root_Nod); Mark_Allocators (Root_Nod);
end Mark_Coextensions; end Mark_Coextensions;
......
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