aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog9
-rw-r--r--gcc/ada/exp_dist.adb158
2 files changed, 107 insertions, 60 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 6620e37..48ffeb9 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,14 @@
2004-10-04 Thomas Quinot <quinot@act-europe.fr>
+ * exp_dist.adb: Split declaration of asynchronous flag out of
+ Add_RACW_Read_Attribute.
+ Minor reformatting for better alignment with PolyORB version.
+ Store the entity for the asynchronous flag of an RACW, rather than the
+ expression, in the asynchronous flags table. This will allow this flag
+ to be used in other subprograms beside Add_RACW_Read_Attribute.
+
+2004-10-04 Thomas Quinot <quinot@act-europe.fr>
+
* g-socket.ads, g-socket.adb, g-socthi.adb, socket.c,
g-soccon-aix.ads, g-soccon-irix.ads, g-soccon-hpux.ads,
g-soccon-interix.ads, g-soccon-solaris.ads, g-soccon-vms.adb,
diff --git a/gcc/ada/exp_dist.adb b/gcc/ada/exp_dist.adb
index 7015079..e52483f 100644
--- a/gcc/ada/exp_dist.adb
+++ b/gcc/ada/exp_dist.adb
@@ -131,7 +131,7 @@ package body Exp_Dist is
Is_Known_Non_Asynchronous : Boolean := False;
Is_Function : Boolean;
Spec : Node_Id;
- Object_Type : Entity_Id := Empty;
+ Stub_Type : Entity_Id := Empty;
Nod : Node_Id);
-- Build calling stubs for general purpose. The parameters are:
-- Decls : a place to put declarations
@@ -147,10 +147,10 @@ package body Exp_Dist is
-- Is_Known_Non_A... : True if we know that this is not asynchronous
-- Spec : a node with a Parameter_Specifications and
-- a Subtype_Mark if applicable
- -- Object_Type : in case of a RACW, parameters of type access to
- -- Object_Type will be marshalled using the
- -- address of this object (the addr field) rather
- -- than using the 'Write on the object itself
+ -- Stub_Type : in case of RACW stubs, parameters of type access
+ -- to Stub_Type will be marshalled using the
+ -- address of the object (the addr field) rather
+ -- than using the 'Write on the stub itself
-- Nod : used to provide sloc for generated code
function Build_Subprogram_Calling_Stubs
@@ -292,13 +292,13 @@ package body Exp_Dist is
package Asynchronous_Flags_Table is
new Simple_HTable (Header_Num => Hash_Index,
- Element => Node_Id,
+ Element => Entity_Id,
No_Element => Empty,
Key => Entity_Id,
Hash => Hash,
Equal => "=");
- -- Mapping between a RACW type and the node holding the value True if
- -- the RACW is asynchronous and False otherwise.
+ -- Mapping between a RACW type and a constant having the value True
+ -- if the RACW is asynchronous and False otherwise.
package RCI_Locator_Table is
new Simple_HTable (Header_Num => Hash_Index,
@@ -332,6 +332,12 @@ package body Exp_Dist is
-- then nothing is added in the tree but the right values are returned
-- anyhow and Existing is set to True.
+ procedure Add_RACW_Asynchronous_Flag
+ (Declarations : List_Id;
+ RACW_Type : Entity_Id);
+ -- Declare a boolean constant associated with RACW_Type whose value
+ -- indicates at run time whether a pragma Asynchronous applies to it.
+
procedure Add_RACW_Read_Attribute
(RACW_Type : Entity_Id;
Stub_Type : Entity_Id;
@@ -470,6 +476,34 @@ package body Exp_Dist is
end loop;
end Add_Calling_Stubs_To_Declarations;
+ --------------------------------
+ -- Add_RACW_Asynchronous_Flag --
+ --------------------------------
+
+ procedure Add_RACW_Asynchronous_Flag
+ (Declarations : List_Id;
+ RACW_Type : Entity_Id)
+ is
+ Loc : constant Source_Ptr := Sloc (RACW_Type);
+
+ Asynchronous_Flag : constant Entity_Id :=
+ Make_Defining_Identifier (Loc,
+ New_External_Name (Chars (RACW_Type), 'A'));
+
+ begin
+ -- Declare the asynchronous flag. This flag will be changed to True
+ -- whenever it is known that the RACW type is asynchronous.
+
+ Append_To (Declarations,
+ Make_Object_Declaration (Loc,
+ Defining_Identifier => Asynchronous_Flag,
+ Constant_Present => True,
+ Object_Definition => New_Occurrence_Of (Standard_Boolean, Loc),
+ Expression => New_Occurrence_Of (Standard_False, Loc)));
+
+ Asynchronous_Flags_Table.Set (RACW_Type, Asynchronous_Flag);
+ end Add_RACW_Asynchronous_Flag;
+
-----------------------
-- Add_RACW_Features --
-----------------------
@@ -527,6 +561,10 @@ package body Exp_Dist is
Object_RPC_Receiver => Object_RPC_Receiver,
Existing => Existing);
+ Add_RACW_Asynchronous_Flag
+ (Declarations => Decls,
+ RACW_Type => RACW_Type);
+
Add_RACW_Read_Write_Attributes
(RACW_Type => RACW_Type,
Stub_Type => Stub_Type,
@@ -537,9 +575,8 @@ package body Exp_Dist is
if not Same_Scope and then not Existing then
-- The RACW has been declared in another scope than the designated
- -- type and has not been handled by another RACW in the same
- -- package as the first one, so add primitive for the stub type
- -- here.
+ -- type and has not been handled by another RACW in the same package
+ -- as the first one, so add primitive for the stub type here.
Add_RACW_Primitive_Declarations_And_Bodies
(Designated_Type => Desig,
@@ -561,9 +598,8 @@ package body Exp_Dist is
Insertion_Node : Node_Id;
Decls : List_Id)
is
- -- Set sloc of generated declaration to be that of the
- -- insertion node, so the declarations are recognized as
- -- belonging to the current package.
+ -- Set sloc of generated declaration copy of insertion node sloc, so
+ -- the declarations are recognized as belonging to the current package.
Loc : constant Source_Ptr := Sloc (Insertion_Node);
@@ -789,50 +825,42 @@ package body Exp_Dist is
Source_Address : constant Entity_Id :=
Make_Defining_Identifier
(Loc, New_Internal_Name ('P'));
- Local_Stub : constant Entity_Id :=
+ Local_Stub : constant Entity_Id :=
Make_Defining_Identifier
(Loc, New_Internal_Name ('L'));
- Stubbed_Result : constant Entity_Id :=
+ Stubbed_Result : constant Entity_Id :=
Make_Defining_Identifier
(Loc, New_Internal_Name ('S'));
Asynchronous_Flag : constant Entity_Id :=
- Make_Defining_Identifier
- (Loc, New_Internal_Name ('S'));
- Asynchronous_Node : constant Node_Id :=
- New_Occurrence_Of (Standard_False, Loc);
-
- -- Functions to create occurrences of the formal
- -- parameter names.
+ Asynchronous_Flags_Table.Get (RACW_Type);
+ pragma Assert (Present (Asynchronous_Flag));
function Stream_Parameter return Node_Id;
function Result return Node_Id;
+ -- Functions to create occurrences of the formal parameter names
- function Stream_Parameter return Node_Id is
- begin
- return Make_Identifier (Loc, Name_S);
- end Stream_Parameter;
+ ------------
+ -- Result --
+ ------------
function Result return Node_Id is
begin
return Make_Identifier (Loc, Name_V);
end Result;
- begin
- -- Declare the asynchronous flag. This flag will be changed to True
- -- whenever it is known that the RACW type is asynchronous. Also, the
- -- node gets stored since it may be rewritten when we process the
- -- asynchronous pragma.
+ ----------------------
+ -- Stream_Parameter --
+ ----------------------
- Append_To (Declarations,
- Make_Object_Declaration (Loc,
- Defining_Identifier => Asynchronous_Flag,
- Constant_Present => True,
- Object_Definition => New_Occurrence_Of (Standard_Boolean, Loc),
- Expression => Asynchronous_Node));
+ function Stream_Parameter return Node_Id is
+ begin
+ return Make_Identifier (Loc, Name_S);
+ end Stream_Parameter;
- Asynchronous_Flags_Table.Set (RACW_Type, Asynchronous_Node);
+ -- Start of processing for Add_RACW_Read_Attribute
- -- Object declarations
+ begin
+ -- Generate object declarations
Decls := New_List (
Make_Object_Declaration (Loc,
@@ -1374,17 +1402,19 @@ package body Exp_Dist is
Attribute_Name => Name_Unchecked_Access)));
Set_Etype (Stub_Ptr, Stub_Elements.Stub_Type_Access);
- -- Build_Get_Unique_RP_Call needs this information.
+ -- Build_Get_Unique_RP_Call needs this information
-- Note: Here we assume that the Fat_Type is a record
-- containing just a pointer to a proxy or stub object.
Proc_Statements := New_List (
- -- Get_RAS_Info (Pkg, Subp, PA);
- -- if Origin = Local_Partition_Id and then not All_Calls_Remote then
- -- return Fat_Type!(PA);
- -- end if;
+ -- Generate:
+
+ -- Get_RAS_Info (Pkg, Subp, PA);
+ -- if Origin = Local_Partition_Id and then not All_Calls_Remote then
+ -- return Fat_Type!(PA);
+ -- end if;
Make_Procedure_Call_Statement (Loc,
Name =>
@@ -1426,16 +1456,18 @@ package body Exp_Dist is
Set_Field (Name_Addr, New_Occurrence_Of (Proxy_Addr, Loc)),
+ -- E.4.1(9) A remote call is asynchronous if it is a call to
+ -- a procedure, or a call through a value of an access-to-procedure
+ -- type, to which a pragma Asynchronous applies.
+
+ -- Parameter Asynch_P is true when the procedure is asynchronous;
+ -- Expression Asynch_T is true when the type is asynchronous.
+
Set_Field (Name_Asynchronous,
Make_Or_Else (Loc,
New_Occurrence_Of (Asynch_P, Loc),
New_Occurrence_Of (Boolean_Literals (
Is_Asynchronous (Ras_Type)), Loc))));
- -- E.4.1(9) A remote call is asynchronous if it is a call to
- -- a procedure, or a call through a value of an access-to-procedure
- -- type, to which a pragma Asynchronous applies.
- -- Parameter Asynch_P is true when the procedure is asynchronous;
- -- Expression Asynch_T is true when the type is asynchronous.
Append_List_To (Proc_Statements,
Build_Get_Unique_RP_Call
@@ -1497,6 +1529,8 @@ package body Exp_Dist is
-- Add_RAS_Dereference_TSS --
-----------------------------
+ -- This subprogram could use more comments ???
+
procedure Add_RAS_Dereference_TSS (N : Node_Id) is
Loc : constant Source_Ptr := Sloc (N);
@@ -1611,7 +1645,7 @@ package body Exp_Dist is
Parameter_Associations => Param_Assoc));
end if;
- -- Build the complete subprogram.
+ -- Build the complete subprogram
if Is_Function then
Proc_Spec :=
@@ -1745,7 +1779,6 @@ package body Exp_Dist is
Set_Comes_From_Source (Proxy_Type_Full_View, True);
-
-- procedure Call
-- (Self : access O;
-- ...other-formals...) is
@@ -1919,6 +1952,10 @@ package body Exp_Dist is
-- associating Subprogram_Number with the subprogram declared
-- by Declaration, for which we have receiving stubs in Stubs.
+ ---------------------
+ -- Append_Stubs_To --
+ ---------------------
+
procedure Append_Stubs_To
(RPC_Receiver_Cases : List_Id;
Declaration : Node_Id;
@@ -2435,7 +2472,7 @@ package body Exp_Dist is
Is_Known_Non_Asynchronous : Boolean := False;
Is_Function : Boolean;
Spec : Node_Id;
- Object_Type : Entity_Id := Empty;
+ Stub_Type : Entity_Id := Empty;
Nod : Node_Id)
is
Loc : constant Source_Ptr := Sloc (Nod);
@@ -2459,7 +2496,7 @@ package body Exp_Dist is
Asynchronous_Statements : List_Id := No_List;
Non_Asynchronous_Statements : List_Id := No_List;
- -- Statements specifics to the Asynchronous/Non-Asynchronous cases.
+ -- Statements specifics to the Asynchronous/Non-Asynchronous cases
Extra_Formal_Statements : constant List_Id := New_List;
-- List of statements for extra formal parameters. It will appear after
@@ -2575,7 +2612,7 @@ package body Exp_Dist is
Extra_Parameter : Entity_Id;
begin
- if Is_RACW_Controlling_Formal (Current_Parameter, Object_Type) then
+ if Is_RACW_Controlling_Formal (Current_Parameter, Stub_Type) then
-- In the case of a controlling formal argument, we marshall
-- its addr field rather than the local stub.
@@ -2802,7 +2839,7 @@ package body Exp_Dist is
if (Out_Present (Current_Parameter)
or else Nkind (Typ) = N_Access_Definition)
- and then Etyp /= Object_Type
+ and then Etyp /= Stub_Type
then
Append_To (Non_Asynchronous_Statements,
Make_Attribute_Reference (Loc,
@@ -3287,7 +3324,7 @@ package body Exp_Dist is
Is_Function => Nkind (Spec_To_Use) =
N_Function_Specification,
Spec => Spec_To_Use,
- Object_Type => Stub_Type,
+ Stub_Type => Stub_Type,
Nod => Vis_Decl);
RCI_Calling_Stubs_Table.Set
@@ -4279,10 +4316,11 @@ package body Exp_Dist is
-------------------------------
procedure RACW_Type_Is_Asynchronous (RACW_Type : Entity_Id) is
- N : constant Node_Id := Asynchronous_Flags_Table.Get (RACW_Type);
- pragma Assert (N /= Empty);
+ Asynchronous_Flag : constant Entity_Id :=
+ Asynchronous_Flags_Table.Get (RACW_Type);
begin
- Replace (N, New_Occurrence_Of (Standard_True, Sloc (N)));
+ Replace (Expression (Parent (Asynchronous_Flag)),
+ New_Occurrence_Of (Standard_True, Sloc (Asynchronous_Flag)));
end RACW_Type_Is_Asynchronous;
-------------------------