-- --
-- B o d y --
-- --
--- Copyright (C) 1992-2005 Free Software Foundation, Inc. --
+-- Copyright (C) 1992-2007, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
-- for more details. You should have received a copy of the GNU General --
-- Public License distributed with GNAT; see file COPYING. If not, write --
--- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, --
--- MA 02111-1307, USA. --
+-- to the Free Software Foundation, 51 Franklin Street, Fifth Floor, --
+-- Boston, MA 02110-1301, USA. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- --
------------------------------------------------------------------------------
+-- This version of Ada.Exceptions is a full Ada 95 version, and Ada 2005
+-- features such as the additional definitions of Exception_Name returning
+-- Wide_[Wide_]String.
+
+-- It is used for building the compiler and the basic tools, since these
+-- builds may be done with bootstrap compilers that cannot handle these
+-- additions. The full version of Ada.Exceptions can be found in the files
+-- a-except-2005.ads/adb, and is used for all other builds where full Ada
+-- 2005 functionality is required. in particular, it is used for building
+-- run times on all targets.
+
+pragma Warnings (Off);
+pragma Compiler_Unit;
+pragma Warnings (On);
+
+pragma Style_Checks (All_Checks);
+-- No subprogram ordering check, due to logical grouping
+
pragma Polling (Off);
-- We must turn polling off for this unit, because otherwise we get
-- elaboration circularities with System.Exception_Tables.
-pragma Warnings (Off);
--- Since several constructs give warnings in 3.14a1, including unreferenced
--- variables and pragma Unreferenced itself.
-
with System; use System;
+with System.Exceptions; use System.Exceptions;
with System.Standard_Library; use System.Standard_Library;
with System.Soft_Links; use System.Soft_Links;
-with System.Machine_State_Operations; use System.Machine_State_Operations;
package body Ada.Exceptions is
- procedure builtin_longjmp (buffer : Address; Flag : Integer);
- pragma No_Return (builtin_longjmp);
- pragma Import (C, builtin_longjmp, "_gnat_builtin_longjmp");
-
pragma Suppress (All_Checks);
-- We definitely do not want exceptions occurring within this unit, or
-- we are in big trouble. If an exceptional situation does occur, better
-- that it not be raised, since raising it can cause confusing chaos.
- Zero_Cost_Exceptions : Integer;
- pragma Import (C, Zero_Cost_Exceptions, "__gl_zero_cost_exceptions");
- -- Boolean indicating if we are handling exceptions using a zero cost
- -- mechanism.
- --
- -- Note that although we currently do not support it, the GCC3 back-end
- -- tables are also potentially useable for setjmp/longjmp processing.
-
-----------------------
-- Local Subprograms --
-----------------------
-- from C clients using the given external name, even though they are not
-- technically visible in the Ada sense.
- procedure AAA;
- procedure ZZZ;
- -- Mark start and end of procedures in this package
- --
- -- The AAA and ZZZ procedures are used to provide exclusion bounds in
- -- calls to Call_Chain at exception raise points from this unit. The
- -- purpose is to arrange for the exception tracebacks not to include
- -- frames from routines involved in the raise process, as these are
- -- meaningless from the user's standpoint.
- --
- -- For these bounds to be meaningful, we need to ensure that the object
- -- code for the routines involved in processing a raise is located after
- -- the object code for AAA and before the object code for ZZZ. This will
- -- indeed be the case as long as the following rules are respected:
- --
- -- 1) The bodies of the subprograms involved in processing a raise
- -- are located after the body of AAA and before the body of ZZZ.
- --
- -- 2) No pragma Inline applies to any of these subprograms, as this
- -- could delay the corresponding assembly output until the end of
- -- the unit.
-
- Code_Address_For_AAA, Code_Address_For_ZZZ : System.Address;
- -- Used to represent addresses really inside the code range for AAA and
- -- ZZZ, initialized to the address of a label inside the corresponding
- -- procedure. This is initialization takes place inside the procedures
- -- themselves, which are called as part of the elaboration code.
- --
- -- We are doing this instead of merely using Proc'Address because on some
- -- platforms the latter does not yield the address we want, but the
- -- address of a stub or of a descriptor instead. This is the case at least
- -- on Alpha-VMS and PA-HPUX.
-
- procedure Call_Chain (Excep : EOA);
- -- Store up to Max_Tracebacks in Excep, corresponding to the current
- -- call chain.
-
- procedure Process_Raise_Exception
- (E : Exception_Id;
- From_Signal_Handler : Boolean);
+ procedure Process_Raise_Exception (E : Exception_Id);
pragma No_Return (Process_Raise_Exception);
-- This is the lowest level raise routine. It raises the exception
-- referenced by Current_Excep.all in the TSD, without deferring abort
-- (the caller must ensure that abort is deferred on entry).
- --
- -- This is the common implementation for Raise_Current_Excep and
- -- Raise_From_Signal_Handler. The origin of the call is indicated by the
- -- From_Signal_Handler argument.
procedure To_Stderr (S : String);
pragma Export (Ada, To_Stderr, "__gnat_to_stderr");
procedure Set_Exception_C_Msg
(Id : Exception_Id;
- Msg1 : Big_String_Ptr;
+ Msg1 : System.Address;
Line : Integer := 0;
- Msg2 : Big_String_Ptr := null);
+ Msg2 : System.Address := System.Null_Address);
-- This routine is called to setup the exception referenced by the
-- Current_Excep field in the TSD to contain the indicated Id value
-- and message. Msg1 is a null terminated string which is generated
pragma Export
(Ada, Tailored_Exception_Information,
"__gnat_tailored_exception_information");
- -- This is currently used by System.Tasking.Stages.
+ -- This is currently used by System.Tasking.Stages
end Exception_Data;
package Exception_Propagation is
- use Exception_Traces;
- -- Imports Notify_Unhandled_Exception and
- -- Unhandled_Exception_Terminate
-
- ------------------------------------
- -- Exception propagation routines --
- ------------------------------------
-
procedure Setup_Exception
(Excep : EOA;
Current : EOA;
Reraised : Boolean := False);
- -- Perform the necessary operations to prepare the propagation of Excep
- -- in a task where Current is the current occurrence. Excep is assumed
- -- to be a valid (non null) pointer.
- --
- -- This should be called before any (re-)setting of the current
- -- occurrence. Any such (re-)setting shall take care *not* to clobber
- -- the Private_Data component.
- --
- -- Having Current provided as an argument (instead of retrieving it via
- -- Get_Current_Excep internally) is required to allow one task to setup
- -- an exception for another task, which is used by Transfer_Occurrence.
-
- procedure Propagate_Exception (From_Signal_Handler : Boolean);
- pragma No_Return (Propagate_Exception);
- -- This procedure propagates the exception represented by the occurrence
- -- referenced by Current_Excep in the TSD for the current task.
+ -- Dummy routine used to share a-exexda.adb, do nothing
end Exception_Propagation;
procedure Raise_Current_Excep (E : Exception_Id);
pragma No_Return (Raise_Current_Excep);
pragma Export (C, Raise_Current_Excep, "__gnat_raise_nodefer_with_msg");
- -- This is a simple wrapper to Process_Raise_Exception setting the
- -- From_Signal_Handler argument to False.
+ -- This is a simple wrapper to Process_Raise_Exception.
--
-- This external name for Raise_Current_Excep is historical, and probably
-- should be changed but for now we keep it, because gdb and gigi know
procedure Raise_With_Location_And_Msg
(E : Exception_Id;
- F : Big_String_Ptr;
+ F : System.Address;
L : Integer;
- M : Big_String_Ptr := null);
+ M : System.Address := System.Null_Address);
pragma No_Return (Raise_With_Location_And_Msg);
-- Raise an exception with given exception id value. A filename and line
-- number is associated with the raise and is stored in the exception
-- this (if M is not null).
procedure Raise_Constraint_Error
- (File : Big_String_Ptr;
+ (File : System.Address;
Line : Integer);
pragma No_Return (Raise_Constraint_Error);
pragma Export
-- Raise constraint error with file:line information
procedure Raise_Constraint_Error_Msg
- (File : Big_String_Ptr;
+ (File : System.Address;
Line : Integer;
- Msg : Big_String_Ptr);
+ Msg : System.Address);
pragma No_Return (Raise_Constraint_Error_Msg);
pragma Export
(C, Raise_Constraint_Error_Msg, "__gnat_raise_constraint_error_msg");
-- Raise constraint error with file:line + msg information
procedure Raise_Program_Error
- (File : Big_String_Ptr;
+ (File : System.Address;
Line : Integer);
pragma No_Return (Raise_Program_Error);
pragma Export
-- Raise program error with file:line information
procedure Raise_Program_Error_Msg
- (File : Big_String_Ptr;
+ (File : System.Address;
Line : Integer;
- Msg : Big_String_Ptr);
+ Msg : System.Address);
pragma No_Return (Raise_Program_Error_Msg);
pragma Export
(C, Raise_Program_Error_Msg, "__gnat_raise_program_error_msg");
-- Raise program error with file:line + msg information
procedure Raise_Storage_Error
- (File : Big_String_Ptr;
+ (File : System.Address;
Line : Integer);
pragma No_Return (Raise_Storage_Error);
pragma Export
-- Raise storage error with file:line information
procedure Raise_Storage_Error_Msg
- (File : Big_String_Ptr;
+ (File : System.Address;
Line : Integer;
- Msg : Big_String_Ptr);
+ Msg : System.Address);
pragma No_Return (Raise_Storage_Error_Msg);
pragma Export
(C, Raise_Storage_Error_Msg, "__gnat_raise_storage_error_msg");
-- The following procedures provide an internal interface to help making
-- this explicit.
- procedure Save_Occurrence_And_Private
- (Target : out Exception_Occurrence;
- Source : Exception_Occurrence);
- -- Copy all the components of Source to Target as well as the
- -- Private_Data pointer.
-
procedure Save_Occurrence_No_Private
(Target : out Exception_Occurrence;
Source : Exception_Occurrence);
-- to the codes defined in Types.ads and a-types.h (for example,
-- the name Rcheck_05 refers to the Reason whose Pos code is 5).
- procedure Rcheck_00 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_01 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_02 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_03 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_04 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_05 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_06 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_07 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_08 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_09 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_10 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_11 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_12 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_13 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_14 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_15 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_16 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_17 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_18 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_19 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_20 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_21 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_22 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_23 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_24 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_25 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_26 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_27 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_28 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_29 (File : Big_String_Ptr; Line : Integer);
- procedure Rcheck_30 (File : Big_String_Ptr; Line : Integer);
+ procedure Rcheck_00 (File : System.Address; Line : Integer);
+ procedure Rcheck_01 (File : System.Address; Line : Integer);
+ procedure Rcheck_02 (File : System.Address; Line : Integer);
+ procedure Rcheck_03 (File : System.Address; Line : Integer);
+ procedure Rcheck_04 (File : System.Address; Line : Integer);
+ procedure Rcheck_05 (File : System.Address; Line : Integer);
+ procedure Rcheck_06 (File : System.Address; Line : Integer);
+ procedure Rcheck_07 (File : System.Address; Line : Integer);
+ procedure Rcheck_08 (File : System.Address; Line : Integer);
+ procedure Rcheck_09 (File : System.Address; Line : Integer);
+ procedure Rcheck_10 (File : System.Address; Line : Integer);
+ procedure Rcheck_11 (File : System.Address; Line : Integer);
+ procedure Rcheck_12 (File : System.Address; Line : Integer);
+ procedure Rcheck_13 (File : System.Address; Line : Integer);
+ procedure Rcheck_14 (File : System.Address; Line : Integer);
+ procedure Rcheck_15 (File : System.Address; Line : Integer);
+ procedure Rcheck_16 (File : System.Address; Line : Integer);
+ procedure Rcheck_17 (File : System.Address; Line : Integer);
+ procedure Rcheck_18 (File : System.Address; Line : Integer);
+ procedure Rcheck_19 (File : System.Address; Line : Integer);
+ procedure Rcheck_20 (File : System.Address; Line : Integer);
+ procedure Rcheck_21 (File : System.Address; Line : Integer);
+ procedure Rcheck_22 (File : System.Address; Line : Integer);
+ procedure Rcheck_23 (File : System.Address; Line : Integer);
+ procedure Rcheck_24 (File : System.Address; Line : Integer);
+ procedure Rcheck_25 (File : System.Address; Line : Integer);
+ procedure Rcheck_26 (File : System.Address; Line : Integer);
+ procedure Rcheck_27 (File : System.Address; Line : Integer);
+ procedure Rcheck_28 (File : System.Address; Line : Integer);
+ procedure Rcheck_29 (File : System.Address; Line : Integer);
+ procedure Rcheck_30 (File : System.Address; Line : Integer);
+ procedure Rcheck_31 (File : System.Address; Line : Integer);
+ procedure Rcheck_32 (File : System.Address; Line : Integer);
pragma Export (C, Rcheck_00, "__gnat_rcheck_00");
pragma Export (C, Rcheck_01, "__gnat_rcheck_01");
pragma Export (C, Rcheck_28, "__gnat_rcheck_28");
pragma Export (C, Rcheck_29, "__gnat_rcheck_29");
pragma Export (C, Rcheck_30, "__gnat_rcheck_30");
+ pragma Export (C, Rcheck_31, "__gnat_rcheck_31");
+ pragma Export (C, Rcheck_32, "__gnat_rcheck_32");
-- None of these procedures ever returns (they raise an exception!). By
-- using pragma No_Return, we ensure that any junk code after the call,
pragma No_Return (Rcheck_28);
pragma No_Return (Rcheck_29);
pragma No_Return (Rcheck_30);
+ pragma No_Return (Rcheck_32);
---------------------------------------------
-- Reason Strings for Run-Time Check Calls --
Rmsg_05 : constant String := "index check failed" & NUL;
Rmsg_06 : constant String := "invalid data" & NUL;
Rmsg_07 : constant String := "length check failed" & NUL;
- Rmsg_08 : constant String := "null-exclusion check failed" & NUL;
- Rmsg_09 : constant String := "overflow check failed" & NUL;
- Rmsg_10 : constant String := "partition check failed" & NUL;
- Rmsg_11 : constant String := "range check failed" & NUL;
- Rmsg_12 : constant String := "tag check failed" & NUL;
- Rmsg_13 : constant String := "access before elaboration" & NUL;
- Rmsg_14 : constant String := "accessibility check failed" & NUL;
- Rmsg_15 : constant String := "all guards closed" & NUL;
- Rmsg_16 : constant String := "duplicated entry address" & NUL;
- Rmsg_17 : constant String := "explicit raise" & NUL;
- Rmsg_18 : constant String := "finalize/adjust raised exception" & NUL;
- Rmsg_19 : constant String := "misaligned address value" & NUL;
- Rmsg_20 : constant String := "missing return" & NUL;
- Rmsg_21 : constant String := "overlaid controlled object" & NUL;
- Rmsg_22 : constant String := "potentially blocking operation" & NUL;
- Rmsg_23 : constant String := "stubbed subprogram called" & NUL;
- Rmsg_24 : constant String := "unchecked union restriction" & NUL;
- Rmsg_25 : constant String := "illegal use of"
- & " remote access-to-class-wide type, see RM E.4(18)" & NUL;
- Rmsg_26 : constant String := "empty storage pool" & NUL;
- Rmsg_27 : constant String := "explicit raise" & NUL;
- Rmsg_28 : constant String := "infinite recursion" & NUL;
- Rmsg_29 : constant String := "object too large" & NUL;
- Rmsg_30 : constant String := "restriction violation" & NUL;
+ Rmsg_08 : constant String := "null Exception_Id" & NUL;
+ Rmsg_09 : constant String := "null-exclusion check failed" & NUL;
+ Rmsg_10 : constant String := "overflow check failed" & NUL;
+ Rmsg_11 : constant String := "partition check failed" & NUL;
+ Rmsg_12 : constant String := "range check failed" & NUL;
+ Rmsg_13 : constant String := "tag check failed" & NUL;
+ Rmsg_14 : constant String := "access before elaboration" & NUL;
+ Rmsg_15 : constant String := "accessibility check failed" & NUL;
+ Rmsg_16 : constant String := "all guards closed" & NUL;
+ Rmsg_17 : constant String := "Current_Task referenced in entry" &
+ " body" & NUL;
+ Rmsg_18 : constant String := "duplicated entry address" & NUL;
+ Rmsg_19 : constant String := "explicit raise" & NUL;
+ Rmsg_20 : constant String := "finalize/adjust raised exception" & NUL;
+ Rmsg_21 : constant String := "implicit return with No_Return" & NUL;
+ Rmsg_22 : constant String := "misaligned address value" & NUL;
+ Rmsg_23 : constant String := "missing return" & NUL;
+ Rmsg_24 : constant String := "overlaid controlled object" & NUL;
+ Rmsg_25 : constant String := "potentially blocking operation" & NUL;
+ Rmsg_26 : constant String := "stubbed subprogram called" & NUL;
+ Rmsg_27 : constant String := "unchecked union restriction" & NUL;
+ Rmsg_28 : constant String := "actual/returned class-wide value "
+ & "not transportable" & NUL;
+ Rmsg_29 : constant String := "empty storage pool" & NUL;
+ Rmsg_30 : constant String := "explicit raise" & NUL;
+ Rmsg_31 : constant String := "infinite recursion" & NUL;
+ Rmsg_32 : constant String := "object too large" & NUL;
-----------------------
-- Polling Interface --
-- The actual polling routine is separate, so that it can easily
-- be replaced with a target dependent version.
- ---------
- -- AAA --
- ---------
-
- -- This dummy procedure gives us the start of the PC range for addresses
- -- within the exception unit itself. We hope that gigi/gcc keep all the
- -- procedures in their original order!
-
- procedure AAA is
- begin
- <<Start_Of_AAA>>
- Code_Address_For_AAA := Start_Of_AAA'Address;
- end AAA;
-
- ----------------
- -- Call_Chain --
- ----------------
-
- procedure Call_Chain (Excep : EOA) is separate;
- -- The actual Call_Chain routine is separate, so that it can easily
- -- be dummied out when no exception traceback information is needed.
-
------------------------------
-- Current_Target_Exception --
------------------------------
raise Constraint_Error;
end if;
- return Id.Full_Name.all (1 .. Id.Name_Length - 1);
+ return To_Ptr (Id.Full_Name) (1 .. Id.Name_Length - 1);
end Exception_Name;
function Exception_Name (X : Exception_Occurrence) return String is
-- This package can be easily dummied out if we do not want the
-- basic support for exception messages (such as in Ada 83).
- ---------------------------
- -- Exception_Propagation --
- ---------------------------
+ package body Exception_Propagation is
- package body Exception_Propagation is separate;
- -- Depending on the actual exception mechanism used (front-end or
- -- back-end based), the implementation will differ, which is why this
- -- package is separated.
+ procedure Setup_Exception
+ (Excep : EOA;
+ Current : EOA;
+ Reraised : Boolean := False)
+ is
+ pragma Warnings (Off, Excep);
+ pragma Warnings (Off, Current);
+ pragma Warnings (Off, Reraised);
+ begin
+ null;
+ end Setup_Exception;
+
+ end Exception_Propagation;
----------------------
-- Exception_Traces --
-- Process_Raise_Exception --
-----------------------------
- procedure Process_Raise_Exception
- (E : Exception_Id;
- From_Signal_Handler : Boolean)
- is
+ procedure Process_Raise_Exception (E : Exception_Id) is
pragma Inspection_Point (E);
-- This is so the debugger can reliably inspect the parameter
Jumpbuf_Ptr : constant Address := Get_Jmpbuf_Address.all;
- Excep : EOA := Get_Current_Excep.all;
+ Excep : constant EOA := Get_Current_Excep.all;
+
+ procedure builtin_longjmp (buffer : Address; Flag : Integer);
+ pragma No_Return (builtin_longjmp);
+ pragma Import (C, builtin_longjmp, "_gnat_builtin_longjmp");
begin
- -- WARNING : There should be no exception handler for this body
+ -- WARNING: There should be no exception handler for this body
-- because this would cause gigi to prepend a setup for a new
- -- jmpbuf to the sequence of statements. We would then always get
- -- this new buf in Jumpbuf_Ptr instead of the one for the exception
- -- we are handling, which would completely break the whole design
- -- of this procedure.
-
- -- Processing varies between zero cost and setjmp/lonjmp processing.
-
- if Zero_Cost_Exceptions /= 0 then
-
- -- Use the front-end tables to propagate if we have them, otherwise
- -- resort to the GCC back-end alternative. Backtrace computation is
- -- performed, if required, by the underlying routine. Notifications
- -- for the debugger are also not performed here, because we do not
- -- yet know if the exception is handled.
+ -- jmpbuf to the sequence of statements in case of built-in sjljl.
+ -- We would then always get this new buf in Jumpbuf_Ptr instead of the
+ -- one for the exception we are handling, which would completely break
+ -- the whole design of this procedure.
+
+ -- If the jump buffer pointer is non-null, transfer control using
+ -- it. Otherwise announce an unhandled exception (note that this
+ -- means that we have no finalizations to do other than at the outer
+ -- level). Perform the necessary notification tasks in both cases.
+
+ if Jumpbuf_Ptr /= Null_Address then
+ if not Excep.Exception_Raised then
+ Excep.Exception_Raised := True;
+ Exception_Traces.Notify_Handled_Exception;
+ end if;
- Exception_Propagation.Propagate_Exception (From_Signal_Handler);
+ builtin_longjmp (Jumpbuf_Ptr, 1);
else
- -- Compute the backtrace for this occurrence if the corresponding
- -- binder option has been set. Call_Chain takes care of the reraise
- -- case.
-
- Call_Chain (Excep);
- -- We used to only do this if From_Signal_Handler was not set,
- -- based on the assumption that backtracing from a signal handler
- -- would not work due to stack layout oddities. However, since
- --
- -- 1. The flag is never set in tasking programs (Notify_Exception
- -- performs regular raise statements), and
- --
- -- 2. No problem has shown up in tasking programs around here so
- -- far, this turned out to be too strong an assumption.
- --
- -- As, in addition, the test was
- --
- -- 1. preventing the production of backtraces in non-tasking
- -- programs, and
- --
- -- 2. introducing a behavior inconsistency between
- -- the tasking and non-tasking cases,
- --
- -- we have simply removed it.
-
- -- If the jump buffer pointer is non-null, transfer control using
- -- it. Otherwise announce an unhandled exception (note that this
- -- means that we have no finalizations to do other than at the outer
- -- level). Perform the necessary notification tasks in both cases.
-
- if Jumpbuf_Ptr /= Null_Address then
-
- if not Excep.Exception_Raised then
- Excep.Exception_Raised := True;
- Exception_Traces.Notify_Handled_Exception;
- end if;
-
- builtin_longjmp (Jumpbuf_Ptr, 1);
-
- else
- -- The pragma Inspection point here ensures that the debugger
- -- can inspect the parameter.
-
- pragma Inspection_Point (E);
-
- Exception_Traces.Notify_Unhandled_Exception;
- Exception_Traces.Unhandled_Exception_Terminate;
- end if;
+ Exception_Traces.Notify_Unhandled_Exception;
+ Exception_Traces.Unhandled_Exception_Terminate;
end if;
end Process_Raise_Exception;
----------------------------
procedure Raise_Constraint_Error
- (File : Big_String_Ptr;
+ (File : System.Address;
Line : Integer)
is
begin
--------------------------------
procedure Raise_Constraint_Error_Msg
- (File : Big_String_Ptr;
+ (File : System.Address;
Line : Integer;
- Msg : Big_String_Ptr)
+ Msg : System.Address)
is
begin
Raise_With_Location_And_Msg
-------------------------
procedure Raise_Current_Excep (E : Exception_Id) is
+
pragma Inspection_Point (E);
- -- This is so the debugger can reliably inspect the parameter
- begin
- Process_Raise_Exception (E => E, From_Signal_Handler => False);
+ -- This is so the debugger can reliably inspect the parameter when
+ -- inserting a breakpoint at the start of this procedure.
+
+ Id : Exception_Id := E;
+ pragma Volatile (Id);
+ pragma Warnings (Off, Id);
+ -- In order to provide support for breakpoints on unhandled exceptions,
+ -- the debugger will also need to be able to inspect the value of E from
+ -- another (inner) frame. So we need to make sure that if E is passed in
+ -- a register, its value is also spilled on stack. For this, we store
+ -- the parameter value in a local variable, and add a pragma Volatile to
+ -- make sure it is spilled. The pragma Warnings (Off) is needed because
+ -- the compiler knows that Id is not referenced and that this use of
+ -- pragma Volatile is peculiar!
+
+ begin
+ Debug_Raise_Exception (E => SSL.Exception_Data_Ptr (E));
+ Process_Raise_Exception (E);
end Raise_Current_Excep;
---------------------
Abort_Defer.all;
Raise_Current_Excep (E);
end if;
+
+ -- Note: if E is null then just return (Ada 95 semantics)
+
+ return;
end Raise_Exception;
----------------------------
Raise_Current_Excep (E);
end Raise_Exception_Always;
+ -------------------------------------
+ -- Raise_From_Controlled_Operation --
+ -------------------------------------
+
+ procedure Raise_From_Controlled_Operation
+ (X : Ada.Exceptions.Exception_Occurrence)
+ is
+ Prefix : constant String := "adjust/finalize raised ";
+ Orig_Msg : constant String := Exception_Message (X);
+ New_Msg : constant String := Prefix & Exception_Name (X);
+
+ begin
+ if Orig_Msg'Length >= Prefix'Length
+ and then
+ Orig_Msg (Orig_Msg'First .. Orig_Msg'First + Prefix'Length - 1) =
+ Prefix
+ then
+ -- Message already has proper prefix, just re-reraise PROGRAM_ERROR
+
+ Raise_Exception_No_Defer
+ (E => Program_Error'Identity,
+ Message => Orig_Msg);
+
+ elsif Orig_Msg = "" then
+
+ -- No message present: just provide our own
+
+ Raise_Exception_No_Defer
+ (E => Program_Error'Identity,
+ Message => New_Msg);
+
+ else
+ -- Message present, add informational prefix
+
+ Raise_Exception_No_Defer
+ (E => Program_Error'Identity,
+ Message => New_Msg & ": " & Orig_Msg);
+ end if;
+ end Raise_From_Controlled_Operation;
+
-------------------------------
-- Raise_From_Signal_Handler --
-------------------------------
procedure Raise_From_Signal_Handler
(E : Exception_Id;
- M : Big_String_Ptr)
+ M : System.Address)
is
begin
Exception_Data.Set_Exception_C_Msg (E, M);
Abort_Defer.all;
- Process_Raise_Exception (E => E, From_Signal_Handler => True);
+ Process_Raise_Exception (E);
end Raise_From_Signal_Handler;
-------------------------
-------------------------
procedure Raise_Program_Error
- (File : Big_String_Ptr;
+ (File : System.Address;
Line : Integer)
is
begin
-----------------------------
procedure Raise_Program_Error_Msg
- (File : Big_String_Ptr;
+ (File : System.Address;
Line : Integer;
- Msg : Big_String_Ptr)
+ Msg : System.Address)
is
begin
Raise_With_Location_And_Msg
-------------------------
procedure Raise_Storage_Error
- (File : Big_String_Ptr;
+ (File : System.Address;
Line : Integer)
is
begin
-----------------------------
procedure Raise_Storage_Error_Msg
- (File : Big_String_Ptr;
+ (File : System.Address;
Line : Integer;
- Msg : Big_String_Ptr)
+ Msg : System.Address)
is
begin
Raise_With_Location_And_Msg
procedure Raise_With_Location_And_Msg
(E : Exception_Id;
- F : Big_String_Ptr;
+ F : System.Address;
L : Integer;
- M : Big_String_Ptr := null)
+ M : System.Address := System.Null_Address)
is
begin
Exception_Data.Set_Exception_C_Msg (E, F, L, M);
Excep : constant EOA := Get_Current_Excep.all;
begin
- Exception_Propagation.Setup_Exception (Excep, Excep);
-
Excep.Exception_Raised := False;
Excep.Id := E;
Excep.Num_Tracebacks := 0;
-- Calls to Run-Time Check Routines --
--------------------------------------
- procedure Rcheck_00 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_00 (File : System.Address; Line : Integer) is
begin
- Raise_Constraint_Error_Msg (File, Line, To_Ptr (Rmsg_00'Address));
+ Raise_Constraint_Error_Msg (File, Line, Rmsg_00'Address);
end Rcheck_00;
- procedure Rcheck_01 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_01 (File : System.Address; Line : Integer) is
begin
- Raise_Constraint_Error_Msg (File, Line, To_Ptr (Rmsg_01'Address));
+ Raise_Constraint_Error_Msg (File, Line, Rmsg_01'Address);
end Rcheck_01;
- procedure Rcheck_02 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_02 (File : System.Address; Line : Integer) is
begin
- Raise_Constraint_Error_Msg (File, Line, To_Ptr (Rmsg_02'Address));
+ Raise_Constraint_Error_Msg (File, Line, Rmsg_02'Address);
end Rcheck_02;
- procedure Rcheck_03 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_03 (File : System.Address; Line : Integer) is
begin
- Raise_Constraint_Error_Msg (File, Line, To_Ptr (Rmsg_03'Address));
+ Raise_Constraint_Error_Msg (File, Line, Rmsg_03'Address);
end Rcheck_03;
- procedure Rcheck_04 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_04 (File : System.Address; Line : Integer) is
begin
- Raise_Constraint_Error_Msg (File, Line, To_Ptr (Rmsg_04'Address));
+ Raise_Constraint_Error_Msg (File, Line, Rmsg_04'Address);
end Rcheck_04;
- procedure Rcheck_05 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_05 (File : System.Address; Line : Integer) is
begin
- Raise_Constraint_Error_Msg (File, Line, To_Ptr (Rmsg_05'Address));
+ Raise_Constraint_Error_Msg (File, Line, Rmsg_05'Address);
end Rcheck_05;
- procedure Rcheck_06 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_06 (File : System.Address; Line : Integer) is
begin
- Raise_Constraint_Error_Msg (File, Line, To_Ptr (Rmsg_06'Address));
+ Raise_Constraint_Error_Msg (File, Line, Rmsg_06'Address);
end Rcheck_06;
- procedure Rcheck_07 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_07 (File : System.Address; Line : Integer) is
begin
- Raise_Constraint_Error_Msg (File, Line, To_Ptr (Rmsg_07'Address));
+ Raise_Constraint_Error_Msg (File, Line, Rmsg_07'Address);
end Rcheck_07;
- procedure Rcheck_08 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_08 (File : System.Address; Line : Integer) is
begin
- Raise_Constraint_Error_Msg (File, Line, To_Ptr (Rmsg_08'Address));
+ Raise_Constraint_Error_Msg (File, Line, Rmsg_08'Address);
end Rcheck_08;
- procedure Rcheck_09 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_09 (File : System.Address; Line : Integer) is
begin
- Raise_Constraint_Error_Msg (File, Line, To_Ptr (Rmsg_09'Address));
+ Raise_Constraint_Error_Msg (File, Line, Rmsg_09'Address);
end Rcheck_09;
- procedure Rcheck_10 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_10 (File : System.Address; Line : Integer) is
begin
- Raise_Constraint_Error_Msg (File, Line, To_Ptr (Rmsg_10'Address));
+ Raise_Constraint_Error_Msg (File, Line, Rmsg_10'Address);
end Rcheck_10;
- procedure Rcheck_11 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_11 (File : System.Address; Line : Integer) is
begin
- Raise_Constraint_Error_Msg (File, Line, To_Ptr (Rmsg_11'Address));
+ Raise_Constraint_Error_Msg (File, Line, Rmsg_11'Address);
end Rcheck_11;
- procedure Rcheck_12 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_12 (File : System.Address; Line : Integer) is
begin
- Raise_Constraint_Error_Msg (File, Line, To_Ptr (Rmsg_12'Address));
+ Raise_Constraint_Error_Msg (File, Line, Rmsg_12'Address);
end Rcheck_12;
- procedure Rcheck_13 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_13 (File : System.Address; Line : Integer) is
begin
- Raise_Program_Error_Msg (File, Line, To_Ptr (Rmsg_13'Address));
+ Raise_Constraint_Error_Msg (File, Line, Rmsg_13'Address);
end Rcheck_13;
- procedure Rcheck_14 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_14 (File : System.Address; Line : Integer) is
begin
- Raise_Program_Error_Msg (File, Line, To_Ptr (Rmsg_14'Address));
+ Raise_Program_Error_Msg (File, Line, Rmsg_14'Address);
end Rcheck_14;
- procedure Rcheck_15 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_15 (File : System.Address; Line : Integer) is
begin
- Raise_Program_Error_Msg (File, Line, To_Ptr (Rmsg_15'Address));
+ Raise_Program_Error_Msg (File, Line, Rmsg_15'Address);
end Rcheck_15;
- procedure Rcheck_16 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_16 (File : System.Address; Line : Integer) is
begin
- Raise_Program_Error_Msg (File, Line, To_Ptr (Rmsg_16'Address));
+ Raise_Program_Error_Msg (File, Line, Rmsg_16'Address);
end Rcheck_16;
- procedure Rcheck_17 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_17 (File : System.Address; Line : Integer) is
begin
- Raise_Program_Error_Msg (File, Line, To_Ptr (Rmsg_17'Address));
+ Raise_Program_Error_Msg (File, Line, Rmsg_17'Address);
end Rcheck_17;
- procedure Rcheck_18 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_18 (File : System.Address; Line : Integer) is
begin
- Raise_Program_Error_Msg (File, Line, To_Ptr (Rmsg_18'Address));
+ Raise_Program_Error_Msg (File, Line, Rmsg_18'Address);
end Rcheck_18;
- procedure Rcheck_19 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_19 (File : System.Address; Line : Integer) is
begin
- Raise_Program_Error_Msg (File, Line, To_Ptr (Rmsg_19'Address));
+ Raise_Program_Error_Msg (File, Line, Rmsg_19'Address);
end Rcheck_19;
- procedure Rcheck_20 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_20 (File : System.Address; Line : Integer) is
begin
- Raise_Program_Error_Msg (File, Line, To_Ptr (Rmsg_20'Address));
+ Raise_Program_Error_Msg (File, Line, Rmsg_20'Address);
end Rcheck_20;
- procedure Rcheck_21 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_21 (File : System.Address; Line : Integer) is
begin
- Raise_Program_Error_Msg (File, Line, To_Ptr (Rmsg_21'Address));
+ Raise_Program_Error_Msg (File, Line, Rmsg_21'Address);
end Rcheck_21;
- procedure Rcheck_22 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_22 (File : System.Address; Line : Integer) is
begin
- Raise_Program_Error_Msg (File, Line, To_Ptr (Rmsg_22'Address));
+ Raise_Program_Error_Msg (File, Line, Rmsg_22'Address);
end Rcheck_22;
- procedure Rcheck_23 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_23 (File : System.Address; Line : Integer) is
begin
- Raise_Program_Error_Msg (File, Line, To_Ptr (Rmsg_23'Address));
+ Raise_Program_Error_Msg (File, Line, Rmsg_23'Address);
end Rcheck_23;
- procedure Rcheck_24 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_24 (File : System.Address; Line : Integer) is
begin
- Raise_Program_Error_Msg (File, Line, To_Ptr (Rmsg_24'Address));
+ Raise_Program_Error_Msg (File, Line, Rmsg_24'Address);
end Rcheck_24;
- procedure Rcheck_25 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_25 (File : System.Address; Line : Integer) is
begin
- Raise_Program_Error_Msg (File, Line, To_Ptr (Rmsg_25'Address));
+ Raise_Program_Error_Msg (File, Line, Rmsg_25'Address);
end Rcheck_25;
- procedure Rcheck_26 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_26 (File : System.Address; Line : Integer) is
begin
- Raise_Storage_Error_Msg (File, Line, To_Ptr (Rmsg_26'Address));
+ Raise_Program_Error_Msg (File, Line, Rmsg_26'Address);
end Rcheck_26;
- procedure Rcheck_27 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_27 (File : System.Address; Line : Integer) is
begin
- Raise_Storage_Error_Msg (File, Line, To_Ptr (Rmsg_27'Address));
+ Raise_Program_Error_Msg (File, Line, Rmsg_27'Address);
end Rcheck_27;
- procedure Rcheck_28 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_28 (File : System.Address; Line : Integer) is
begin
- Raise_Storage_Error_Msg (File, Line, To_Ptr (Rmsg_28'Address));
+ Raise_Program_Error_Msg (File, Line, Rmsg_28'Address);
end Rcheck_28;
- procedure Rcheck_29 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_29 (File : System.Address; Line : Integer) is
begin
- Raise_Storage_Error_Msg (File, Line, To_Ptr (Rmsg_29'Address));
+ Raise_Storage_Error_Msg (File, Line, Rmsg_29'Address);
end Rcheck_29;
- procedure Rcheck_30 (File : Big_String_Ptr; Line : Integer) is
+ procedure Rcheck_30 (File : System.Address; Line : Integer) is
begin
- Raise_Storage_Error_Msg (File, Line, To_Ptr (Rmsg_30'Address));
+ Raise_Storage_Error_Msg (File, Line, Rmsg_30'Address);
end Rcheck_30;
+ procedure Rcheck_31 (File : System.Address; Line : Integer) is
+ begin
+ Raise_Storage_Error_Msg (File, Line, Rmsg_31'Address);
+ end Rcheck_31;
+
+ procedure Rcheck_32 (File : System.Address; Line : Integer) is
+ begin
+ Raise_Storage_Error_Msg (File, Line, Rmsg_32'Address);
+ end Rcheck_32;
+
-------------
-- Reraise --
-------------
begin
Abort_Defer.all;
- Exception_Propagation.Setup_Exception (Excep, Excep, Reraised => True);
Raise_Current_Excep (Excep.Id);
end Reraise;
begin
if X.Id /= null then
Abort_Defer.all;
- Exception_Propagation.Setup_Exception
- (X'Unrestricted_Access, Get_Current_Excep.all, Reraised => True);
Save_Occurrence_No_Private (Get_Current_Excep.all.all, X);
Raise_Current_Excep (X.Id);
end if;
procedure Reraise_Occurrence_Always (X : Exception_Occurrence) is
begin
Abort_Defer.all;
- Exception_Propagation.Setup_Exception
- (X'Unrestricted_Access, Get_Current_Excep.all, Reraised => True);
Save_Occurrence_No_Private (Get_Current_Excep.all.all, X);
Raise_Current_Excep (X.Id);
end Reraise_Occurrence_Always;
procedure Reraise_Occurrence_No_Defer (X : Exception_Occurrence) is
begin
- Exception_Propagation.Setup_Exception
- (X'Unrestricted_Access, Get_Current_Excep.all, Reraised => True);
Save_Occurrence_No_Private (Get_Current_Excep.all.all, X);
Raise_Current_Excep (X.Id);
end Reraise_Occurrence_No_Defer;
end Save_Occurrence;
function Save_Occurrence (Source : Exception_Occurrence) return EOA is
- Target : EOA := new Exception_Occurrence;
+ Target : constant EOA := new Exception_Occurrence;
begin
Save_Occurrence (Target.all, Source);
return Target;
end Save_Occurrence;
--------------------------------
- -- Save_Occurrence_And_Private --
- --------------------------------
-
- procedure Save_Occurrence_And_Private
- (Target : out Exception_Occurrence;
- Source : Exception_Occurrence)
- is
- begin
- Save_Occurrence_No_Private (Target, Source);
- Target.Private_Data := Source.Private_Data;
- end Save_Occurrence_And_Private;
-
- --------------------------------
-- Save_Occurrence_No_Private --
--------------------------------
-- fixed TSD occurrence, which is very different from Get_Current_Excep
-- here because this subprogram is called from the called task.
- Exception_Propagation.Setup_Exception (Target, Target);
Save_Occurrence_No_Private (Target.all, Source);
end Transfer_Occurrence;
begin
Exception_Data.Set_Exception_Msg (E, Message);
- -- DO NOT CALL Abort_Defer.all; !!!!
- -- why not??? would be nice to have more comments here
+ -- Do not call Abort_Defer.all, as specified by the spec
Raise_Current_Excep (E);
end Raise_Exception_No_Defer;
end loop;
end To_Stderr;
- ---------
- -- ZZZ --
- ---------
-
- -- This dummy procedure gives us the end of the PC range for addresses
- -- within the exception unit itself. We hope that gigi/gcc keeps all the
- -- procedures in their original order!
-
- procedure ZZZ is
- begin
- <<Start_Of_ZZZ>>
- Code_Address_For_ZZZ := Start_Of_ZZZ'Address;
- end ZZZ;
-
-begin
- pragma Warnings (Off);
- -- Allow calls to non-static subprograms in Ada 2005 mode where this
- -- package will be implicitly categorized as Preelaborate. See AI-362 for
- -- details. It is safe in the context of the run-time to violate the rules!
-
- -- Allocate the Non-Tasking Machine_State
-
- Set_Machine_State_Addr_NT (System.Address (Allocate_Machine_State));
-
- -- Call the AAA/ZZZ routines to setup the code addresses for the
- -- bounds of this unit.
-
- AAA;
- ZZZ;
-
- pragma Warnings (On);
end Ada.Exceptions;