https://gcc.gnu.org/g:a462ae8896caa378eb23ef67e7b6b87ed6c1bae1
commit r17-1298-ga462ae8896caa378eb23ef67e7b6b87ed6c1bae1 Author: Eric Botcazou <[email protected]> Date: Thu May 7 13:40:11 2026 +0200 ada: Improve layout of TSD (Type Specific Data) record for tagged types Compiling Ada.Tags with -gnatRh shows unused bits in the Type_Specific_Data record type for 64-bit targets. This saves one 64-bit word in it for them. gcc/ada/ChangeLog: * libgnat/a-tags.ads (Type_Specific_Data): Move Boolean components to right after Natural components and put Is_Abstract last. * exp_disp.adb (Make_DT): Adjust to above reordering. Diff: --- gcc/ada/exp_disp.adb | 88 +++++++++++++++++++++++----------------------- gcc/ada/libgnat/a-tags.ads | 35 +++++++++--------- 2 files changed, 62 insertions(+), 61 deletions(-) diff --git a/gcc/ada/exp_disp.adb b/gcc/ada/exp_disp.adb index 8e0bcce49f90..13fc8158e781 100644 --- a/gcc/ada/exp_disp.adb +++ b/gcc/ada/exp_disp.adb @@ -5129,6 +5129,50 @@ package body Exp_Disp is Attribute_Name => Name_Alignment)); end if; + -- Transportable: Set for types that can be used in remote calls + -- with respect to E.4(18) legality rules. + + declare + Transportable : Entity_Id; + + begin + Transportable := + Boolean_Literals + (Is_Pure (Typ) + or else Is_Shared_Passive (Typ) + or else + ((Is_Remote_Types (Typ) + or else Is_Remote_Call_Interface (Typ)) + and then Original_View_In_Visible_Part (Typ)) + or else not Comes_From_Source (Typ)); + + Append_To (TSD_Aggr_List, + New_Occurrence_Of (Transportable, Loc)); + end; + + -- Needs_Finalization: Set if the type is controlled or has controlled + -- components. + + declare + Needs_Fin : Entity_Id; + begin + Needs_Fin := Boolean_Literals (Needs_Finalization (Typ)); + Append_To (TSD_Aggr_List, New_Occurrence_Of (Needs_Fin, Loc)); + end; + + -- Is_Abstract (Ada 2012: AI05-0173). This functionality is not + -- available in the HIE runtime. + + if RTE_Record_Component_Available (RE_Is_Abstract) then + declare + Is_Abstract : Entity_Id; + begin + Is_Abstract := Boolean_Literals (Is_Abstract_Type (Typ)); + Append_To (TSD_Aggr_List, + New_Occurrence_Of (Is_Abstract, Loc)); + end; + end if; + -- Expanded_Name Append_To (TSD_Aggr_List, @@ -5345,50 +5389,6 @@ package body Exp_Disp is New_Occurrence_Of (RTE (RE_Null_Address), Loc))); end if; - -- Transportable: Set for types that can be used in remote calls - -- with respect to E.4(18) legality rules. - - declare - Transportable : Entity_Id; - - begin - Transportable := - Boolean_Literals - (Is_Pure (Typ) - or else Is_Shared_Passive (Typ) - or else - ((Is_Remote_Types (Typ) - or else Is_Remote_Call_Interface (Typ)) - and then Original_View_In_Visible_Part (Typ)) - or else not Comes_From_Source (Typ)); - - Append_To (TSD_Aggr_List, - New_Occurrence_Of (Transportable, Loc)); - end; - - -- Is_Abstract (Ada 2012: AI05-0173). This functionality is not - -- available in the HIE runtime. - - if RTE_Record_Component_Available (RE_Is_Abstract) then - declare - Is_Abstract : Entity_Id; - begin - Is_Abstract := Boolean_Literals (Is_Abstract_Type (Typ)); - Append_To (TSD_Aggr_List, - New_Occurrence_Of (Is_Abstract, Loc)); - end; - end if; - - -- Needs_Finalization: Set if the type is controlled or has controlled - -- components. - - declare - Needs_Fin : Entity_Id; - begin - Needs_Fin := Boolean_Literals (Needs_Finalization (Typ)); - Append_To (TSD_Aggr_List, New_Occurrence_Of (Needs_Fin, Loc)); - end; - -- Size_Func if RTE_Record_Component_Available (RE_Size_Func) then diff --git a/gcc/ada/libgnat/a-tags.ads b/gcc/ada/libgnat/a-tags.ads index f4cf653b18c6..c9d122dae659 100644 --- a/gcc/ada/libgnat/a-tags.ads +++ b/gcc/ada/libgnat/a-tags.ads @@ -289,10 +289,9 @@ private access function (A : System.Address) return Long_Long_Integer; type Type_Specific_Data (Idepth : Natural) is record - -- The discriminant Idepth is the Inheritance Depth Level: Used to - -- implement the membership test associated with single inheritance of - -- tagged types in constant-time. It also indicates the size of the - -- Tags_Table component. + -- Inheritance Depth Level: Used to implement the membership test + -- associated with single inheritance of tagged types in constant-time. + -- It also indicates the size of the Tags_Table component. Access_Level : Natural; -- Accessibility level required to give support to Ada 2005 nested type @@ -303,28 +302,30 @@ private -- function return, and class-wide stream I/O, the danger of objects -- outliving their type declaration can be eliminated (Ada 2005: AI-344) - Alignment : Natural; - Expanded_Name : Cstring_Ptr; - External_Tag : Cstring_Ptr; - HT_Link : Tag_Ptr; - -- Components used to support to the Ada.Tags subprograms in RM 3.9 - - -- Note: Expanded_Name is referenced by GDB to determine the actual name - -- of the tagged type. Its requirements are: 1) it must have this exact - -- name, and 2) its contents must point to a C-style Nul terminated - -- string containing its expanded name. GDB has no requirement on a - -- given position inside the record. + Alignment : Natural; + -- Alignment of the type Transportable : Boolean; -- Used to check RM E.4(18), set for types that satisfy the requirements -- for being used in remote calls as actuals for classwide formals or as -- return values for classwide functions. + Needs_Finalization : Boolean; + -- Used to dynamically check whether an object is controlled or not + Is_Abstract : Boolean; -- True if the type is abstract (Ada 2012: AI05-0173) - Needs_Finalization : Boolean; - -- Used to dynamically check whether an object is controlled or not + Expanded_Name : Cstring_Ptr; + External_Tag : Cstring_Ptr; + HT_Link : Tag_Ptr; + -- Components used to support the Ada.Tags subprograms in RM 3.9 + + -- Note: Expanded_Name is referenced by GDB to determine the actual name + -- of the tagged type. Its requirements are: 1) it must have this exact + -- name, and 2) its contents must point to a C-style Nul terminated + -- string containing its expanded name. GDB has no requirement on a + -- given position inside the record. Size_Func : Size_Ptr; -- Pointer to the subprogram computing the _size of the object. Used by
