OSDN Git Service

2007-04-20 Ed Schonberg <schonberg@adacore.com>
[pf3gnuchains/gcc-fork.git] / gcc / ada / a-except.adb
index c07790a..0048622 100644 (file)
@@ -6,7 +6,7 @@
 --                                                                          --
 --                                 B o d y                                  --
 --                                                                          --
---          Copyright (C) 1992-2004 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- --
@@ -16,8 +16,8 @@
 -- 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 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 --
    -----------------------
@@ -71,66 +69,34 @@ package body Ada.Exceptions is
    --  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");
+   --  Little routine to output string to stderr that is also used
+   --  in the tasking run time.
+
+   procedure To_Stderr (C : Character);
+   pragma Inline (To_Stderr);
+   pragma Export (Ada, To_Stderr, "__gnat_to_stderr_char");
+   --  Little routine to output a character to stderr, used by some of
+   --  the separate units below.
 
    package Exception_Data is
 
-      ----------------------------------
-      --  Exception messages routines --
-      ----------------------------------
+      ---------------------------------
+      -- Exception messages routines --
+      ---------------------------------
 
       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
@@ -154,34 +120,40 @@ package body Ada.Exceptions is
       function Exception_Information (X : Exception_Occurrence) return String;
       --  The format of the exception information is as follows:
       --
-      --    exception name (as in Exception_Name)
-      --    message (or a null line if no message)
-      --    PID=nnnn
-      --    0xyyyyyyyy 0xyyyyyyyy ...
+      --    Exception_Name: <exception name> (as in Exception_Name)
+      --    Message: <message> (only if Exception_Message is empty)
+      --    PID=nnnn (only if != 0)
+      --    Call stack traceback locations:  (only if at least one location)
+      --    <0xyyyyyyyy 0xyyyyyyyy ...>      (is recorded)
       --
-      --  The lines are separated by a ASCII.LF character
+      --  The lines are separated by a ASCII.LF character.
       --  The nnnn is the partition Id given as decimal digits.
-      --  The 0x... line represents traceback program counter locations,
-      --  in order with the first one being the exception location.
+      --  The 0x... line represents traceback program counter locations, in
+      --  execution order with the first one being the exception location. It
+      --  is present only
+      --
+      --  The Exception_Name and Message lines are omitted in the abort
+      --  signal case, since this is not really an exception.
+
+      --  !! If the format of the generated string is changed, please note
+      --  !! that an equivalent modification to the routine String_To_EO must
+      --  !! be made to preserve proper functioning of the stream attributes.
 
       ---------------------------------------
       -- Exception backtracing subprograms --
       ---------------------------------------
 
-      --  What is automatically output when exception tracing is on basically
-      --  corresponds to the usual exception information, but with the call
-      --  chain backtrace possibly tailored by a backtrace decorator. Modifying
-      --  Exception_Information itself is not a good idea because the decorated
-      --  output is completely out of control and would break all our code
-      --  related to the streaming of exceptions.
-      --
-      --  We then provide an alternative function to Exception_Information to
-      --  compute the possibly tailored output, which is equivalent if no
-      --  decorator is currently set.
+      --  What is automatically output when exception tracing is on is the
+      --  usual exception information with the call chain backtrace possibly
+      --  tailored by a backtrace decorator. Modifying Exception_Information
+      --  itself is not a good idea because the decorated output is completely
+      --  out of control and would break all our code related to the streaming
+      --  of exceptions.  We then provide an alternative function to compute
+      --  the possibly tailored output, which is equivalent if no decorator is
+      --  currently set:
 
       function Tailored_Exception_Information
-        (X    : Exception_Occurrence)
-        return String;
+        (X : Exception_Occurrence) return String;
       --  Exception information to be output in the case of automatic tracing
       --  requested through GNAT.Exception_Traces.
       --
@@ -193,28 +165,7 @@ package body Ada.Exceptions is
       pragma Export
         (Ada, Tailored_Exception_Information,
            "__gnat_tailored_exception_information");
-      --  This function is used within this package but also from within
-      --  System.Tasking.Stages.
-      --
-      --  The output of Exception_Information and
-      --  Tailored_Exception_Information share a common part which was
-      --  formerly built using local procedures within
-      --  Exception_Information. These procedures have been extracted
-      --  from their original place to be available to
-      --  Tailored_Exception_Information also.
-      --
-      --  Each of these procedures appends some input to an
-      --  information string currently being built. The Ptr argument
-      --  represents the last position in this string at which a
-      --  character has been written.
-
-      procedure Tailored_Exception_Information
-        (X    : Exception_Occurrence;
-         Buff : in out String;
-         Last : in out Integer);
-      --  Procedural version of the above function. Instead of returning the
-      --  result, this one is put in Buff (Buff'first .. Buff'first + Last)
-      --  And what happens on overflow ???
+      --  This is currently used by System.Tasking.Stages
 
    end Exception_Data;
 
