|
|
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: 17408 (0x4400)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, procedure Analyze, seg_004567
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦this⟧
with Program_Analysis;
with Lrm_Utilities;
with Log;
with Profile;
with Errors;
with Common;
with Ada_Traversal;
with Directory_Renames;
use Directory_Renames;
with Lrm_Renames;
use Lrm_Renames;
with Abstract_Document;
with Table_Formatter;
with Subprogram_Analysis;
procedure Analyze (Units : String := "";
To_Preview_Object : String := "subprogram_info") is
package Ad renames Abstract_Document;
package Ad_Specify renames Abstract_Document.Specify;
package Sub_Table is new Table_Formatter (8);
package Unit_Table is new Table_Formatter (6);
Bad_Input_String : exception;
B : Boolean := True;
Current_Context : constant String := Naming.Default_Context;
Object_Status : Object.Error_Code;
Unit_Iter : Object.Iterator := Naming.Resolution (Units);
Document : Ad.Handle;
Status : Errors.Condition;
Uses_Total : Natural := 0;
Anon_Total : Natural := 0;
Goto_Total : Natural := 0;
Predefined_Total : Natural := 0;
Vars_Total : Natural := 0;
function Unit_Name (Comp_Unit : Ada.Element) return String is
Decl : Ada.Declaration := Comp_Units.Unit_Declaration (Comp_Unit);
Name : constant String := Decls.Name (Decl);
begin
if Decls.Is_Visible (Decl) then
return Name & "'spec";
else
return Name & "'body";
end if;
end Unit_Name;
function Subprogram_Name (Sub_Body : Ada.Element) return String is
Spec : Ada.Element := Decls.Specification (Sub_Body);
Id : Ada.Element;
begin
if Ada.Is_Nil (Spec) then
Id := Ada.Value (Decls.Identifiers (Sub_Body));
else
Id := Ada.Value (Decls.Identifiers (Spec));
end if;
return Lrm_Utilities.Qualified_Reference (Id);
end Subprogram_Name;
procedure Pre_Op (Program_Element : Ada.Element;
State : in out Boolean;
Control : in out Ada.Traversal_Control) is
begin
case Ada.Kind (Program_Element) is
when Ada.A_Declaration =>
case Decls.Kind (Program_Element) is
when Decls.A_Procedure_Body_Declaration |
Decls.A_Function_Body_Declaration =>
declare
Data : Subprogram_Analysis.Subprogram_Data :=
Subprogram_Analysis.Analyze (Program_Element);
begin
Sub_Table.Item (S => Subprogram_Name
(Program_Element),
Linkage => Program_Element,
Linkage_List => Ada.Nil_List,
Explanation => "Subprogram Name");
Sub_Table.Item
(S => Integer'Image
(Subprogram_Analysis.
Number_Of_Parameters (Data)),
Explanation =>
"Number of paramters in the subprogram");
Sub_Table.Item
(S => Integer'Image
(Lrm_Utilities.Count
(Subprogram_Analysis.Branches
(Data))),
Linkage_List =>
Subprogram_Analysis.Branches (Data),
Explanation =>
"Number of branch points in the subprogram");
Sub_Table.Item
(S => Integer'Image
(Subprogram_Analysis.Nesting_Depth
(Data)),
Linkage_List => Ada.Nil_List,
Explanation => "Maximum depth of nesting");
Sub_Table.Item
(S => Integer'Image
(Lrm_Utilities.Count
(Subprogram_Analysis.Exits (Data))),
Linkage_List =>
Subprogram_Analysis.Exits (Data),
Explanation =>
"Number of subprogram return statements");
Sub_Table.Item
(S => Integer'Image
(Lrm_Utilities.Count
(Subprogram_Analysis. Global_References (Data))),
Linkage_List =>
Subprogram_Analysis.Global_References (Data),
Explanation =>
"Number of references to global variables");
Sub_Table.Item
(S => Integer'Image
(Subprogram_Analysis.
Number_Of_Local_Declarations (Data)),
Linkage_List => Ada.Nil_List,
Explanation => "Number of local declarations");
Sub_Table.Item
(S =>
Integer'Image
(Subprogram_Analysis.Number_Of_Statements
(Data)),
Linkage_List => Ada.Nil_List,
Explanation =>
"Total number of statements in the subprogram");
end;
Control := Ada.Abandon_Children;
when others =>
Control := Ada.Continue;
end case;
when others =>
null;
end case;
end Pre_Op;
procedure Post_Op (Program_Element : Ada.Element;
State : in out Boolean;
Control : in out Ada.Traversal_Control) is
begin
Control := Ada.Continue;
end Post_Op;
procedure Traverse is new Ada.Depth_First_Traversal
(Boolean, Pre_Op, Post_Op);
procedure Yield_Unit_Subs (Unit : Object.Handle) is
begin
Traverse (Ada.Conversion.To_Compilation_Unit (Unit), B, True);
end Yield_Unit_Subs;
procedure Yield_Unit (Unit : Object.Handle) is
Comp_Unit : Ada.Element := Ada.Conversion.To_Compilation_Unit (Unit);
Data : Program_Analysis.Unit_Data :=
Program_Analysis.Analyze (Comp_Unit);
procedure Add_Item (List : Ada.Element_List;
Explanation : String;
Total : in out Natural) is
Count : Natural := Lrm_Utilities.Count (List);
begin
Unit_Table.Item (S => Integer'Image (Count),
Linkage_List => List,
Explanation => Explanation);
Total := Total + Count;
end Add_Item;
begin
Unit_Table.Item (S => Unit_Name (Comp_Unit),
Linkage => Lrm_Utilities.Comp_Unit_Id (Comp_Unit),
Linkage_List => Ada.Nil_List,
Explanation => "Unit Name");
Add_Item (List => Program_Analysis.Use_Clauses (Data),
Total => Uses_Total,
Explanation => "Number of use clauses in the unit");
Add_Item (List => Program_Analysis.Go_Tos (Data),
Total => Goto_Total,
Explanation => "Number of goto statemetns in the unit");
Add_Item (List => Program_Analysis.Predefined_Numerics (Data),
Total => Predefined_Total,
Explanation =>
"Number of uses of predefined numerics in the unit");
Add_Item
(List => Program_Analysis.Uninitialized_Variables (Data),
Total => Vars_Total,
Explanation =>
"Number of variable declarations without explicit initialization");
Add_Item
(List => Program_Analysis.Anonymous_Array_Decls (Data),
Total => Anon_Total,
Explanation =>
"Number of variables declared with an anonymous array type");
end Yield_Unit;
procedure Traverse_All_Ada_Units_For_Subs is
new Ada_Traversal (Yield_Unit_Subs);
procedure Traverse_All_Ada_Units is new Ada_Traversal (Yield_Unit);
begin
if Object.Is_Bad (Unit_Iter) then
raise Bad_Input_String;
end if;
Ad.Create (Document, To_Preview_Object, Status);
Ad_Specify.Cover (Document, "");
Ad_Specify.Cover_Item (Document, "");
Naming.Set_Default_Context (Current_Context, Object_Status);
Ad_Specify.Paragraph (Document, 1, "Analysis of all units");
declare
package Key_Table is new Table_Formatter (2);
begin
Key_Table.Header ("Metric", Format => Key_Table.Left);
Key_Table.Header ("Reference", Format => Key_Table.Centered);
Key_Table.Item ("Number of Use Clauses");
Key_Table.Item ("Uses");
Key_Table.Item ("Number of Goto Statements");
Key_Table.Item ("GoTos");
Key_Table.Item ("Number of Predefine Numerics");
Key_Table.Item ("Predefined");
Key_Table.Item ("Number of Uninitialized Variables");
Key_Table.Item ("Un-init");
Key_Table.Item ("Number of Anonymous Arrays");
Key_Table.Item ("Anons");
Key_Table.Display (Document, "Key");
end;
Unit_Table.Header ("Unit");
Unit_Table.Header ("Uses", Unit_Table.Right);
Unit_Table.Header ("GoTos", Unit_Table.Right);
Unit_Table.Header ("Predefined", Unit_Table.Right);
Unit_Table.Header ("Un-init", Unit_Table.Right);
Unit_Table.Header ("Anons", Unit_Table.Right);
Traverse_All_Ada_Units (Unit_Iter);
Unit_Table.Sort (1);
Unit_Table.Item ("TOTAL");
Unit_Table.Item (Integer'Image (Uses_Total));
Unit_Table.Item (Integer'Image (Goto_Total));
Unit_Table.Item (Integer'Image (Predefined_Total));
Unit_Table.Item (Integer'Image (Vars_Total));
Unit_Table.Item (Integer'Image (Anon_Total));
Unit_Table.Display (Document, "Unit Analysis");
Ad_Specify.Paragraph (Document, 2, "Analysis of all subprograms");
declare
package Key_Table is new Table_Formatter (2);
begin
Key_Table.Header ("Metric", Format => Key_Table.Left);
Key_Table.Header ("Reference", Format => Key_Table.Centered);
Key_Table.Item ("Number of Parameters");
Key_Table.Item ("Param");
Key_Table.Item ("Number of Branch Statements");
Key_Table.Item ("Brnch");
Key_Table.Item ("Maximun Branching Depth");
Key_Table.Item ("Dep");
Key_Table.Item ("Number of Exits");
Key_Table.Item ("Exit");
Key_Table.Item ("Number of Global References");
Key_Table.Item ("Glob");
Key_Table.Item ("Number of Local Declarations");
Key_Table.Item ("Decl");
Key_Table.Item ("Number of Statements");
Key_Table.Item ("Stmt");
Key_Table.Display (Document, "Key");
end;
Sub_Table.Header ("Unit");
Sub_Table.Header ("Param", Sub_Table.Right);
Sub_Table.Header ("Brnch", Sub_Table.Right);
Sub_Table.Header ("Dep", Sub_Table.Right);
Sub_Table.Header ("Exit", Sub_Table.Right);
Sub_Table.Header ("Glob", Sub_Table.Right);
Sub_Table.Header ("Decl", Sub_Table.Right);
Sub_Table.Header ("Stmt", Sub_Table.Right);
Traverse_All_Ada_Units_For_Subs (Unit_Iter);
Sub_Table.Sort (1);
Sub_Table.Display (Document, "Subprogram Analysis");
Ad.Close (Document);
Common.Definition (To_Preview_Object);
exception
when Bad_Input_String =>
Log.Put_Line ("Units string " & Units & " does not resolve",
Profile.Error_Msg);
Ad.Close (Document);
end Analyze;
nblk1=10
nid=e
hdr6=1e
[0x00] rec0=24 rec1=00 rec2=01 rec3=03c
[0x01] rec0=1d rec1=00 rec2=0f rec3=012
[0x02] rec0=01 rec1=00 rec2=02 rec3=012
[0x03] rec0=12 rec1=00 rec2=03 rec3=022
[0x04] rec0=12 rec1=00 rec2=04 rec3=04a
[0x05] rec0=12 rec1=00 rec2=05 rec3=002
[0x06] rec0=11 rec1=00 rec2=06 rec3=00c
[0x07] rec0=19 rec1=00 rec2=07 rec3=07c
[0x08] rec0=16 rec1=00 rec2=08 rec3=00a
[0x09] rec0=00 rec1=00 rec2=10 rec3=00a
[0x0a] rec0=16 rec1=00 rec2=09 rec3=070
[0x0b] rec0=1e rec1=00 rec2=0a rec3=054
[0x0c] rec0=1c rec1=00 rec2=0b rec3=062
[0x0d] rec0=18 rec1=00 rec2=0c rec3=070
[0x0e] rec0=1f rec1=00 rec2=0d rec3=000
[0x0f] rec0=00 rec1=00 rec2=00 rec3=000
tail 0x217001f28815c64e31016 0x42a00088462061e03
Free Block Chain:
0xe: 0000 00 00 00 0c 00 09 20 20 20 20 20 20 20 20 20 09 ┆ ┆