|
|
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_Objects, seg_004407
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦this⟧
with Log;
with Profile;
with Common;
with Add_Hyper_Table;
with Create_Null_Document;
with Lrm_Renames;
use Lrm_Renames;
with Directory_Renames;
use Directory_Renames;
with Errors;
with Simple_Status;
with Id_Referencers;
with Lrm_Utilities;
with Size_Utilities;
package body Find_Objects is
type Reference_Data is
record
Sets : Ada.Element_List;
Uses : Ada.Element_List;
end record;
Nil_Data : constant Reference_Data := (Ada.Nil_List, Ada.Nil_List);
function Is_Id (Elem : Ada.Element) return Boolean is
begin
return (Ada.Id_Kind (Elem) = Ada.An_Identifier_Definition);
end Is_Id;
procedure Pre_Op (Program_Element : Ada.Element;
State : in out Reference_Data;
Control : in out Ada.Traversal_Control) is
begin
if (Ada.Id_Kind (Program_Element) = Ada.An_Identifier_Reference) then
case Id_Referencers.Kind (Program_Element) is
when Id_Referencers.Set =>
Ada.Append (Program_Element, State.Sets);
when Id_Referencers.Used =>
Ada.Append (Program_Element, State.Uses);
when Id_Referencers.Set_And_Used =>
Ada.Append (Program_Element, State.Sets);
Ada.Append (Program_Element, State.Uses);
end case;
end if;
end Pre_Op;
procedure Post_Op (Program_Element : Ada.Element;
State : in out Reference_Data;
Control : in out Ada.Traversal_Control) is
begin
Control := Ada.Continue;
end Post_Op;
procedure Traverse_References is new Ada.Depth_First_Traversal
(Reference_Data, Pre_Op, Post_Op);
function Has_Ancestor_Subprogram (Element : Ada.Element) return Boolean is
Parent : Ada.Element := Ada.Parent (Element);
begin
if Ada.Is_Nil (Parent) then
return False; -- we never hit a subprogram
elsif Ada."=" (Ada.Kind (Parent), Ada.A_Statement) then
return True; -- decl was in a declare block
elsif Decls.Is_Subprogram (Parent) then
return True;
else
return Has_Ancestor_Subprogram (Parent);
end if;
end Has_Ancestor_Subprogram;
procedure Collect_References (For_Decl_Id : Ada.Element;
Into : in out Reference_Data) is
Dependent_Units : Ada.Element_List :=
Ada.Usage (Reference => For_Decl_Id,
Global => True,
Limit => "<ALL_WORLDS>",
Closure => False);
begin
while not Ada.Done (Dependent_Units) loop
Traverse_References (Ada.Value (Dependent_Units), Into, False);
Ada.Next (Dependent_Units);
end loop;
end Collect_References;
procedure Add (Units : String := "";
Do_Set_Used_Analysis : Boolean := True;
To_Document : in out Abstract_Document.Handle;
Response : String := "<PROFILE>") is
Units_Iter : Object.Iterator := Naming.Resolution (Units);
type Columns is (Obj_Size, Obj_Name, Obj_Type, C_Or_V, Set, Used);
Data : Reference_Data;
function Is_Integer_Column (C : Columns) return Boolean is
begin
case C is
when Obj_Size | Set | Used =>
return True;
when others =>
return False;
end case;
end Is_Integer_Column;
function Is_Included (Elem : Ada.Element) return Boolean is
Enclosing : Ada.Element;
begin
if Is_Id (Elem) then
Enclosing := Decls.Enclosing_Declaration (Elem);
case Decls.Kind (Enclosing) is
when Decls.A_Variable_Declaration |
Decls.A_Constant_Declaration |
Decls.A_Deferred_Constant_Declaration |
Decls.An_Integer_Number_Declaration |
Decls.A_Real_Number_Declaration =>
if Lrm_Utilities.Is_Actual_Variable_Declaration
(Enclosing) then
if Do_Set_Used_Analysis then
Data := Nil_Data;
Collect_References (Elem, Data);
if Decls.Is_Initialized (Enclosing) then
Ada.Append (Decls.Initial_Value (Enclosing),
Data.Sets);
end if;
end if;
return True;
else
return False;
end if;
when others =>
return False;
end case;
else
return False;
end if;
end Is_Included;
function Explanation (C : Columns; Elem : Ada.Element) return String is
begin
case C is
when Obj_Name =>
return "Name of the object declaration";
when Obj_Type =>
case Decls.Kind (Elem) is
when Decls.An_Integer_Number_Declaration |
Decls.A_Real_Number_Declaration =>
return
"Integer and Real number declarations have no explicit type";
when others =>
return "Name of the object's type";
end case;
when Obj_Size =>
case Decls.Kind (Elem) is
when Decls.An_Integer_Number_Declaration |
Decls.A_Deferred_Constant_Declaration |
Decls.A_Real_Number_Declaration =>
return "This declaration has no size";
when others =>
return
"Size of the object in bytes. Zero indicates non-static size";
end case;
when C_Or_V =>
case Decls.Kind (Elem) is
when Decls.A_Variable_Declaration =>
if Has_Ancestor_Subprogram (Elem) then
return "Subprogram local variable";
else
return "Variable declaration in a package";
end if;
when Decls.An_Integer_Number_Declaration =>
return "An Integer Number declaration";
when Decls.A_Real_Number_Declaration =>
return "A Real Number declaration";
when others =>
if Has_Ancestor_Subprogram (Elem) then
return "Constant declared in a subprogram";
else
return "Constant declared in a package";
end if;
end case;
when Set =>
return "Number of places where the object is set";
when Used =>
return "Number of places where the object is used";
end case;
end Explanation;
function Column_Image (C : Columns; Elem : Ada.Element) return String is
Object_Size : Size_Utilities.Long_Natural;
Static : Boolean := True;
begin
case C is
when Obj_Name =>
return Decls.Name (Elem);
when Obj_Type =>
case Decls.Kind (Elem) is
when Decls.An_Integer_Number_Declaration |
Decls.A_Real_Number_Declaration =>
return "[NO TYPE]";
when Decls.A_Deferred_Constant_Declaration =>
return Decls.Name
(Decls.Enclosing_Declaration
(Ada.Definition
(Decls.Type_Mark (Elem))));
when others =>
return Decls.Name (Decls.Enclosing_Declaration
(Ada.Definition
(Decls.Object_Type (Elem))));
end case;
when Obj_Size =>
case Decls.Kind (Elem) is
when Decls.An_Integer_Number_Declaration |
Decls.A_Deferred_Constant_Declaration |
Decls.A_Real_Number_Declaration =>
return " 0";
when others =>
Size_Utilities.Object_Size
(For_Object =>
Decls.Enclosing_Declaration (Elem),
Result => Object_Size,
Static => Static);
return Long_Integer'Image (Object_Size / 8);
end case;
when C_Or_V =>
case Decls.Kind (Elem) is
when Decls.A_Variable_Declaration =>
if Has_Ancestor_Subprogram (Elem) then
return "Variable";
else
return "Pkg Variable";
end if;
when Decls.An_Integer_Number_Declaration =>
return "Integer Number";
when Decls.A_Real_Number_Declaration =>
return "Real Number";
when others =>
if Has_Ancestor_Subprogram (Elem) then
return "Constant";
else
return "Pkg Constant";
end if;
end case;
when Set =>
return Integer'Image (Lrm_Utilities.Count (Data.Sets));
when Used =>
return Integer'Image (Lrm_Utilities.Count (Data.Uses));
end case;
end Column_Image;
procedure Linkage (C : Columns;
Elem : Ada.Element;
Linkage_Element : out Ada.Element;
Linkage_Elements : out Ada.Element_List) is
begin
-- default values changed within the case statement as necessary
Linkage_Element := Ada.Nil_Element;
Linkage_Elements := Ada.Nil_List;
case C is
when Obj_Name =>
Linkage_Element := Elem;
when Obj_Type =>
case Decls.Kind (Elem) is
when Decls.An_Integer_Number_Declaration |
Decls.A_Deferred_Constant_Declaration | Decls.A_Real_Number_Declaration =>
Linkage_Element := Ada.Nil_Element;
when others =>
Linkage_Element :=
Decls.Enclosing_Declaration
(Ada.Definition (Decls.Object_Type (Elem)));
end case;
when C_Or_V | Obj_Size =>
Linkage_Element := Ada.Nil_Element;
when Set =>
Linkage_Elements := Data.Sets;
when Used =>
Linkage_Elements := Data.Uses;
end case;
end Linkage;
procedure Add_Hyper_Table_To_Doc is
new Add_Hyper_Table
(Is_Included,
Columns,
Is_Integer_Column, Column_Image, Explanation, Linkage,
Table_Title => "OBJECT DECLARATIONS");
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 := "";
Do_Set_Used_Analysis : Boolean := True;
To_Preview_Object : String := "Object_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, Do_Set_Used_Analysis, Document, Response);
Abstract_Document.Close (Document);
Common.Definition (To_Preview_Object);
end case;
end Display;
end Find_Objects;
nblk1=11
nid=0
hdr6=22
[0x00] rec0=24 rec1=00 rec2=01 rec3=00e
[0x01] rec0=16 rec1=00 rec2=02 rec3=092
[0x02] rec0=18 rec1=00 rec2=03 rec3=086
[0x03] rec0=1d rec1=00 rec2=04 rec3=044
[0x04] rec0=15 rec1=00 rec2=05 rec3=074
[0x05] rec0=1b rec1=00 rec2=06 rec3=0b4
[0x06] rec0=13 rec1=00 rec2=07 rec3=028
[0x07] rec0=13 rec1=00 rec2=08 rec3=018
[0x08] rec0=17 rec1=00 rec2=09 rec3=002
[0x09] rec0=00 rec1=00 rec2=11 rec3=00a
[0x0a] rec0=12 rec1=00 rec2=0a rec3=03a
[0x0b] rec0=15 rec1=00 rec2=0b rec3=026
[0x0c] rec0=15 rec1=00 rec2=0c rec3=08c
[0x0d] rec0=01 rec1=00 rec2=10 rec3=002
[0x0e] rec0=18 rec1=00 rec2=0d rec3=012
[0x0f] rec0=17 rec1=00 rec2=0e rec3=070
[0x10] rec0=0d rec1=00 rec2=0f rec3=000
tail 0x2170016cc815c638cd1fd 0x42a00088462061e03