@@ -234,14 +185,14 @@ package body Ada.Exceptions is
       --  routine when the GCC 3 mechanism is used.
 
       procedure Notify_Handled_Exception;
-      pragma Export (C, Notify_Handled_Exception,
-                       "__gnat_notify_handled_exception");
+      pragma Export
+        (C, Notify_Handled_Exception, "__gnat_notify_handled_exception");
       --  This routine is called for a handled occurrence is about to be
       --  propagated.
 
       procedure Notify_Unhandled_Exception;
-      pragma Export (C, Notify_Unhandled_Exception,
-                       "__gnat_notify_unhandled_exception");
+      pragma Export
+        (C, Notify_Unhandled_Exception, "__gnat_notify_unhandled_exception");
       --  This routine is called when an unhandled occurrence is about to be
       --  propagated.
 
@@ -257,34 +208,11 @@ package body Ada.Exceptions is
 
    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;
 
@@ -308,8 +236,7 @@ package body Ada.Exceptions is
    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
@@ -331,25 +258,11 @@ package body Ada.Exceptions is
    --  exception occurrence referenced by the Current_Excep in the TSD.
    --  Abort is deferred before the raise call.
 
-   procedure Raise_With_Msg (E : Exception_Id; Setup : Boolean);
-   pragma No_Return (Raise_With_Msg);
-   --  Similar to above, with an extra parameter to indicate wether
-   --  Setup_Exception has been called already.
-
-   procedure Raise_After_Setup (E : Exception_Id);
-   pragma No_Return (Raise_After_Setup);
-   pragma Export (C, Raise_After_Setup, "__gnat_raise_after_setup");
-   --  Wrapper to Raise_With_Msg and Setup set to True.
-   --
-   --  This is called by System.Tasking.Entry_Calls.Check_Exception when an
-   --  exception has occured during an entry call. The exception to propagate
-   --  has been setup and initialized via Transfer_Occurrence in this case.
-
    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
@@ -357,7 +270,7 @@ package body Ada.Exceptions is
    --  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
@@ -365,16 +278,16 @@ package body Ada.Exceptions is
    --  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
@@ -382,16 +295,16 @@ package body Ada.Exceptions is
    --  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
@@ -399,9 +312,9 @@ package body Ada.Exceptions is
    --  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");
@@ -441,12 +354,6 @@ package body Ada.Exceptions is
    --  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);
@@ -472,36 +379,39 @@ package body Ada.Exceptions is
    --  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_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");
@@ -533,6 +443,46 @@ package body Ada.Exceptions is
    pragma Export (C, Rcheck_27, "__gnat_rcheck_27");
    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,
+   --  such as normal return epilog stuff, can be eliminated).
+
+   pragma No_Return (Rcheck_00);
+   pragma No_Return (Rcheck_01);
+   pragma No_Return (Rcheck_02);
+   pragma No_Return (Rcheck_03);
+   pragma No_Return (Rcheck_04);
+   pragma No_Return (Rcheck_05);
+   pragma No_Return (Rcheck_06);
+   pragma No_Return (Rcheck_07);
+   pragma No_Return (Rcheck_08);
+   pragma No_Return (Rcheck_09);
+   pragma No_Return (Rcheck_10);
+   pragma No_Return (Rcheck_11);
+   pragma No_Return (Rcheck_12);
+   pragma No_Return (Rcheck_13);
+   pragma No_Return (Rcheck_14);
+   pragma No_Return (Rcheck_15);
+   pragma No_Return (Rcheck_16);
+   pragma No_Return (Rcheck_17);
+   pragma No_Return (Rcheck_18);
+   pragma No_Return (Rcheck_19);
+   pragma No_Return (Rcheck_20);
+   pragma No_Return (Rcheck_21);
+   pragma No_Return (Rcheck_22);
+   pragma No_Return (Rcheck_23);
+   pragma No_Return (Rcheck_24);
+   pragma No_Return (Rcheck_25);
+   pragma No_Return (Rcheck_26);
+   pragma No_Return (Rcheck_27);
+   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 --
@@ -551,29 +501,33 @@ package body Ada.Exceptions is
    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 := "overflow check failed"            & NUL;
