[multiple changes]
2013-10-14 Hristian Kirtchev <kirtchev@adacore.com> * sem_prag.adb (Analyze_Dependency_Clause): Add new local variable Non_Null_Output_Seen. Update the call to Analyze_Input_Output. (Analyze_Input_Item): Streamline the detection mechanism of null and non-null items. (Analyze_Input_List): Add new local variable Non_Null_Input_Seen. Update all calls to Analyze_Input_Output. (Analyze_Input_Output): Add new formal parameter Non_Null_Seen and update the related comment on usage. Update the recursive call to itself. Attribute 'Result is now treated as a non-null item. Detect mixes of null and non-null items. (Analyze_Initialization_Item): Streamline the detection mechanism of null and non-null items. 2013-10-14 Vincent Celier <celier@adacore.com> * projects.texi: Add documentation for the new project level attribute Library_Rpath_Options. 2013-10-14 Tristan Gingold <gingold@adacore.com> * a-exexpr-gcc.adb (Set_Exception_Parameter): New procedure. (Set_Foreign_Occurrence): New procedure, extracted from Setup_Current_Excep. * exp_ch11.adb (Expand_Exception_Handlers): Do not expand choice parameter in case of zcx. * sem_ch11.adb (Analyze_Exception_Handlers): Need debug info for the choice parameter. * raise-gcc.c: Add comments. From-SVN: r203552
This commit is contained in:
parent
9b2451e5b3
commit
e74d643a35
|
@ -1,3 +1,34 @@
|
|||
2013-10-14 Hristian Kirtchev <kirtchev@adacore.com>
|
||||
|
||||
* sem_prag.adb (Analyze_Dependency_Clause): Add new local variable
|
||||
Non_Null_Output_Seen. Update the call to Analyze_Input_Output.
|
||||
(Analyze_Input_Item): Streamline the detection mechanism of null and
|
||||
non-null items.
|
||||
(Analyze_Input_List): Add new local variable
|
||||
Non_Null_Input_Seen. Update all calls to Analyze_Input_Output.
|
||||
(Analyze_Input_Output): Add new formal parameter Non_Null_Seen
|
||||
and update the related comment on usage. Update the
|
||||
recursive call to itself. Attribute 'Result is now treated
|
||||
as a non-null item. Detect mixes of null and non-null items.
|
||||
(Analyze_Initialization_Item): Streamline the detection mechanism
|
||||
of null and non-null items.
|
||||
|
||||
2013-10-14 Vincent Celier <celier@adacore.com>
|
||||
|
||||
* projects.texi: Add documentation for the new project level
|
||||
attribute Library_Rpath_Options.
|
||||
|
||||
2013-10-14 Tristan Gingold <gingold@adacore.com>
|
||||
|
||||
* a-exexpr-gcc.adb (Set_Exception_Parameter): New procedure.
|
||||
(Set_Foreign_Occurrence): New procedure, extracted from
|
||||
Setup_Current_Excep.
|
||||
* exp_ch11.adb (Expand_Exception_Handlers): Do not expand choice
|
||||
parameter in case of zcx.
|
||||
* sem_ch11.adb (Analyze_Exception_Handlers): Need debug info
|
||||
for the choice parameter.
|
||||
* raise-gcc.c: Add comments.
|
||||
|
||||
2013-10-14 Hristian Kirtchev <kirtchev@adacore.com>
|
||||
|
||||
* aspects.adb: Add an entry in table Canonical_Aspect for
|
||||
|
|
|
@ -199,13 +199,14 @@ package body Exception_Propagation is
|
|||
(GCC_Exception : not null GCC_Exception_Access);
|
||||
pragma No_Return (Reraise_GCC_Exception);
|
||||
pragma Export (C, Reraise_GCC_Exception, "__gnat_reraise_zcx");
|
||||
-- Called to implement raise without exception, ie reraise. Called
|
||||
-- Called to implement raise without exception, ie reraise. Called
|
||||
-- directly from gigi.
|
||||
|
||||
function Setup_Current_Excep
|
||||
(GCC_Exception : not null GCC_Exception_Access) return EOA;
|
||||
pragma Export (C, Setup_Current_Excep, "__gnat_setup_current_excep");
|
||||
-- Write Get_Current_Excep.all from GCC_Exception
|
||||
-- Write Get_Current_Excep.all from GCC_Exception. Called by the
|
||||
-- personnality routine.
|
||||
|
||||
procedure Unhandled_Except_Handler
|
||||
(GCC_Exception : not null GCC_Exception_Access);
|
||||
|
@ -243,6 +244,17 @@ package body Exception_Propagation is
|
|||
UW_Argument : System.Address);
|
||||
pragma Import (C, Unwind_ForcedUnwind, "__gnat_Unwind_ForcedUnwind");
|
||||
|
||||
procedure Set_Exception_Parameter
|
||||
(Excep : EOA;
|
||||
GCC_Exception : not null GCC_Exception_Access);
|
||||
pragma Export (C, Set_Exception_Parameter,
|
||||
"__gnat_set_exception_parameter");
|
||||
-- Called inserted by gigi to initialize the exception parameter
|
||||
|
||||
procedure Set_Foreign_Occurrence (Excep : EOA; Mo : System.Address);
|
||||
-- Utility routine to initialize occurrence Excep for a foreign exception
|
||||
-- whose machine occurrence is Mo.
|
||||
|
||||
-- Hooks called when entering/leaving an exception handler for a given
|
||||
-- occurrence, aimed at handling the stack of active occurrences. The
|
||||
-- calls are generated by gigi in tree_transform/N_Exception_Handler.
|
||||
|
@ -338,6 +350,20 @@ package body Exception_Propagation is
|
|||
Free (Copy);
|
||||
end GNAT_GCC_Exception_Cleanup;
|
||||
|
||||
----------------------------
|
||||
-- Set_Foreign_Occurrence --
|
||||
----------------------------
|
||||
|
||||
procedure Set_Foreign_Occurrence (Excep : EOA; Mo : System.Address) is
|
||||
begin
|
||||
Excep.Id := Foreign_Exception'Access;
|
||||
Excep.Machine_Occurrence := Mo;
|
||||
Excep.Msg_Length := 0;
|
||||
Excep.Exception_Raised := True;
|
||||
Excep.Pid := Local_Partition_ID;
|
||||
Excep.Num_Tracebacks := 0;
|
||||
end Set_Foreign_Occurrence;
|
||||
|
||||
-------------------------
|
||||
-- Setup_Current_Excep --
|
||||
-------------------------
|
||||
|
@ -366,12 +392,7 @@ package body Exception_Propagation is
|
|||
|
||||
-- A default one
|
||||
|
||||
Excep.Id := Foreign_Exception'Access;
|
||||
Excep.Machine_Occurrence := GCC_Exception.all'Address;
|
||||
Excep.Msg_Length := 0;
|
||||
Excep.Exception_Raised := True;
|
||||
Excep.Pid := Local_Partition_ID;
|
||||
Excep.Num_Tracebacks := 0;
|
||||
Set_Foreign_Occurrence (Excep, GCC_Exception.all'Address);
|
||||
|
||||
return Excep;
|
||||
end if;
|
||||
|
@ -465,6 +486,34 @@ package body Exception_Propagation is
|
|||
Propagate_GCC_Exception (To_GCC_Exception (Excep.Machine_Occurrence));
|
||||
end Propagate_Exception;
|
||||
|
||||
-----------------------------
|
||||
-- Set_Exception_Parameter --
|
||||
-----------------------------
|
||||
|
||||
procedure Set_Exception_Parameter
|
||||
(Excep : EOA;
|
||||
GCC_Exception : not null GCC_Exception_Access) is
|
||||
begin
|
||||
-- Setup the exception occurrence
|
||||
|
||||
if GCC_Exception.Class = GNAT_Exception_Class then
|
||||
|
||||
-- From the GCC exception
|
||||
|
||||
declare
|
||||
GNAT_Occurrence : constant GNAT_GCC_Exception_Access :=
|
||||
To_GNAT_GCC_Exception (GCC_Exception);
|
||||
begin
|
||||
Save_Occurrence (Excep.all, GNAT_Occurrence.Occurrence);
|
||||
end;
|
||||
else
|
||||
|
||||
-- A default one
|
||||
|
||||
Set_Foreign_Occurrence (Excep, GCC_Exception.all'Address);
|
||||
end if;
|
||||
end Set_Exception_Parameter;
|
||||
|
||||
------------------------------
|
||||
-- Unhandled_Except_Handler --
|
||||
------------------------------
|
||||
|
|
|
@ -1025,7 +1025,12 @@ package body Exp_Ch11 is
|
|||
-- ...
|
||||
-- end;
|
||||
|
||||
if Present (Choice_Parameter (Handler)) then
|
||||
-- This expansion is not performed when using GCC ZCX. Gigi
|
||||
-- will insert a call to intialize the choice parameter.
|
||||
|
||||
if Present (Choice_Parameter (Handler))
|
||||
and then Exception_Mechanism /= Back_End_Exceptions
|
||||
then
|
||||
declare
|
||||
Cparm : constant Entity_Id := Choice_Parameter (Handler);
|
||||
Cloc : constant Source_Ptr := Sloc (Cparm);
|
||||
|
|
|
@ -3962,6 +3962,14 @@ the command line when linking a shared library.
|
|||
|
||||
Value is a list of options that are to be used when linking a shared library.
|
||||
|
||||
@item @b{Library_Rpath_Options}: list, indexed, case-insensitive index
|
||||
|
||||
Index is a language name. Value is a list of options for an invocation of the
|
||||
compiler of the language. This invocation is done for a shared library project
|
||||
with sources of the language. The output of the invocation is the path name
|
||||
of a shared library file. The directory name is to be put in the run path
|
||||
option switch when linking the shared library for the project.
|
||||
|
||||
@item @b{Library_Src_Dir}: single
|
||||
|
||||
Value is the name of the directory where copies of the sources of the
|
||||
|
|
|
@ -1217,7 +1217,9 @@ PERSONALITY_FUNCTION (version_arg_t version_arg,
|
|||
setup_to_install
|
||||
(uw_context, uw_exception, action.landing_pad, action.ttype_filter);
|
||||
|
||||
/* Write current exception, so that it can be retrieved from Ada. */
|
||||
/* Write current exception, so that it can be retrieved from Ada. It was
|
||||
already done during phase 1 (just above), but in between, one or several
|
||||
exceptions may have been raised (in cleanup handlers). */
|
||||
__gnat_setup_current_excep (uw_exception);
|
||||
|
||||
return _URC_INSTALL_CONTEXT;
|
||||
|
|
|
@ -199,6 +199,7 @@ package body Sem_Ch11 is
|
|||
|
||||
if Comes_From_Source (Choice) then
|
||||
Check_Restriction (No_Exception_Propagation, Choice);
|
||||
Set_Debug_Info_Needed (Choice);
|
||||
end if;
|
||||
|
||||
if No (H_Scope) then
|
||||
|
|
|
@ -555,12 +555,13 @@ package body Sem_Prag is
|
|||
-- Verify the legality of a single input list
|
||||
|
||||
procedure Analyze_Input_Output
|
||||
(Item : Node_Id;
|
||||
Is_Input : Boolean;
|
||||
Self_Ref : Boolean;
|
||||
Top_Level : Boolean;
|
||||
Seen : in out Elist_Id;
|
||||
Null_Seen : in out Boolean);
|
||||
(Item : Node_Id;
|
||||
Is_Input : Boolean;
|
||||
Self_Ref : Boolean;
|
||||
Top_Level : Boolean;
|
||||
Seen : in out Elist_Id;
|
||||
Null_Seen : in out Boolean;
|
||||
Non_Null_Seen : in out Boolean);
|
||||
-- Verify the legality of a single input or output item. Flag
|
||||
-- Is_Input should be set whenever Item is an input, False when it
|
||||
-- denotes an output. Flag Self_Ref should be set when the item is an
|
||||
|
@ -568,7 +569,8 @@ package body Sem_Prag is
|
|||
-- be set whenever Item appears immediately within an input or output
|
||||
-- list. Seen is a collection of all abstract states, variables and
|
||||
-- formals processed so far. Flag Null_Seen denotes whether a null
|
||||
-- input or output has been encountered.
|
||||
-- input or output has been encountered. Flag Non_Null_Seen denotes
|
||||
-- whether a non-null input or output has been encountered.
|
||||
|
||||
------------------------
|
||||
-- Analyze_Input_List --
|
||||
|
@ -579,8 +581,9 @@ package body Sem_Prag is
|
|||
-- A list containing the entities of all inputs that appear in the
|
||||
-- current input list.
|
||||
|
||||
Null_Input_Seen : Boolean := False;
|
||||
-- A flag used to track the legality of a null input
|
||||
Non_Null_Input_Seen : Boolean := False;
|
||||
Null_Input_Seen : Boolean := False;
|
||||
-- Flags used to check the legality of an input list
|
||||
|
||||
Input : Node_Id;
|
||||
|
||||
|
@ -596,12 +599,13 @@ package body Sem_Prag is
|
|||
Input := First (Expressions (Inputs));
|
||||
while Present (Input) loop
|
||||
Analyze_Input_Output
|
||||
(Item => Input,
|
||||
Is_Input => True,
|
||||
Self_Ref => False,
|
||||
Top_Level => False,
|
||||
Seen => Inputs_Seen,
|
||||
Null_Seen => Null_Input_Seen);
|
||||
(Item => Input,
|
||||
Is_Input => True,
|
||||
Self_Ref => False,
|
||||
Top_Level => False,
|
||||
Seen => Inputs_Seen,
|
||||
Null_Seen => Null_Input_Seen,
|
||||
Non_Null_Seen => Non_Null_Input_Seen);
|
||||
|
||||
Next (Input);
|
||||
end loop;
|
||||
|
@ -614,12 +618,13 @@ package body Sem_Prag is
|
|||
|
||||
else
|
||||
Analyze_Input_Output
|
||||
(Item => Inputs,
|
||||
Is_Input => True,
|
||||
Self_Ref => False,
|
||||
Top_Level => False,
|
||||
Seen => Inputs_Seen,
|
||||
Null_Seen => Null_Input_Seen);
|
||||
(Item => Inputs,
|
||||
Is_Input => True,
|
||||
Self_Ref => False,
|
||||
Top_Level => False,
|
||||
Seen => Inputs_Seen,
|
||||
Null_Seen => Null_Input_Seen,
|
||||
Non_Null_Seen => Non_Null_Input_Seen);
|
||||
end if;
|
||||
|
||||
-- Detect an illegal dependency clause of the form
|
||||
|
@ -638,12 +643,13 @@ package body Sem_Prag is
|
|||
--------------------------
|
||||
|
||||
procedure Analyze_Input_Output
|
||||
(Item : Node_Id;
|
||||
Is_Input : Boolean;
|
||||
Self_Ref : Boolean;
|
||||
Top_Level : Boolean;
|
||||
Seen : in out Elist_Id;
|
||||
Null_Seen : in out Boolean)
|
||||
(Item : Node_Id;
|
||||
Is_Input : Boolean;
|
||||
Self_Ref : Boolean;
|
||||
Top_Level : Boolean;
|
||||
Seen : in out Elist_Id;
|
||||
Null_Seen : in out Boolean;
|
||||
Non_Null_Seen : in out Boolean)
|
||||
is
|
||||
Is_Output : constant Boolean := not Is_Input;
|
||||
Grouped : Node_Id;
|
||||
|
@ -666,12 +672,13 @@ package body Sem_Prag is
|
|||
Grouped := First (Expressions (Item));
|
||||
while Present (Grouped) loop
|
||||
Analyze_Input_Output
|
||||
(Item => Grouped,
|
||||
Is_Input => Is_Input,
|
||||
Self_Ref => Self_Ref,
|
||||
Top_Level => False,
|
||||
Seen => Seen,
|
||||
Null_Seen => Null_Seen);
|
||||
(Item => Grouped,
|
||||
Is_Input => Is_Input,
|
||||
Self_Ref => Self_Ref,
|
||||
Top_Level => False,
|
||||
Seen => Seen,
|
||||
Null_Seen => Null_Seen,
|
||||
Non_Null_Seen => Non_Null_Seen);
|
||||
|
||||
Next (Grouped);
|
||||
end loop;
|
||||
|
@ -683,6 +690,7 @@ package body Sem_Prag is
|
|||
-- Process Function'Result in the context of a dependency clause
|
||||
|
||||
elsif Is_Attribute_Result (Item) then
|
||||
Non_Null_Seen := True;
|
||||
|
||||
-- It is sufficent to analyze the prefix of 'Result in order to
|
||||
-- establish legality of the attribute.
|
||||
|
@ -707,6 +715,10 @@ package body Sem_Prag is
|
|||
elsif Is_Input then
|
||||
Error_Msg_N ("function result cannot act as input", Item);
|
||||
|
||||
elsif Null_Seen then
|
||||
Error_Msg_N
|
||||
("cannot mix null and non-null dependency items", Item);
|
||||
|
||||
else
|
||||
Result_Seen := True;
|
||||
end if;
|
||||
|
@ -719,19 +731,39 @@ package body Sem_Prag is
|
|||
if Null_Seen then
|
||||
Error_Msg_N
|
||||
("multiple null dependency relations not allowed", Item);
|
||||
|
||||
elsif Non_Null_Seen then
|
||||
Error_Msg_N
|
||||
("cannot mix null and non-null dependency items", Item);
|
||||
|
||||
else
|
||||
Null_Seen := True;
|
||||
|
||||
if Is_Output and then not Is_Last then
|
||||
Error_Msg_N
|
||||
("null output list must be the last clause in a "
|
||||
& "dependency relation", Item);
|
||||
if Is_Output then
|
||||
if not Is_Last then
|
||||
Error_Msg_N
|
||||
("null output list must be the last clause in a "
|
||||
& "dependency relation", Item);
|
||||
|
||||
-- Catch a useless dependence of the form:
|
||||
-- null =>+ ...
|
||||
|
||||
elsif Self_Ref then
|
||||
Error_Msg_N
|
||||
("useless dependence, null depends on itself", Item);
|
||||
end if;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
-- Default case
|
||||
|
||||
else
|
||||
Non_Null_Seen := True;
|
||||
|
||||
if Null_Seen then
|
||||
Error_Msg_N ("cannot mix null and non-null items", Item);
|
||||
end if;
|
||||
|
||||
Analyze (Item);
|
||||
|
||||
-- Find the entity of the item. If this is a renaming, climb
|
||||
|
@ -845,6 +877,9 @@ package body Sem_Prag is
|
|||
Output : Node_Id;
|
||||
Self_Ref : Boolean;
|
||||
|
||||
Non_Null_Output_Seen : Boolean := False;
|
||||
-- Flag used to check the legality of an output list
|
||||
|
||||
-- Start of processing for Analyze_Dependency_Clause
|
||||
|
||||
begin
|
||||
|
@ -864,12 +899,13 @@ package body Sem_Prag is
|
|||
Output := First (Choices (Clause));
|
||||
while Present (Output) loop
|
||||
Analyze_Input_Output
|
||||
(Item => Output,
|
||||
Is_Input => False,
|
||||
Self_Ref => Self_Ref,
|
||||
Top_Level => True,
|
||||
Seen => All_Outputs_Seen,
|
||||
Null_Seen => Null_Output_Seen);
|
||||
(Item => Output,
|
||||
Is_Input => False,
|
||||
Self_Ref => Self_Ref,
|
||||
Top_Level => True,
|
||||
Seen => All_Outputs_Seen,
|
||||
Null_Seen => Null_Output_Seen,
|
||||
Non_Null_Seen => Non_Null_Output_Seen);
|
||||
|
||||
Next (Output);
|
||||
end loop;
|
||||
|
@ -2192,22 +2228,15 @@ package body Sem_Prag is
|
|||
Item_Id : Entity_Id;
|
||||
|
||||
begin
|
||||
-- A package with null initialization list is not allowed to have
|
||||
-- additional initializations.
|
||||
|
||||
if Null_Seen then
|
||||
Error_Msg_NE ("package & has null initialization", Item, Pack_Id);
|
||||
|
||||
-- Null initialization list
|
||||
|
||||
elsif Nkind (Item) = N_Null then
|
||||
if Nkind (Item) = N_Null then
|
||||
if Null_Seen then
|
||||
Error_Msg_N ("multiple null initializations not allowed", Item);
|
||||
|
||||
-- Catch a case where a null initialization item appears in a list
|
||||
-- of non-null items.
|
||||
|
||||
if Non_Null_Seen then
|
||||
Error_Msg_NE
|
||||
("package & has non-null initialization", Item, Pack_Id);
|
||||
elsif Non_Null_Seen then
|
||||
Error_Msg_N
|
||||
("cannot mix null and non-null initialization items", Item);
|
||||
else
|
||||
Null_Seen := True;
|
||||
end if;
|
||||
|
@ -2217,6 +2246,11 @@ package body Sem_Prag is
|
|||
else
|
||||
Non_Null_Seen := True;
|
||||
|
||||
if Null_Seen then
|
||||
Error_Msg_N
|
||||
("cannot mix null and non-null initialization items", Item);
|
||||
end if;
|
||||
|
||||
Analyze (Item);
|
||||
|
||||
if Is_Entity_Name (Item) then
|
||||
|
@ -2287,21 +2321,16 @@ package body Sem_Prag is
|
|||
Input_Id : Entity_Id;
|
||||
|
||||
begin
|
||||
-- An initialization item with null inputs is not allowed to have
|
||||
-- assitional inputs.
|
||||
|
||||
if Null_Seen then
|
||||
Error_Msg_N ("item has null input list", Item);
|
||||
|
||||
-- Null input list
|
||||
|
||||
elsif Nkind (Input) = N_Null then
|
||||
if Nkind (Input) = N_Null then
|
||||
if Null_Seen then
|
||||
Error_Msg_N
|
||||
("multiple null initializations not allowed", Item);
|
||||
|
||||
-- Catch a case where a null input appears in a list of non-
|
||||
-- null inpits.
|
||||
|
||||
if Non_Null_Seen then
|
||||
Error_Msg_N ("item has non-null input list", Item);
|
||||
elsif Non_Null_Seen then
|
||||
Error_Msg_N
|
||||
("cannot mix null and non-null initialization item", Item);
|
||||
else
|
||||
Null_Seen := True;
|
||||
end if;
|
||||
|
@ -2311,6 +2340,11 @@ package body Sem_Prag is
|
|||
else
|
||||
Non_Null_Seen := True;
|
||||
|
||||
if Null_Seen then
|
||||
Error_Msg_N
|
||||
("cannot mix null and non-null initialization item", Item);
|
||||
end if;
|
||||
|
||||
Analyze (Input);
|
||||
|
||||
if Is_Entity_Name (Input) then
|
||||
|
@ -9299,7 +9333,7 @@ package body Sem_Prag is
|
|||
|
||||
elsif Nkind (State) = N_Null then
|
||||
Name := New_Internal_Name ('S');
|
||||
Is_Null := True;
|
||||
Is_Null := True;
|
||||
Null_Seen := True;
|
||||
|
||||
-- Catch a case where a null state appears in a list of
|
||||
|
@ -19946,7 +19980,7 @@ package body Sem_Prag is
|
|||
Dep_Id := Entity_Of (Dep_Input);
|
||||
|
||||
-- Inspect all inputs of the refinement clause and attempt
|
||||
-- to match against the inputs of the dependance clause.
|
||||
-- to match against the inputs of the dependence clause.
|
||||
|
||||
Ref_Input := First (Ref_Inputs);
|
||||
while Present (Ref_Input) loop
|
||||
|
@ -20256,7 +20290,7 @@ package body Sem_Prag is
|
|||
begin
|
||||
-- The analysis of pragma Depends should produce normalized clauses
|
||||
-- with exactly one output. This is important because output items
|
||||
-- are unique in the whole dependance relation and can be used as
|
||||
-- are unique in the whole dependence relation and can be used as
|
||||
-- keys.
|
||||
|
||||
pragma Assert (No (Next (Dep_Output)));
|
||||
|
|
Loading…
Reference in New Issue