| package body Opt57 is |
| |
| type Phase_Enum is (None_Phase, FE_Init_Phase, FE_Phase); |
| |
| type Message_State is (No_Messages, Some_Messages); |
| |
| type Module_List_Array is array (Phase_Enum, Message_State) of List; |
| |
| type Private_Module_Factory is limited record |
| Module_Lists : Module_List_Array; |
| end record; |
| |
| type Element_Array is array (Positive range <>) of Module_Factory_Ptr; |
| |
| type Hash_Table is array (Positive range <>) of aliased Module_Factory_Ptr; |
| |
| type Heap_Data_Rec (Table_Last : Positive) is limited record |
| Number_Of_Elements : Positive; |
| Table : Hash_Table (1 .. Table_Last); |
| end record; |
| |
| type Heap_Data_Ptr is access Heap_Data_Rec; |
| |
| type Table is limited record |
| Data : Heap_Data_Ptr; |
| end record; |
| |
| function All_Elements (M : Table) return Element_Array is |
| Result : Element_Array (1 .. Natural (M.Data.Number_Of_Elements)); |
| Last : Natural := 0; |
| begin |
| for H in M.Data.Table'Range loop |
| Last := Last + 1; |
| Result (Last) := M.Data.Table(H); |
| end loop; |
| return Result; |
| end; |
| |
| The_Factories : Table; |
| |
| subtype Language_Array is Element_Array; |
| type Language_Array_Ptr is access Language_Array; |
| All_Languages : Language_Array_Ptr := null; |
| |
| procedure Init is |
| begin |
| if All_Languages = null then |
| All_Languages := new Language_Array'(All_Elements (The_Factories)); |
| end if; |
| end; |
| |
| function Is_Empty (L : List) return Boolean is |
| begin |
| return Link_Constant (L.Next) = L'Unchecked_Access; |
| end; |
| |
| function First (L : List) return Linkable_Ptr is |
| begin |
| return Links_Type (L.Next.all).Container.all'Access; |
| end; |
| |
| procedure Update is |
| Check_New_Dependences : Boolean := False; |
| begin |
| loop |
| for Lang_Index in All_Languages'Range loop |
| for Has_Messages in Message_State loop |
| declare |
| L : List renames |
| All_Languages (Lang_Index).Priv.Module_Lists |
| (FE_Init_Phase, Has_Messages); |
| begin |
| while not Is_Empty (L) loop |
| declare |
| Module_In_Init_State : constant Module_Ptr := |
| Module_Ptr (First (L)); |
| Pin_Dependence : Pinned (Module_In_Init_State); |
| begin |
| Check_New_Dependences := True; |
| end; |
| end loop; |
| end; |
| end loop; |
| end loop; |
| exit when not Check_New_Dependences; |
| end loop; |
| end; |
| |
| end Opt57; |