-   Rmsg_09 : constant String := "partition check failed"           & NUL;
-   Rmsg_10 : constant String := "range check failed"               & NUL;
-   Rmsg_11 : constant String := "tag check failed"                 & NUL;
-   Rmsg_12 : constant String := "access before elaboration"        & NUL;
-   Rmsg_13 : constant String := "accessibility check failed"       & NUL;
-   Rmsg_14 : constant String := "all guards closed"                & NUL;
-   Rmsg_15 : constant String := "duplicated entry address"         & NUL;
-   Rmsg_16 : constant String := "explicit raise"                   & NUL;
-   Rmsg_17 : constant String := "finalize/adjust raised exception" & NUL;
-   Rmsg_18 : constant String := "misaligned address value"         & NUL;
-   Rmsg_19 : constant String := "missing return"                   & NUL;
-   Rmsg_20 : constant String := "overlaid controlled object"       & NUL;
-   Rmsg_21 : constant String := "potentially blocking operation"   & NUL;
-   Rmsg_22 : constant String := "stubbed subprogram called"        & NUL;
-   Rmsg_23 : constant String := "unchecked union restriction"      & NUL;
-   Rmsg_24 : constant String := "illegal use of"
-             & " remote access-to-class-wide type, see RM E.4(18)" & NUL;
-   Rmsg_25 : constant String := "empty storage pool"               & NUL;
-   Rmsg_26 : constant String := "explicit raise"                   & NUL;
-   Rmsg_27 : constant String := "infinite recursion"               & NUL;
-   Rmsg_28 : constant String := "object too large"                 & NUL;
-   Rmsg_29 : 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 --
@@ -590,28 +544,6 @@ package body Ada.Exceptions is
    --  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 --
    ------------------------------
@@ -643,23 +575,32 @@ package body Ada.Exceptions is
    ------------------------
 
    function Exception_Identity
-     (X    : Exception_Occurrence)
-      return Exception_Id
+     (X : Exception_Occurrence) return Exception_Id
    is
    begin
-      if X.Id = Null_Id then
-         raise Constraint_Error;
-      else
-         return X.Id;
-      end if;
+      --  Note that the following test used to be here for the original
+      --  Ada 95 semantics, but these were modified by AI-241 to require
+      --  returning Null_Id instead of raising Constraint_Error.
+
+      --  if X.Id = Null_Id then
+      --     raise Constraint_Error;
+      --  end if;
+
+      return X.Id;
    end Exception_Identity;
 
    ---------------------------
    -- Exception_Information --
    ---------------------------
 
-   function Exception_Information (X : Exception_Occurrence) return String
-     renames Exception_Data.Exception_Information;
+   function Exception_Information (X : Exception_Occurrence) return String is
+   begin
+      if X.Id = Null_Id then
+         raise Constraint_Error;
+      end if;
+
+      return Exception_Data.Exception_Information (X);
+   end Exception_Information;
 
    -----------------------
    -- Exception_Message --
@@ -684,7 +625,7 @@ package body Ada.Exceptions is
          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
@@ -724,14 +665,21 @@ package body Ada.Exceptions 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 --
@@ -755,85 +703,41 @@ package body Ada.Exceptions is
    -- 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;
 
@@ -842,7 +746,7 @@ package body Ada.Exceptions is
    ----------------------------
 
    procedure Raise_Constraint_Error
