Skip to content

Commit

Permalink
[Ada] Fix type mismatch warnings during LTO bootstrap #4
Browse files Browse the repository at this point in the history
gcc/ada/

	* libgnat/s-stalib.ads (Exception_Data): Mark components as aliased.
	* stand.ads (Standard_Entity_Type): Enhance comments.
	* cstand.adb (Make_Component): Rename into...
	(Make_Aliased_Component): ...this; set Is_Aliased and Is_Independent
	flags on the component.
	(Create_Standard): Adjust the types of the component of the record
	Standard_Exception_Type and mark them as aliased.
	* exp_ch11.adb (Expand_N_Exception_Declaration): Use OK
	conversion to Standard_Address for Full_Name component, except
	in CodePeer_Mode (set it to 0).
	* exp_prag.adb (Expand_Pragma_Import_Or_Interface): Likewise.
	* raise.h (struct Exception_Data): Change the type of Full_Name,
	HTable_Ptr and Foreign_Data.
  • Loading branch information
Eric Botcazou authored and pmderodat committed May 7, 2021
1 parent a6d3b49 commit d3ab01f
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 75 deletions.
94 changes: 48 additions & 46 deletions gcc/ada/cstand.adb
Original file line number Diff line number Diff line change
Expand Up @@ -133,12 +133,12 @@ package body CStand is
-- Returns an identifier node with the same name as the defining identifier
-- corresponding to the given Standard_Entity_Type value.

procedure Make_Component
procedure Make_Aliased_Component
(Rec : Entity_Id;
Typ : Entity_Id;
Nam : String);
-- Build a record component with the given type and name, and append to
-- the list of components of Rec.
-- Build an aliased record component with the given type and name,
-- and append to the list of components of Rec.

function Make_Formal (Typ : Entity_Id; Nam : String) return Entity_Id;
-- Construct entity for subprogram formal with given name and type
Expand Down Expand Up @@ -1495,38 +1495,40 @@ package body CStand is
-- known by the run-time. Components of the record are documented in
-- the declaration in System.Standard_Library.

Standard_Exception_Type := New_Standard_Entity ("exception");
Set_Ekind (Standard_Exception_Type, E_Record_Type);
Set_Etype (Standard_Exception_Type, Standard_Exception_Type);
Set_Scope (Standard_Exception_Type, Standard_Standard);
Set_Stored_Constraint
(Standard_Exception_Type, No_Elist);
Init_Size_Align (Standard_Exception_Type);
Set_Size_Known_At_Compile_Time
(Standard_Exception_Type, True);

Make_Component
(Standard_Exception_Type, Standard_Boolean, "Not_Handled_By_Others");
Make_Component
(Standard_Exception_Type, Standard_Character, "Lang");
Make_Component
(Standard_Exception_Type, Standard_Natural, "Name_Length");
Make_Component
(Standard_Exception_Type, Standard_A_Char, "Full_Name");
Make_Component
(Standard_Exception_Type, Standard_A_Char, "HTable_Ptr");
Make_Component
(Standard_Exception_Type, Standard_A_Char, "Foreign_Data");
Make_Component
(Standard_Exception_Type, Standard_A_Char, "Raise_Hook");

-- Build tree for record declaration, for use by the back-end

declare
Comp_List : List_Id;
Comp : Entity_Id;
Build_Exception_Type : declare
Comp_List : List_Id;
Comp : Entity_Id;

begin
Standard_Exception_Type := New_Standard_Entity ("exception");
Set_Ekind (Standard_Exception_Type, E_Record_Type);
Set_Etype (Standard_Exception_Type, Standard_Exception_Type);
Set_Scope (Standard_Exception_Type, Standard_Standard);
Set_Stored_Constraint
(Standard_Exception_Type, No_Elist);
Init_Size_Align (Standard_Exception_Type);
Set_Size_Known_At_Compile_Time
(Standard_Exception_Type, True);

