This patch improves on the previous patch to reduce compilation time, by providing better implementations for Base_Type and Is_Base_Type and inlining Base_Type.
No functional changes. Tested on x86_64-pc-linux-gnu, committed on trunk 2011-08-02 Robert Dewar <de...@adacore.com> * einfo.adb (Is_Base_Type): Improve efficiency by using a flag table (Base_Type): Now uses improved Is_Base_Type function * einfo.ads (Base_Type): Inline this function
Index: einfo.adb =================================================================== --- einfo.adb (revision 177122) +++ einfo.adb (working copy) @@ -5608,43 +5608,13 @@ --------------- function Base_Type (Id : E) return E is - Is_Base_Type : Boolean; begin - -- Implementation note: this function shows up high in the profile. - -- We use a fully static case construct so as to make it easier for - -- the compiler to build a static table out of it, instead of using - -- a less efficient jump table. - - case Ekind (Id) is - when E_Enumeration_Subtype | - E_Incomplete_Type | - E_Signed_Integer_Subtype | - E_Modular_Integer_Subtype | - E_Floating_Point_Subtype | - E_Ordinary_Fixed_Point_Subtype | - E_Decimal_Fixed_Point_Subtype | - E_Array_Subtype | - E_String_Subtype | - E_Record_Subtype | - E_Private_Subtype | - E_Record_Subtype_With_Private | - E_Limited_Private_Subtype | - E_Access_Subtype | - E_Protected_Subtype | - E_Task_Subtype | - E_String_Literal_Subtype | - E_Class_Wide_Subtype => - Is_Base_Type := False; - - when others => - Is_Base_Type := True; - end case; - - if Is_Base_Type then + if Is_Base_Type (Id) then return Id; + else + pragma Assert (Is_Type (Id)); + return Etype (Id); end if; - - return Etype (Id); end Base_Type; ------------------------- @@ -6206,9 +6176,32 @@ -- Is_Base_Type -- ------------------ + -- Global flag table allowing rapid computation of this function + + Entity_Is_Base_Type : constant array (Entity_Kind) of Boolean := + (E_Enumeration_Subtype | + E_Incomplete_Type | + E_Signed_Integer_Subtype | + E_Modular_Integer_Subtype | + E_Floating_Point_Subtype | + E_Ordinary_Fixed_Point_Subtype | + E_Decimal_Fixed_Point_Subtype | + E_Array_Subtype | + E_String_Subtype | + E_Record_Subtype | + E_Private_Subtype | + E_Record_Subtype_With_Private | + E_Limited_Private_Subtype | + E_Access_Subtype | + E_Protected_Subtype | + E_Task_Subtype | + E_String_Literal_Subtype | + E_Class_Wide_Subtype => False, + others => True); + function Is_Base_Type (Id : E) return Boolean is begin - return Id = Base_Type (Id); + return Entity_Is_Base_Type (Ekind (Id)); end Is_Base_Type; --------------------- Index: einfo.ads =================================================================== --- einfo.ads (revision 177110) +++ einfo.ads (working copy) @@ -8010,6 +8010,7 @@ -- things here which are small, but not of the canonical attribute -- access/set format that can be handled by xeinfo. + pragma Inline (Base_Type); pragma Inline (Is_Base_Type); pragma Inline (Is_Package_Or_Generic_Package); pragma Inline (Is_Volatile);