-     (File : Big_String_Ptr;
+     (File : System.Address;
       Line : Integer)
    is
    begin
@@ -855,9 +759,9 @@ package body Ada.Exceptions is
    --------------------------------
 
    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
@@ -869,10 +773,26 @@ package body Ada.Exceptions is
    -------------------------
 
    procedure Raise_Current_Excep (E : Exception_Id) is
+
       pragma Inspection_Point (E);
-      --  This is so the debugger can reliably inspect the parameter
+      --  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
-      Process_Raise_Exception (E => E, From_Signal_Handler => False);
+      Debug_Raise_Exception (E => SSL.Exception_Data_Ptr (E));
+      Process_Raise_Exception (E);
    end Raise_Current_Excep;
 
    ---------------------
@@ -889,6 +809,10 @@ package body Ada.Exceptions is
          Abort_Defer.all;
          Raise_Current_Excep (E);
       end if;
+
+      --  Note: if E is null then just return (Ada 95 semantics)
+
+      return;
    end Raise_Exception;
 
    ----------------------------
@@ -905,18 +829,58 @@ package body Ada.Exceptions is
       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;
 
    -------------------------
@@ -924,7 +888,7 @@ package body Ada.Exceptions is
    -------------------------
 
    procedure Raise_Program_Error
-     (File : Big_String_Ptr;
+     (File : System.Address;
       Line : Integer)
    is
    begin
@@ -937,9 +901,9 @@ package body Ada.Exceptions is
    -----------------------------
 
    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
@@ -951,7 +915,7 @@ package body Ada.Exceptions is
    -------------------------
 
    procedure Raise_Storage_Error
-     (File : Big_String_Ptr;
+     (File : System.Address;
       Line : Integer)
    is
    begin
@@ -964,9 +928,9 @@ package body Ada.Exceptions is
    -----------------------------
 
    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
@@ -979,9 +943,9 @@ package body Ada.Exceptions is
 
    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);
@@ -993,14 +957,10 @@ package body Ada.Exceptions is
    -- Raise_With_Msg --
    --------------------
 
-   procedure Raise_With_Msg (E : Exception_Id; Setup : Boolean) is
+   procedure Raise_With_Msg (E : Exception_Id) is
       Excep : constant EOA := Get_Current_Excep.all;
 
    begin
-      if not Setup then
-         Exception_Propagation.Setup_Exception (Excep, Excep);
-      end if;
-
       Excep.Exception_Raised := False;
       Excep.Id               := E;
       Excep.Num_Tracebacks   := 0;
@@ -1010,174 +970,175 @@ package body Ada.Exceptions is
       Raise_Current_Excep (E);
    end Raise_With_Msg;
 
-   procedure Raise_With_Msg (E : Exception_Id) is
-   begin
-      Raise_With_Msg (E, Setup => False);
-   end Raise_With_Msg;
-
-   -----------------------
-   -- Raise_After_Setup --
-   -----------------------
-
-   procedure Raise_After_Setup (E : Exception_Id) is
-   begin
-      Raise_With_Msg (E, Setup => True);
-   end Raise_After_Setup;
-
    --------------------------------------
    -- 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_Program_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_Storage_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 : System.Address; Line : Integer) is
+   begin
+      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 --
    -------------
@@ -1187,7 +1148,6 @@ package body Ada.Exceptions is
 
    begin
       Abort_Defer.all;
-      Exception_Propagation.Setup_Exception (Excep, Excep, Reraised => True);
       Raise_Current_Excep (Excep.Id);
    end Reraise;
 
@@ -1199,8 +1159,6 @@ package body Ada.Exceptions is
    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;
@@ -1213,8 +1171,6 @@ package body Ada.Exceptions is
    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;
@@ -1225,8 +1181,6 @@ package body Ada.Exceptions is
 
    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;
@@ -1243,31 +1197,14 @@ package body Ada.Exceptions is
       Save_Occurrence_No_Private (Target, Source);
    end Save_Occurrence;
 
-   function Save_Occurrence
-     (Source : Exception_Occurrence)
-      return   EOA
-   is
-      Target : EOA := new Exception_Occurrence;
-
+   function Save_Occurrence (Source : Exception_Occurrence) return EOA is
+      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 --
    --------------------------------
 
@@ -1304,7 +1241,6 @@ package body Ada.Exceptions is
       --  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;
 
@@ -1333,34 +1269,33 @@ package body Ada.Exceptions is
    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;
 
-   ---------
-   -- ZZZ --
-   ---------
+   ---------------
+   -- To_Stderr --
+   ---------------
 
-   --  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 To_Stderr (C : Character) is
 
-   procedure ZZZ is
-   begin
-      <<Start_Of_ZZZ>>
-      Code_Address_For_ZZZ := Start_Of_ZZZ'Address;
-   end ZZZ;
+      type int is new Integer;
 
-begin
-   --  Allocate the Non-Tasking Machine_State
+      procedure put_char_stderr (C : int);
+      pragma Import (C, put_char_stderr, "put_char_stderr");
 
-   Set_Machine_State_Addr_NT (System.Address (Allocate_Machine_State));
+   begin
+      put_char_stderr (Character'Pos (C));
+   end To_Stderr;
 
-   --  Call the AAA/ZZZ routines to setup the code addresses for the
-   --  bounds of this unit.
+   procedure To_Stderr (S : String) is
+   begin
+      for J in S'Range loop
+         if S (J) /= ASCII.CR then
+            To_Stderr (S (J));
+         end if;
+      end loop;
+   end To_Stderr;
 
-   AAA;
-   ZZZ;
 end Ada.Exceptions;