Make_Aliased_Component (Standard_Exception_Type, Standard_Boolean,
"Not_Handled_By_Others");
Make_Aliased_Component (Standard_Exception_Type, Standard_Character,
"Lang");
Make_Aliased_Component (Standard_Exception_Type, Standard_Natural,
"Name_Length");
Make_Aliased_Component (Standard_Exception_Type, Standard_Address,
"Full_Name");
Make_Aliased_Component (Standard_Exception_Type, Standard_A_Char,
"HTable_Ptr");
Make_Aliased_Component (Standard_Exception_Type, Standard_Address,
"Foreign_Data");
Make_Aliased_Component (Standard_Exception_Type, Standard_A_Char,
"Raise_Hook");

Layout_Type (Standard_Exception_Type);

-- Build tree for record declaration, for use by the back-end

Comp := First_Entity (Standard_Exception_Type);
Comp_List := New_List;
while Present (Comp) loop
Expand All @@ -1535,9 +1537,9 @@ package body CStand is
Defining_Identifier => Comp,
Component_Definition =>
Make_Component_Definition (Stloc,
Aliased_Present => False,
Subtype_Indication => New_Occurrence_Of (Etype (Comp),
Stloc))),
Aliased_Present => True,
Subtype_Indication =>
New_Occurrence_Of (Etype (Comp), Stloc))),
Comp_List);

Next_Entity (Comp);
Expand All @@ -1547,15 +1549,13 @@ package body CStand is
Defining_Identifier => Standard_Exception_Type,
Type_Definition =>
Make_Record_Definition (Stloc,
End_Label => Empty,
End_Label => Empty,
Component_List =>
Make_Component_List (Stloc,
Component_Items => Comp_List)));
end;

Append (Decl, Decl_S);

Layout_Type (Standard_Exception_Type);
Append (Decl, Decl_S);
end Build_Exception_Type;

-- Create declarations of standard exceptions

Expand Down Expand Up @@ -1711,11 +1711,11 @@ package body CStand is
return Ident_Node;
end Identifier_For;

--------------------
-- Make_Component --
--------------------
----------------------------
-- Make_Aliased_Component --
----------------------------

procedure Make_Component
procedure Make_Aliased_Component
(Rec : Entity_Id;
Typ : Entity_Id;
Nam : String)
Expand All @@ -1728,8 +1728,10 @@ package body CStand is
Set_Scope (Id, Rec);
Init_Component_Location (Id);
Set_Original_Record_Component (Id, Id);
Set_Is_Aliased (Id);
Set_Is_Independent (Id);
Append_Entity (Id, Rec);
end Make_Component;
end Make_Aliased_Component;

-----------------
-- Make_Formal --
Expand Down
15 changes: 6 additions & 9 deletions gcc/ada/exp_ch11.adb
Original file line number Diff line number Diff line change
Expand Up @@ -1246,16 +1246,13 @@ package body Exp_Ch11 is
Prefix => New_Occurrence_Of (Ex_Id, Loc),
Attribute_Name => Name_Length));

-- Full_Name component: Standard.A_Char!(Nam'Address)

-- The unchecked conversion causes capacity issues for CodePeer in some
-- cases and is never useful, so we set the Full_Name component to null
-- instead for CodePeer.
-- Full_Name component: Standard_Address?(Nam'Address)
-- or 0 if CodePeer_Mode

if CodePeer_Mode then
Append_To (L, Make_Null (Loc));
Append_To (L, Make_Integer_Literal (Loc, Uint_0));
else
Append_To (L, Unchecked_Convert_To (Standard_A_Char,
Append_To (L, OK_Convert_To (Standard_Address,
Make_Attribute_Reference (Loc,
Prefix => New_Occurrence_Of (Ex_Id, Loc),
Attribute_Name => Name_Address)));
Expand All @@ -1265,9 +1262,9 @@ package body Exp_Ch11 is

Append_To (L, Make_Null (Loc));

-- Foreign_Data component: null
-- Foreign_Data component: null address

Append_To (L, Make_Null (Loc));
Append_To (L, Make_Integer_Literal (Loc, Uint_0));

-- Raise_Hook component: null

Expand Down
2 changes: 1 addition & 1 deletion gcc/ada/exp_prag.adb
Original file line number Diff line number Diff line change
Expand Up @@ -2039,7 +2039,7 @@ package body Exp_Prag is
Expression => Relocate_Node (Rtti_Name))))));

