begin
if Current in Names.First .. Names.Last then
return Names.Table (Current).Location;
-
else
return No_Location;
end if;
begin
if Current >= Names.Last then
return "";
-
else
Current := Current + 1;
return Get_Name_String (Names.Table (Current).File_Name);
and then Src_Data.Unit = Unit
and then
((Src_Data.Kind = Spec and then Kind = Impl)
- or else
+ or else
(Src_Data.Kind = Impl and then Kind = Spec))
then
Other_Part := Source;
elsif (Unit /= No_Name
and then Src_Data.Unit = Unit
- and then
- (Src_Data.Kind = Kind
- or else
+ and then
+ (Src_Data.Kind = Kind
+ or else
(Src_Data.Kind = Sep and then Kind = Impl)
- or else
+ or else
(Src_Data.Kind = Impl and then Kind = Sep)))
or else (Unit = No_Name and then Src_Data.File = File_Name)
then
-- likely to happen.
Current_Stack_Level : aliased Integer;
+
begin
-- Reajust the pattern size. When we arrive in this function, there is
-- already a given amount of stack used, that we won't analyze.
- Analyzer.Stack_Used_When_Filling := Stack_Size
- (Analyzer.Bottom_Of_Stack,
- To_Stack_Address (Current_Stack_Level'Address))
- + Natural (Current_Stack_Level'Size);
+ Analyzer.Stack_Used_When_Filling :=
+ Stack_Size
+ (Analyzer.Bottom_Of_Stack,
+ To_Stack_Address (Current_Stack_Level'Address))
+ + Natural (Current_Stack_Level'Size);
- Analyzer.Pattern_Size := Analyzer.Pattern_Size
- - Analyzer.Stack_Used_When_Filling;
+ Analyzer.Pattern_Size :=
+ Analyzer.Pattern_Size - Analyzer.Stack_Used_When_Filling;
declare
Stack : aliased Stack_Slots
- (1 .. Analyzer.Pattern_Size / Bytes_Per_Pattern);
+ (1 .. Analyzer.Pattern_Size / Bytes_Per_Pattern);
+
begin
Stack := (others => Analyzer.Pattern);
Analyzer.Task_Name := (others => ' ');
- -- Compute the task name, and truncate it if it's bigger than
- -- Task_Name_Length
+ -- Compute the task name, and truncate if bigger than Task_Name_Length
if Task_Name'Length <= Task_Name_Length then
Analyzer.Task_Name (1 .. Task_Name'Length) := Task_Name;
procedure Report_Result (Analyzer : Stack_Analyzer) is
Measure : constant Natural :=
- Stack_Size
- (Analyzer.Topmost_Touched_Mark,
- Analyzer.Bottom_Of_Stack)
- + Analyzer.Stack_Used_When_Filling;
- Result : constant Task_Result :=
- (Task_Name => Analyzer.Task_Name,
- Max_Size => Analyzer.Stack_Size,
- Min_Measure => Measure,
- Max_Measure => Measure + Analyzer.Stack_Size
- - Analyzer.Pattern_Size);
+ Stack_Size
+ (Analyzer.Topmost_Touched_Mark,
+ Analyzer.Bottom_Of_Stack)
+ + Analyzer.Stack_Used_When_Filling;
+
+ Result : constant Task_Result :=
+ (Task_Name => Analyzer.Task_Name,
+ Max_Size => Analyzer.Stack_Size,
+ Min_Measure => Measure,
+ Max_Measure => Measure + Analyzer.Stack_Size
+ - Analyzer.Pattern_Size);
+
begin
if Analyzer.Result_Id in Result_Array'Range then
package SSE renames System.Storage_Elements;
- -- The alignment clause seems dubious, what about architectures where
- -- the maximum alignment is less than 4???
- -- Anyway, why not use Interfaces.Unsigned_32???
-
subtype Stack_Address is SSE.Integer_Address;
-- Address on the stack
renames System.Storage_Elements.To_Integer;
type Stack_Analyzer is private;
- -- Type of the stack analyzer tool. It is used to fill a portion of
- -- the stack with Pattern, and to compute the stack used after some
- -- execution.
+ -- Type of the stack analyzer tool. It is used to fill a portion of the
+ -- stack with Pattern, and to compute the stack used after some execution.
-- Usage:
-- Errors:
--
-- We are instrumenting the code to measure the stack used by the user
- -- code. This method has a number of systematic errors, but several
- -- methods can be used to evaluate or reduce those errors. Here are
- -- those errors and the strategy that we use to deal with them:
+ -- code. This method has a number of systematic errors, but several methods
+ -- can be used to evaluate or reduce those errors. Here are those errors
+ -- and the strategy that we use to deal with them:
-- Bottom offset:
-- Description: The pattern zone does not fit on the stack. This may
-- lead to an erroneous execution.
- -- Strategy: Specify a storage size that is bigger than the size of the
- -- pattern. 2 times bigger should be enough.
+ -- Strategy: Specify a storage size that is bigger than the size of the
+ -- pattern. 2 times bigger should be enough.
-- Augmentation of the user stack frames:
-- Should be called before any use of a Stack_Analyzer, to initialize it.
-- Max_Pattern_Size is the size of the pattern zone, might be smaller than
-- the full stack size in order to take into account e.g. the secondary
- -- stack and a gard against overflow. The actual size taken will be
- -- reajusted, with data already used at the time the stack is actually
+ -- stack and a guard against overflow. The actual size taken will be
+ -- reajusted with data already used at the time the stack is actually
-- filled.
Is_Enabled : Boolean := False;
Compute_Environment_Task : Boolean;
type Task_Result is record
- Task_Name : String (1 .. Task_Name_Length);
- Min_Measure : Natural;
- -- Minimal value for the measure.
+ Task_Name : String (1 .. Task_Name_Length);
+
+ Min_Measure : Natural;
+ -- Minimum value for the measure
- Max_Measure : Natural;
- -- Maximal value for the measure, taking into account the actual size
+ Max_Measure : Natural;
+ -- Maximum value for the measure, taking into account the actual size
-- of the pattern filled.
- Max_Size : Natural;
+ Max_Size : Natural;
end record;
type Result_Array_Type is array (Positive range <>) of Task_Result;
elsif Implements_Interface (Typ, Iface) then
if (Ekind (Etype (Prim)) = E_Anonymous_Access_Type)
- /= (Ekind (Etype (Iface_Prim)) = E_Anonymous_Access_Type)
+ /=
+ (Ekind (Etype (Iface_Prim)) = E_Anonymous_Access_Type)
then
return False;
-
else
return
Type_Conformant (Prim, Iface_Prim,