summaryrefslogtreecommitdiff
path: root/gcc/ada/s-tasdeb.adb
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ada/s-tasdeb.adb')
-rw-r--r--gcc/ada/s-tasdeb.adb563
1 files changed, 80 insertions, 483 deletions
diff --git a/gcc/ada/s-tasdeb.adb b/gcc/ada/s-tasdeb.adb
index c437117bc47..f8f50b9a1bb 100644
--- a/gcc/ada/s-tasdeb.adb
+++ b/gcc/ada/s-tasdeb.adb
@@ -27,21 +27,21 @@
-- covered by the GNU Public License. --
-- --
-- GNARL was developed by the GNARL team at Florida State University. --
--- Extensive contributions were provided by Ada Core Technologies Inc. --
+-- Extensive contributions were provided by Ada Core Technologies, Inc. --
-- --
------------------------------------------------------------------------------
-- This package encapsulates all direct interfaces to task debugging services
--- that are needed by gdb with gnat mode (1.13 and higher)
+-- that are needed by gdb with gnat mode.
-- Note : This file *must* be compiled with debugging information
-- Do not add any dependency to GNARL packages since this package is used
-- in both normal and restricted (ravenscar) environments.
-with System.Task_Info,
- System.Task_Primitives.Operations,
- Unchecked_Conversion;
+with Interfaces.C;
+with System.Task_Primitives.Operations;
+with Unchecked_Conversion;
package body System.Tasking.Debug is
@@ -49,25 +49,8 @@ package body System.Tasking.Debug is
package STPO renames System.Task_Primitives.Operations;
- type Integer_Address is mod 2 ** Standard'Address_Size;
-
- function "+" is new
- Unchecked_Conversion (Task_ID, Integer_Address);
-
- Hex_Address_Width : constant := (Standard'Address_Size / 4);
-
- Hex_Digits : constant array (0 .. Integer_Address'(15)) of Character :=
- "0123456789abcdef";
-
- subtype Buf_Range is Integer range 1 .. 80;
- type Buf_Array is array (Buf_Range) of aliased Character;
-
- type Buffer is record
- Next : Buf_Range := Buf_Range'First;
- Chars : Buf_Array := (Buf_Range => ' ');
- end record;
-
- type Buffer_Ptr is access all Buffer;
+ function To_Integer is new
+ Unchecked_Conversion (Task_ID, System.Address);
type Trace_Flag_Set is array (Character) of Boolean;
@@ -77,98 +60,31 @@ package body System.Tasking.Debug is
-- Local Subprograms --
-----------------------
- procedure Put
- (T : ST.Task_ID;
- Width : Integer;
- Buffer : Buffer_Ptr);
- -- Put TCB pointer T, (coded in hexadecimal) into Buffer
- -- right-justified in Width characters.
-
- procedure Put
- (N : Integer_Address;
- Width : Integer;
- Buffer : Buffer_Ptr);
- -- Put N (coded in decimal) into Buf right-justified in Width
- -- characters starting at Buf (Next).
-
- procedure Put
- (S : String;
- Width : Integer;
- Buffer : Buffer_Ptr);
- -- Put string S into Buf left-justified in Width characters
- -- starting with space in Buf (Next), truncated as necessary.
-
- procedure Put
- (C : Character;
- Buffer : Buffer_Ptr);
- -- Put character C into Buf, left-justified, starting at Buf (Next)
-
- procedure Space (Buffer : Buffer_Ptr);
- -- Increment Next, resulting in a space
-
- procedure Space
- (N : Integer;
- Buffer : Buffer_Ptr);
- -- Increment Next by N, resulting in N spaces
-
- procedure Clear (Buffer : Buffer_Ptr);
- -- Clear Buf and reset Next to 1
-
- procedure Write_Buf (Buffer : Buffer_Ptr);
- -- Write contents of Buf (1 .. Next) to standard output
-
- -----------
- -- Clear --
- -----------
-
- procedure Clear (Buffer : Buffer_Ptr) is
- Next : Buf_Range renames Buffer.Next;
- Buf : Buf_Array renames Buffer.Chars;
-
- begin
- Buf := (Buf_Range => ' ');
- Next := 1;
- end Clear;
+ procedure write (Fd : Integer; S : String; Count : size_t);
+ pragma Import (C, write);
- -----------
- -- Image --
- -----------
+ procedure Put (S : String);
+ -- Display S on standard output.
- function Image (T : ST.Task_ID) return String is
- Buf : aliased Buffer;
- Result : String (1 .. Hex_Address_Width + 21);
+ procedure Put_Line (S : String := "");
+ -- Display S on standard output with an additional line terminator.
- use type System.Task_Info.Task_Image_Type;
+ --------------------
+ -- Get_User_State --
+ --------------------
+ function Get_User_State return Long_Integer is
begin
- Clear (Buf'Unchecked_Access);
- Put (T, Hex_Address_Width, Buf'Unchecked_Access);
- Put (':', Buf'Unchecked_Access);
- Put (Integer_Address (T.Serial_Number), 4, Buf'Unchecked_Access);
- Space (Buf'Unchecked_Access);
-
- if T.Common.Task_Image = null then
- Put ("", 15, Buf'Unchecked_Access);
- else
- Put (T.Common.Task_Image.all, 15, Buf'Unchecked_Access);
- end if;
-
- for J in Result'Range loop
- Result (J) := Buf.Chars (J);
- end loop;
-
- return Result;
- end Image;
+ return STPO.Self.User_State;
+ end Get_User_State;
----------------
-- List_Tasks --
----------------
procedure List_Tasks is
- C : ST.Task_ID;
-
+ C : Task_ID;
begin
- Print_Task_Info_Header;
C := All_Tasks_List;
while C /= null loop
@@ -177,29 +93,6 @@ package body System.Tasking.Debug is
end loop;
end List_Tasks;
- -----------------------
- -- Print_Accept_Info --
- -----------------------
-
- procedure Print_Accept_Info (T : ST.Task_ID) is
- Buf : aliased Buffer;
-
- begin
- if T.Open_Accepts = null then
- return;
- end if;
-
- Clear (Buf'Unchecked_Access);
- Space (10, Buf'Unchecked_Access);
- Put ("accepting:", 11, Buf'Unchecked_Access);
-
- for J in T.Open_Accepts.all'Range loop
- Put (Integer_Address (T.Open_Accepts (J).S), 3, Buf'Unchecked_Access);
- end loop;
-
- Write_Buf (Buf'Unchecked_Access);
- end Print_Accept_Info;
-
------------------------
-- Print_Current_Task --
------------------------
@@ -213,311 +106,117 @@ package body System.Tasking.Debug is
-- Print_Task_Info --
---------------------
- procedure Print_Task_Info (T : ST.Task_ID) is
+ procedure Print_Task_Info (T : Task_ID) is
Entry_Call : Entry_Call_Link;
- Buf : aliased Buffer;
-
- use type System.Task_Info.Task_Image_Type;
+ Parent : Task_ID;
begin
- Clear (Buf'Unchecked_Access);
- Put (T, Hex_Address_Width, Buf'Unchecked_Access);
- Put (':', Buf'Unchecked_Access);
- Put (' ', Buf'Unchecked_Access);
- Put (':', Buf'Unchecked_Access);
-
if T = null then
- Put (" null task", 10, Buf'Unchecked_Access);
- Write_Buf (Buf'Unchecked_Access);
+ Put_Line ("null task");
return;
end if;
- Put (Integer_Address (T.Serial_Number), 4, Buf'Unchecked_Access);
- Space (Buf'Unchecked_Access);
+ Put (T.Common.Task_Image (1 .. T.Common.Task_Image_Len) & ": " &
+ Task_States'Image (T.Common.State));
- if T.Common.Task_Image = null then
- Put ("", 15, Buf'Unchecked_Access);
- else
- Put (T.Common.Task_Image.all, 15, Buf'Unchecked_Access);
- end if;
+ Parent := T.Common.Parent;
- Space (Buf'Unchecked_Access);
- Put (Task_States'Image (T.Common.State), 10, Buf'Unchecked_Access);
- Space (Buf'Unchecked_Access);
-
- if T.Callable then
- Put ('C', Buf'Unchecked_Access);
+ if Parent = null then
+ Put (", parent: <none>");
else
- Space (Buf'Unchecked_Access);
+ Put (", parent: " &
+ Parent.Common.Task_Image (1 .. Parent.Common.Task_Image_Len));
end if;
- if T.Open_Accepts /= null then
- Put ('A', Buf'Unchecked_Access);
- else
- Space (Buf'Unchecked_Access);
- end if;
-
- if T.Common.Call /= null then
- Put ('C', Buf'Unchecked_Access);
- else
- Space (Buf'Unchecked_Access);
- end if;
+ Put (", prio:" & T.Common.Current_Priority'Img);
- if T.Terminate_Alternative then
- Put ('T', Buf'Unchecked_Access);
- else
- Space (Buf'Unchecked_Access);
+ if not T.Callable then
+ Put (", not callable");
end if;
if T.Aborting then
- Put ('A', Buf'Unchecked_Access);
- else
- Space (Buf'Unchecked_Access);
+ Put (", aborting");
end if;
- if T.Deferral_Level = 0 then
- Space (3, Buf'Unchecked_Access);
- else
- Put ('D', Buf'Unchecked_Access);
- if T.Deferral_Level < 0 then
- Put ("<0", 2, Buf'Unchecked_Access);
- elsif T.Deferral_Level > 1 then
- Put (Integer_Address (T.Deferral_Level), 2, Buf'Unchecked_Access);
- else
- Space (2, Buf'Unchecked_Access);
- end if;
+ if T.Deferral_Level /= 0 then
+ Put (", abort deferred");
end if;
- Space (Buf'Unchecked_Access);
- Put (Integer_Address (T.Master_of_Task), 1, Buf'Unchecked_Access);
- Space (Buf'Unchecked_Access);
- Put (Integer_Address (T.Master_Within), 1, Buf'Unchecked_Access);
- Put (',', Buf'Unchecked_Access);
- Space (Buf'Unchecked_Access);
- Put (Integer_Address (T.Awake_Count), 1, Buf'Unchecked_Access);
- Space (Buf'Unchecked_Access);
- Put (Integer_Address (T.Alive_Count), 1, Buf'Unchecked_Access);
- Put (',', Buf'Unchecked_Access);
- Space (Buf'Unchecked_Access);
- Put (Integer_Address (T.ATC_Nesting_Level), 1, Buf'Unchecked_Access);
- Space (Buf'Unchecked_Access);
- Put (Integer_Address (T.Pending_ATC_Level), 1, Buf'Unchecked_Access);
- Put (',', Buf'Unchecked_Access);
- Space (Buf'Unchecked_Access);
- Put (Integer_Address (T.Common.Wait_Count), 1, Buf'Unchecked_Access);
- Put (',', Buf'Unchecked_Access);
- Space (Buf'Unchecked_Access);
- Put (Integer_Address (T.User_State), 1, Buf'Unchecked_Access);
- Write_Buf (Buf'Unchecked_Access);
-
if T.Common.Call /= null then
Entry_Call := T.Common.Call;
- Clear (Buf'Unchecked_Access);
- Space (10, Buf'Unchecked_Access);
- Put ("serving:", 8, Buf'Unchecked_Access);
+ Put (", serving:");
while Entry_Call /= null loop
- Put (Integer_Address
- (Entry_Call.Self.Serial_Number), 5, Buf'Unchecked_Access);
+ Put (To_Integer (Entry_Call.Self)'Img);
Entry_Call := Entry_Call.Acceptor_Prev_Call;
end loop;
-
- Write_Buf (Buf'Unchecked_Access);
end if;
- Print_Accept_Info (T);
- end Print_Task_Info;
-
- ----------------------------
- -- Print_Task_Info_Header --
- ----------------------------
-
- procedure Print_Task_Info_Header is
- Buf : aliased Buffer;
-
- begin
- Clear (Buf'Unchecked_Access);
- Put ("TASK_ID", Hex_Address_Width, Buf'Unchecked_Access);
- Put (':', Buf'Unchecked_Access);
- Put ('F', Buf'Unchecked_Access);
- Put (':', Buf'Unchecked_Access);
- Put ("SERIAL_NUMBER", 4, Buf'Unchecked_Access);
- Space (Buf'Unchecked_Access);
- Put (" NAME", 15, Buf'Unchecked_Access);
- Put (" STATE", 10, Buf'Unchecked_Access);
- Space (11, Buf'Unchecked_Access);
- Put ("MAST", 5, Buf'Unchecked_Access);
- Put ("AWAK", 5, Buf'Unchecked_Access);
- Put ("ATC", 5, Buf'Unchecked_Access);
- Put ("WT", 3, Buf'Unchecked_Access);
- Put ("DBG", 3, Buf'Unchecked_Access);
- Write_Buf (Buf'Unchecked_Access);
- end Print_Task_Info_Header;
-
- ---------
- -- Put --
- ---------
-
- procedure Put
- (T : ST.Task_ID;
- Width : Integer;
- Buffer : Buffer_Ptr)
- is
- J : Integer;
- X : Integer_Address := +T;
- Next : Buf_Range renames Buffer.Next;
- Buf : Buf_Array renames Buffer.Chars;
- First : constant Integer := Next;
- Wdth : Integer := Width;
-
- begin
- if Wdth > Buf'Last - Next then
- Wdth := Buf'Last - Next;
- end if;
-
- J := Next + (Wdth - 1);
-
- if X = 0 then
- Buf (J) := '0';
-
- else
- while X > 0 loop
- Buf (J) := Hex_Digits (X rem 16);
- J := J - 1;
- X := X / 16;
-
- -- Check for overflow
-
- if J < First and then X > 0 then
- Buf (J + 1) := '*';
- exit;
- end if;
+ if T.Open_Accepts /= null then
+ Put (", accepting:");
+ for J in T.Open_Accepts'Range loop
+ Put (T.Open_Accepts (J).S'Img);
end loop;
- end if;
-
- Next := Next + Wdth;
- end Put;
- procedure Put
- (N : Integer_Address;
- Width : Integer;
- Buffer : Buffer_Ptr)
- is
- J : Integer;
- X : Integer_Address := N;
- Next : Buf_Range renames Buffer.Next;
- Buf : Buf_Array renames Buffer.Chars;
- First : constant Integer := Next;
- Wdth : Integer := Width;
-
- begin
- if Wdth > Buf'Last - Next then
- Wdth := Buf'Last - Next;
+ if T.Terminate_Alternative then
+ Put (" or terminate");
+ end if;
end if;
- J := Next + (Wdth - 1);
-
- if N = 0 then
- Buf (J) := '0';
-
- else
- while X > 0 loop
- Buf (J) := Hex_Digits (X rem 10);
- J := J - 1;
- X := X / 10;
-
- -- Check for overflow
-
- if J < First and then X > 0 then
- Buf (J + 1) := '*';
- exit;
- end if;
- end loop;
+ if T.User_State /= 0 then
+ Put (", state:" & T.User_State'Img);
end if;
- Next := Next + Wdth;
- end Put;
+ Put_Line;
+ end Print_Task_Info;
- procedure Put
- (S : String;
- Width : Integer;
- Buffer : Buffer_Ptr)
- is
- Next : Buf_Range renames Buffer.Next;
- Buf : Buf_Array renames Buffer.Chars;
- Bound : constant Integer := Integer'Min (Next + Width, Buf'Last);
- J : Integer := Next;
+ ---------
+ -- Put --
+ ---------
+ procedure Put (S : String) is
begin
- for K in S'Range loop
-
- -- Check overflow
-
- if J >= Bound then
- Buf (J - 1) := '*';
- exit;
- end if;
-
- Buf (J) := S (K);
- J := J + 1;
- end loop;
-
- Next := Bound;
+ write (2, S, S'Length);
end Put;
- procedure Put
- (C : Character;
- Buffer : Buffer_Ptr)
- is
- Next : Buf_Range renames Buffer.Next;
- Buf : Buf_Array renames Buffer.Chars;
+ --------------
+ -- Put_Line --
+ --------------
+ procedure Put_Line (S : String := "") is
begin
- if Next >= Buf'Last then
- Buf (Next) := '*';
- else Buf (Next) := C;
- Next := Next + 1;
- end if;
- end Put;
+ write (2, S & ASCII.LF, S'Length + 1);
+ end Put_Line;
----------------------
-- Resume_All_Tasks --
----------------------
procedure Resume_All_Tasks (Thread_Self : OS_Interface.Thread_Id) is
- C : ST.Task_ID;
- R : Boolean;
+ C : Task_ID;
+ Dummy : Boolean;
+ pragma Unreferenced (Dummy);
begin
STPO.Lock_RTS;
C := All_Tasks_List;
while C /= null loop
- R := STPO.Resume_Task (C, Thread_Self);
+ Dummy := STPO.Resume_Task (C, Thread_Self);
C := C.Common.All_Tasks_Link;
end loop;
STPO.Unlock_RTS;
end Resume_All_Tasks;
- ----------
- -- Self --
- ----------
-
- function Self return Task_ID is
- begin
- return STPO.Self;
- end Self;
-
---------------
-- Set_Trace --
---------------
procedure Set_Trace
(Flag : Character;
- Value : Boolean := True)
- is
+ Value : Boolean := True) is
begin
Trace_On (Flag) := Value;
end Set_Trace;
@@ -526,56 +225,26 @@ package body System.Tasking.Debug is
-- Set_User_State --
--------------------
- procedure Set_User_State (Value : Integer) is
+ procedure Set_User_State (Value : Long_Integer) is
begin
STPO.Self.User_State := Value;
end Set_User_State;
- -----------
- -- Space --
- -----------
-
- procedure Space (Buffer : Buffer_Ptr) is
- Next : Buf_Range renames Buffer.Next;
- Buf : Buf_Array renames Buffer.Chars;
-
- begin
- if Next >= Buf'Last then
- Buf (Next) := '*';
- else
- Next := Next + 1;
- end if;
- end Space;
-
- procedure Space
- (N : Integer;
- Buffer : Buffer_Ptr)
- is
- Next : Buf_Range renames Buffer.Next;
- Buf : Buf_Array renames Buffer.Chars;
-
- begin
- if Next + N > Buf'Last then
- Buf (Next) := '*';
- else
- Next := Next + N;
- end if;
- end Space;
-
-----------------------
-- Suspend_All_Tasks --
-----------------------
procedure Suspend_All_Tasks (Thread_Self : OS_Interface.Thread_Id) is
- C : ST.Task_ID;
- R : Boolean;
+ C : Task_ID;
+ Dummy : Boolean;
+ pragma Unreferenced (Dummy);
begin
STPO.Lock_RTS;
C := All_Tasks_List;
while C /= null loop
- R := STPO.Suspend_Task (C, Thread_Self);
+ Dummy := STPO.Suspend_Task (C, Thread_Self);
C := C.Common.All_Tasks_Link;
end loop;
@@ -609,95 +278,23 @@ package body System.Tasking.Debug is
-----------
procedure Trace
- (Self_ID : ST.Task_ID;
+ (Self_Id : Task_ID;
Msg : String;
- Other_ID : ST.Task_ID;
- Flag : Character)
- is
- Buf : aliased Buffer;
- use type System.Task_Info.Task_Image_Type;
-
+ Flag : Character;
+ Other_Id : Task_ID := null) is
begin
if Trace_On (Flag) then
- Clear (Buf'Unchecked_Access);
- Put (Self_ID, Hex_Address_Width, Buf'Unchecked_Access);
- Put (':', Buf'Unchecked_Access);
- Put (Flag, Buf'Unchecked_Access);
- Put (':', Buf'Unchecked_Access);
- Put
- (Integer_Address (Self_ID.Serial_Number),
- 4, Buf'Unchecked_Access);
- Space (Buf'Unchecked_Access);
-
- if Self_ID.Common.Task_Image = null then
- Put ("", 15, Buf'Unchecked_Access);
- else
- Put (Self_ID.Common.Task_Image.all, 15, Buf'Unchecked_Access);
- end if;
-
- Space (Buf'Unchecked_Access);
+ Put (To_Integer (Self_Id)'Img &
+ ':' & Flag & ':' &
+ Self_Id.Common.Task_Image (1 .. Self_Id.Common.Task_Image_Len) &
+ ':');
- if Other_ID /= null then
- Put
- (Integer_Address (Other_ID.Serial_Number),
- 4, Buf'Unchecked_Access);
- Space (Buf'Unchecked_Access);
+ if Other_Id /= null then
+ Put (To_Integer (Other_Id)'Img & ':');
end if;
- Put (Msg, Buf.Chars'Last - Buf.Next + 1, Buf'Unchecked_Access);
- Write_Buf (Buf'Unchecked_Access);
+ Put_Line (Msg);
end if;
end Trace;
- procedure Trace
- (Self_ID : ST.Task_ID;
- Msg : String;
- Flag : Character)
- is
- begin
- Trace (Self_ID, Msg, null, Flag);
- end Trace;
-
- procedure Trace
- (Msg : String;
- Flag : Character)
- is
- Self_ID : constant ST.Task_ID := STPO.Self;
-
- begin
- Trace (Self_ID, Msg, null, Flag);
- end Trace;
-
- procedure Trace
- (Msg : String;
- Other_ID : ST.Task_ID;
- Flag : Character)
- is
- pragma Warnings (Off, Other_ID);
-
- Self_ID : constant ST.Task_ID := STPO.Self;
-
- begin
- Trace (Self_ID, Msg, null, Flag);
- end Trace;
-
- ---------------
- -- Write_Buf --
- ---------------
-
- procedure Write_Buf (Buffer : Buffer_Ptr) is
- Next : Buf_Range renames Buffer.Next;
- Buf : Buf_Array renames Buffer.Chars;
-
- procedure put_char (C : Integer);
- pragma Import (C, put_char, "put_char");
-
- begin
- for J in 1 .. Next - 1 loop
- put_char (Character'Pos (Buf (J)));
- end loop;
-
- put_char (Character'Pos (ASCII.LF));
- end Write_Buf;
-
end System.Tasking.Debug;