Rewrite (Expression (Foreign_Data),
Unchecked_Convert_To (Standard_A_Char,
OK_Convert_To (Standard_Address,
Make_Attribute_Reference (Loc,
Prefix => Make_Identifier (Loc, Chars (Dum)),
Attribute_Name => Name_Address)));
Expand Down
26 changes: 14 additions & 12 deletions gcc/ada/libgnat/s-stalib.ads
Original file line number Diff line number Diff line change
Expand Up @@ -86,44 +86,46 @@ package System.Standard_Library is

-- The following record defines the underlying representation of exceptions

-- WARNING: Any changes to this may need to be reflected in the following
-- WARNING: Any change to the record needs to be reflected in the following
-- locations in the compiler and runtime code:

-- 1. The Internal_Exception routine in s-exctab.adb
-- 2. The processing in gigi that tests Not_Handled_By_Others
-- 3. Expand_N_Exception_Declaration in Exp_Ch11
-- 4. The construction of the exception type in Cstand
-- 1. The construction of the exception type in Cstand
-- 2. Expand_N_Exception_Declaration in Exp_Ch11
-- 3. Expand_Pragma_Import_Or_Interface in Exp_Prag
-- 4. The processing in gigi that tests Not_Handled_By_Others
-- 5. The Internal_Exception routine in s-exctab.adb
-- 6. The declaration of the corresponding C type in raise.h

type Exception_Data is record
Not_Handled_By_Others : Boolean;
Not_Handled_By_Others : aliased Boolean;
-- Normally set False, indicating that the exception is handled in the
-- usual way by others (i.e. an others handler handles the exception).
-- Set True to indicate that this exception is not caught by others
-- handlers, but must be explicitly named in a handler. This latter
-- setting is currently used by the Abort_Signal.

Lang : Character;
Lang : aliased Character;
-- A character indicating the language raising the exception.
-- Set to "A" for exceptions defined by an Ada program.
-- Set to "C" for imported C++ exceptions.

Name_Length : Natural;
Name_Length : aliased Natural;
-- Length of fully expanded name of exception

Full_Name : System.Address;
Full_Name : aliased System.Address;
-- Fully expanded name of exception, null terminated
-- You can use To_Ptr to convert this to a string.

HTable_Ptr : Exception_Data_Ptr;
HTable_Ptr : aliased Exception_Data_Ptr;
-- Hash table pointer used to link entries together in the hash table
-- built (by Register_Exception in s-exctab.adb) for converting between
-- identities and names.

Foreign_Data : Address;
Foreign_Data : aliased System.Address;
-- Data for imported exceptions. Not used in the Ada case. This
-- represents the address of the RTTI for the C++ case.

Raise_Hook : Raise_Action;
Raise_Hook : aliased Raise_Action;
-- This field can be used to place a "hook" on an exception. If the
-- value is non-null, then it points to a procedure which is called
-- whenever the exception is raised. This call occurs immediately,
Expand Down
6 changes: 3 additions & 3 deletions gcc/ada/raise.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ struct Exception_Data
char Not_Handled_By_Others;
char Lang;
int Name_Length;
char *Full_Name;
char *Htable_Ptr;
void *Foreign_Data;
__UINTPTR_TYPE__ Full_Name;
void *HTable_Ptr;
__UINTPTR_TYPE__ Foreign_Data;
void (*Raise_Hook)(void);
};

Expand Down
8 changes: 4 additions & 4 deletions gcc/ada/stand.ads
Original file line number Diff line number Diff line change
Expand Up @@ -335,12 +335,12 @@ package Stand is
-- This is a type used to represent the Etype of exceptions

Standard_A_String : Entity_Id;
-- An access to String type used for building elements of tables
-- carrying the enumeration literal names.
-- An access to String type used for building elements of tables carrying
-- the enumeration literal names.

Standard_A_Char : Entity_Id;
-- Access to character, used as a component of the exception type to denote
-- a thin pointer component.
-- An access to character type, used as a component of the exception type
-- to denote a thin pointer component. Needed for non-GCC back-ends.

Standard_Debug_Renaming_Type : Entity_Id;
-- A zero-size subtype of Integer, used as the type of variables used to
Expand Down

0 comments on commit d3ab01f

Please sign in to comment.