|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 18432 (0x4800) Types: Ada Source Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Find_Inline_Candidates, seg_004403
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─⟦5a81ac88f⟧ »Space Info Vol 1« └─⟦this⟧
with Profile; with Log; with Common; with Lrm_Utilities; with Add_Hyper_Table; with Create_Null_Document; with Simple_Status; with Errors; with Directory_Renames; use Directory_Renames; with Statement_Traversal; with Declaration_Traversal; with Lrm_Renames; use Lrm_Renames; package body Find_Inline_Candidates is procedure Stmt_Pre_Op (Program_Element : Ada.Element; Count : in out Natural; Control : in out Ada.Traversal_Control) is begin Count := Count + 1; Control := Ada.Continue; end Stmt_Pre_Op; procedure Post_Op (Program_Element : Ada.Element; Count : in out Natural; Control : in out Ada.Traversal_Control) is begin Control := Ada.Continue; end Post_Op; procedure Count_Statements is new Statement_Traversal (Natural, Stmt_Pre_Op, Post_Op); function Count_Decls (For_Subprogram : Ada.Declaration) return Natural is Count : Natural := 0; Local_Decls : Ada.Element_Iterator; procedure Count_Decls (In_Iter : in out Ada.Element_Iterator) is Decl : Ada.Element; Nested_Decls : Ada.Element_Iterator; begin while not Ada.Done (In_Iter) loop Decl := Ada.Value (In_Iter); case Decls.Kind (Decl) is when Decls.A_Package_Declaration => Nested_Decls := Decls.Visible_Part_Declarations (Decl); Count_Decls (Nested_Decls); Nested_Decls := Decls.Private_Part_Declarations (Decl); Count_Decls (Nested_Decls); when Decls.A_Package_Body_Declaration => Nested_Decls := Stmts.Declarative_Items (Decls.Package_Body_Block (Decl)); Count_Decls (Nested_Decls); when Decls.A_Variable_Declaration | Decls.A_Procedure_Declaration | Decls.A_Function_Declaration | Decls.A_Task_Declaration | Decls.A_Package_Instantiation | Decls.A_Procedure_Instantiation | Decls.A_Function_Instantiation | Decls.A_Procedure_Body_Declaration | Decls.A_Function_Body_Declaration | Decls.A_Task_Body_Declaration => -- These decls generate elaboration code and -- are counted. Nested decls are also counted. Count := Count + 1; when others => null; end case; Ada.Next (In_Iter); end loop; end Count_Decls; begin Local_Decls := Stmts.Declarative_Items (Decls.Subprogram_Block (For_Subprogram)); Count_Decls (Local_Decls); return Count; end Count_Decls; function Is_Subprogram_Body (Decl : Ada.Declaration) return Boolean is begin case Decls.Kind (Decl) is when Decls.A_Procedure_Body_Declaration | Decls.A_Function_Body_Declaration => return True; when others => return False; end case; end Is_Subprogram_Body; procedure Filter_Out_Body_Dependencies is new Ada.Filter (Is_Subprogram_Body); procedure Add (Units : String := ""; Max_Stmts : Positive := 5; Max_Calls : Positive := 1000; Max_Local_Variables_And_Subprograms : Positive := 10; Max_Combo : Positive := 1000; To_Document : in out Abstract_Document.Handle; Response : String := "<PROFILE>") is Num_Statements : Natural; Num_Local_Decls : Natural; Num_Calls : Natural; The_Calls : Ada.Element_List; Units_Iter : Object.Iterator := Naming.Resolution (Units); type Columns is (Statements, Local_Decls, Calls, Subprogram); function Is_Integer (C : Columns) return Boolean is begin case C is when Statements | Local_Decls | Calls => return True; when Subprogram => return False; end case; end Is_Integer; function Included (Elem : Ada.Element) return Boolean is The_Dependencies : Ada.Element_List; Control : Ada.Traversal_Control := Ada.Continue; begin case Ada.Kind (Elem) is when Ada.A_Declaration => case Decls.Kind (Elem) is when Decls.A_Procedure_Body_Declaration | Decls.A_Function_Body_Declaration => Num_Statements := 0; Count_Statements (Elem, Num_Statements, Control); if Num_Statements <= Max_Stmts then The_Dependencies := Ada.Usage (Elem); Filter_Out_Body_Dependencies (The_Dependencies, The_Calls); Num_Calls := Lrm_Utilities.Count (The_Calls); if Num_Calls <= Max_Calls then Num_Local_Decls := Count_Decls (Elem); if Num_Local_Decls <= Max_Local_Variables_And_Subprograms then if (Num_Statements + Num_Local_Decls) * Num_Calls <= Max_Combo then return True; else return False; end if; else return False; end if; else return False; end if; else return False; end if; when others => return False; end case; when others => return False; end case; end Included; function Explanation (C : Columns; Elem : Ada.Element) return String is begin case C is when Local_Decls => return "Number of local decls requiring elaboration"; when Statements => return "Total number of statements in the subprogram body"; when Calls => return "Total number of calls of the subprogram"; when Subprogram => return "Subprogram Name"; end case; end Explanation; function Image (C : Columns; Elem : Ada.Element) return String is begin case C is when Local_Decls => return Integer'Image (Num_Local_Decls); when Statements => return Integer'Image (Num_Statements); when Calls => return Integer'Image (Num_Calls); when Subprogram => return Decls.Name (Elem); end case; end Image; procedure Linkage (C : Columns; For_Element : Ada.Element; Linkage_Element : out Ada.Element; Linkage_Elements : out Ada.Element_List) is The_Decls : Ada.Element_Iterator; Decl : Ada.Element; begin -- default values that are change within the case statement as -- necessary Linkage_Element := Ada.Nil_Element; Linkage_Elements := Ada.Nil_List; case C is when Statements => -- first statement Linkage_Element := Ada.Value (Stmts.Block_Body_Statements (Decls.Subprogram_Block (For_Element))); when Local_Decls => The_Decls := Stmts.Declarative_Items (Decls.Subprogram_Block (For_Element)); Linkage_Element := Ada.Nil_Element; while not Ada.Done (The_Decls) loop Decl := Ada.Value (The_Decls); case Decls.Kind (Decl) is when Decls.A_Package_Declaration | Decls.A_Package_Body_Declaration | Decls.A_Variable_Declaration | Decls.A_Procedure_Declaration | Decls.A_Procedure_Body_Declaration | Decls.A_Function_Declaration | Decls.A_Function_Body_Declaration | Decls.A_Task_Declaration | Decls.A_Task_Body_Declaration | Decls.A_Package_Instantiation | Decls.A_Procedure_Instantiation | Decls.A_Function_Instantiation => -- first real declaration Linkage_Element := Decl; return; when others => null; end case; Ada.Next (The_Decls); end loop; Linkage_Element := Ada.Nil_Element; when Calls => Linkage_Elements := The_Calls; when Subprogram => Linkage_Element := For_Element; end case; end Linkage; procedure Add_Hyper_Table_To_Doc is new Add_Hyper_Table (Included, Columns, Is_Integer, Image, Explanation, Linkage, Table_Title => "INLINE CANDIDATE PROCEDURES"); begin if Object.Is_Bad (Units_Iter) then Log.Put_Line (Units & " is not a valid pathname", Profile.Error_Msg); else Add_Hyper_Table_To_Doc (Units_Iter, To_Document); end if; end Add; procedure Display (Units : String := ""; Max_Stmts : Positive := 5; Max_Calls : Positive := 1000; Max_Local_Variables_And_Subprograms : Positive := 10; Max_Combo : Positive := 1000; To_Preview_Object : String := "Inline_Info"; Response : String := "<PROFILE>") is Document : Abstract_Document.Handle; Condition : Errors.Condition; begin Create_Null_Document (Named => To_Preview_Object, Error_Info => Condition, Document_Handle => Document); case Errors.Severity (Condition) is when Simple_Status.Problem | Simple_Status.Fatal => Log.Put_Line ("Problem creating object " & To_Preview_Object & ". " & Errors.Info (Condition), Profile.Error_Msg); when others => Add (Units, Max_Stmts, Max_Calls, Max_Local_Variables_And_Subprograms, Max_Combo, Document, Response); Abstract_Document.Close (Document); Common.Definition (To_Preview_Object); end case; end Display; end Find_Inline_Candidates;
nblk1=11 nid=0 hdr6=22 [0x00] rec0=22 rec1=00 rec2=01 rec3=032 [0x01] rec0=00 rec1=00 rec2=11 rec3=004 [0x02] rec0=14 rec1=00 rec2=02 rec3=020 [0x03] rec0=00 rec1=00 rec2=10 rec3=01c [0x04] rec0=14 rec1=00 rec2=03 rec3=026 [0x05] rec0=1c rec1=00 rec2=04 rec3=040 [0x06] rec0=1c rec1=00 rec2=05 rec3=00a [0x07] rec0=00 rec1=00 rec2=0e rec3=02c [0x08] rec0=17 rec1=00 rec2=06 rec3=090 [0x09] rec0=19 rec1=00 rec2=07 rec3=024 [0x0a] rec0=19 rec1=00 rec2=08 rec3=010 [0x0b] rec0=17 rec1=00 rec2=09 rec3=040 [0x0c] rec0=00 rec1=00 rec2=0f rec3=006 [0x0d] rec0=10 rec1=00 rec2=0a rec3=062 [0x0e] rec0=18 rec1=00 rec2=0b rec3=08c [0x0f] rec0=18 rec1=00 rec2=0c rec3=062 [0x10] rec0=14 rec1=00 rec2=0d rec3=000 tail 0x21500335a815c6381e899 0x42a00088462061e03