File : a-except-2005.adb


   1 ------------------------------------------------------------------------------
   2 --                                                                          --
   3 --                         GNAT COMPILER COMPONENTS                         --
   4 --                                                                          --
   5 --                       A D A . E X C E P T I O N S                        --
   6 --                                                                          --
   7 --                                 B o d y                                  --
   8 --                                                                          --
   9 --          Copyright (C) 1992-2015, Free Software Foundation, Inc.         --
  10 --                                                                          --
  11 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  12 -- terms of the  GNU General Public License as published  by the Free Soft- --
  13 -- ware  Foundation;  either version 3,  or (at your option) any later ver- --
  14 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  15 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  16 -- or FITNESS FOR A PARTICULAR PURPOSE.                                     --
  17 --                                                                          --
  18 --                                                                          --
  19 --                                                                          --
  20 --                                                                          --
  21 --                                                                          --
  22 -- You should have received a copy of the GNU General Public License and    --
  23 -- a copy of the GCC Runtime Library Exception along with this program;     --
  24 -- see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see    --
  25 -- <http://www.gnu.org/licenses/>.                                          --
  26 --                                                                          --
  27 -- GNAT was originally developed  by the GNAT team at  New York University. --
  28 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
  29 --                                                                          --
  30 ------------------------------------------------------------------------------
  31 
  32 pragma Style_Checks (All_Checks);
  33 --  No subprogram ordering check, due to logical grouping
  34 
  35 pragma Polling (Off);
  36 --  We must turn polling off for this unit, because otherwise we get
  37 --  elaboration circularities with System.Exception_Tables.
  38 
  39 with System;                  use System;
  40 with System.Exceptions;       use System.Exceptions;
  41 with System.Exceptions_Debug; use System.Exceptions_Debug;
  42 with System.Standard_Library; use System.Standard_Library;
  43 with System.Soft_Links;       use System.Soft_Links;
  44 with System.WCh_Con;          use System.WCh_Con;
  45 with System.WCh_StW;          use System.WCh_StW;
  46 
  47 pragma Warnings (Off);
  48 --  Suppress complaints about Symbolic not being referenced, and about it not
  49 --  having pragma Preelaborate.
  50 with System.Traceback.Symbolic;
  51 --  Bring Symbolic into the closure. If it is the s-trasym-dwarf.adb version,
  52 --  it will install symbolic tracebacks as the default decorator. Otherwise,
  53 --  symbolic tracebacks are not supported, and we fall back to hexadecimal
  54 --  addresses.
  55 pragma Warnings (On);
  56 
  57 package body Ada.Exceptions is
  58 
  59    pragma Suppress (All_Checks);
  60    --  We definitely do not want exceptions occurring within this unit, or
  61    --  we are in big trouble. If an exceptional situation does occur, better
  62    --  that it not be raised, since raising it can cause confusing chaos.
  63 
  64    -----------------------
  65    -- Local Subprograms --
  66    -----------------------
  67 
  68    --  Note: the exported subprograms in this package body are called directly
  69    --  from C clients using the given external name, even though they are not
  70    --  technically visible in the Ada sense.
  71 
  72    function Code_Address_For_AAA return System.Address;
  73    function Code_Address_For_ZZZ return System.Address;
  74    --  Return start and end of procedures in this package
  75    --
  76    --  These procedures are used to provide exclusion bounds in
  77    --  calls to Call_Chain at exception raise points from this unit. The
  78    --  purpose is to arrange for the exception tracebacks not to include
  79    --  frames from subprograms involved in the raise process, as these are
  80    --  meaningless from the user's standpoint.
  81    --
  82    --  For these bounds to be meaningful, we need to ensure that the object
  83    --  code for the subprograms involved in processing a raise is located
  84    --  after the object code Code_Address_For_AAA and before the object
  85    --  code Code_Address_For_ZZZ. This will indeed be the case as long as
  86    --  the following rules are respected:
  87    --
  88    --  1) The bodies of the subprograms involved in processing a raise
  89    --     are located after the body of Code_Address_For_AAA and before the
  90    --     body of Code_Address_For_ZZZ.
  91    --
  92    --  2) No pragma Inline applies to any of these subprograms, as this
  93    --     could delay the corresponding assembly output until the end of
  94    --     the unit.
  95 
  96    procedure Call_Chain (Excep : EOA);
  97    --  Store up to Max_Tracebacks in Excep, corresponding to the current
  98    --  call chain.
  99 
 100    function Image (Index : Integer) return String;
 101    --  Return string image corresponding to Index
 102 
 103    procedure To_Stderr (S : String);
 104    pragma Export (Ada, To_Stderr, "__gnat_to_stderr");
 105    --  Little routine to output string to stderr that is also used
 106    --  in the tasking run time.
 107 
 108    procedure To_Stderr (C : Character);
 109    pragma Inline (To_Stderr);
 110    pragma Export (Ada, To_Stderr, "__gnat_to_stderr_char");
 111    --  Little routine to output a character to stderr, used by some of
 112    --  the separate units below.
 113 
 114    package Exception_Data is
 115 
 116       -----------------------------------
 117       -- Exception Message Subprograms --
 118       -----------------------------------
 119 
 120       procedure Set_Exception_C_Msg
 121         (Excep  : EOA;
 122          Id     : Exception_Id;
 123          Msg1   : System.Address;
 124          Line   : Integer        := 0;
 125          Column : Integer        := 0;
 126          Msg2   : System.Address := System.Null_Address);
 127       --  This routine is called to setup the exception referenced by X
 128       --  to contain the indicated Id value and message. Msg1 is a null
 129       --  terminated string which is generated as the exception message. If
 130       --  line is non-zero, then a colon and the decimal representation of
 131       --  this integer is appended to the message. Ditto for Column. When Msg2
 132       --  is non-null, a space and this additional null terminated string is
 133       --  added to the message.
 134 
 135       procedure Set_Exception_Msg
 136         (Excep   : EOA;
 137          Id      : Exception_Id;
 138          Message : String);
 139       --  This routine is called to setup the exception referenced by X
 140       --  to contain the indicated Id value and message. Message is a string
 141       --  which is generated as the exception message.
 142 
 143       ---------------------------------------
 144       -- Exception Information Subprograms --
 145       ---------------------------------------
 146 
 147       function Untailored_Exception_Information
 148         (X : Exception_Occurrence) return String;
 149       --  This is used by Stream_Attributes.EO_To_String to convert an
 150       --  Exception_Occurrence to a String for the stream attributes.
 151       --  String_To_EO understands the format, as documented here.
 152       --
 153       --  The format of the string is as follows:
 154       --
 155       --    raised <exception name> : <message>
 156       --    (" : <message>" is present only if Exception_Message is not empty)
 157       --    PID=nnnn (only if nonzero)
 158       --    Call stack traceback locations:  (only if at least one location)
 159       --    <0xyyyyyyyy 0xyyyyyyyy ...>      (is recorded)
 160       --
 161       --  The lines are separated by a ASCII.LF character.
 162       --  The nnnn is the partition Id given as decimal digits.
 163       --  The 0x... line represents traceback program counter locations, in
 164       --  execution order with the first one being the exception location.
 165       --
 166       --  The Exception_Name and Message lines are omitted in the abort
 167       --  signal case, since this is not really an exception.
 168       --
 169       --  Note: If the format of the generated string is changed, please note
 170       --  that an equivalent modification to the routine String_To_EO must be
 171       --  made to preserve proper functioning of the stream attributes.
 172 
 173       function Exception_Information (X : Exception_Occurrence) return String;
 174       --  This is the implementation of Ada.Exceptions.Exception_Information,
 175       --  as defined in the Ada RM.
 176       --
 177       --  If no traceback decorator (see GNAT.Exception_Traces) is currently
 178       --  in place, this is the same as Untailored_Exception_Information.
 179       --  Otherwise, the decorator is used to produce a symbolic traceback
 180       --  instead of hexadecimal addresses.
 181       --
 182       --  Note that unlike Untailored_Exception_Information, there is no need
 183       --  to keep the output of Exception_Information stable for streaming
 184       --  purposes, and in fact the output differs across platforms.
 185 
 186    end Exception_Data;
 187 
 188    package Exception_Traces is
 189 
 190       -------------------------------------------------
 191       -- Run-Time Exception Notification Subprograms --
 192       -------------------------------------------------
 193 
 194       --  These subprograms provide a common run-time interface to trigger the
 195       --  actions required when an exception is about to be propagated (e.g.
 196       --  user specified actions or output of exception information). They are
 197       --  exported to be usable by the Ada exception handling personality
 198       --  routine when the GCC 3 mechanism is used.
 199 
 200       procedure Notify_Handled_Exception (Excep : EOA);
 201       pragma Export
 202         (C, Notify_Handled_Exception, "__gnat_notify_handled_exception");
 203       --  This routine is called for a handled occurrence is about to be
 204       --  propagated.
 205 
 206       procedure Notify_Unhandled_Exception (Excep : EOA);
 207       pragma Export
 208         (C, Notify_Unhandled_Exception, "__gnat_notify_unhandled_exception");
 209       --  This routine is called when an unhandled occurrence is about to be
 210       --  propagated.
 211 
 212       procedure Unhandled_Exception_Terminate (Excep : EOA);
 213       pragma No_Return (Unhandled_Exception_Terminate);
 214       --  This procedure is called to terminate execution following an
 215       --  unhandled exception. The exception information, including
 216       --  traceback if available is output, and execution is then
 217       --  terminated. Note that at the point where this routine is
 218       --  called, the stack has typically been destroyed.
 219 
 220    end Exception_Traces;
 221 
 222    package Exception_Propagation is
 223 
 224       ---------------------------------------
 225       -- Exception Propagation Subprograms --
 226       ---------------------------------------
 227 
 228       function Allocate_Occurrence return EOA;
 229       --  Allocate an exception occurrence (as well as the machine occurrence)
 230 
 231       procedure Propagate_Exception (Excep : EOA);
 232       pragma No_Return (Propagate_Exception);
 233       --  This procedure propagates the exception represented by Excep
 234 
 235    end Exception_Propagation;
 236 
 237    package Stream_Attributes is
 238 
 239       ----------------------------------
 240       -- Stream Attribute Subprograms --
 241       ----------------------------------
 242 
 243       function EId_To_String (X : Exception_Id) return String;
 244       function String_To_EId (S : String) return Exception_Id;
 245       --  Functions for implementing Exception_Id stream attributes
 246 
 247       function EO_To_String (X : Exception_Occurrence) return String;
 248       function String_To_EO (S : String) return Exception_Occurrence;
 249       --  Functions for implementing Exception_Occurrence stream
 250       --  attributes
 251 
 252    end Stream_Attributes;
 253 
 254    procedure Complete_Occurrence (X : EOA);
 255    --  Finish building the occurrence: save the call chain and notify the
 256    --  debugger.
 257 
 258    procedure Complete_And_Propagate_Occurrence (X : EOA);
 259    pragma No_Return (Complete_And_Propagate_Occurrence);
 260    --  This is a simple wrapper to Complete_Occurrence and
 261    --  Exception_Propagation.Propagate_Exception.
 262 
 263    function Create_Occurrence_From_Signal_Handler
 264      (E : Exception_Id;
 265       M : System.Address) return EOA;
 266    --  Create and build an exception occurrence using exception id E and
 267    --  nul-terminated message M.
 268 
 269    function Create_Machine_Occurrence_From_Signal_Handler
 270      (E : Exception_Id;
 271       M : System.Address) return System.Address;
 272    pragma Export (C, Create_Machine_Occurrence_From_Signal_Handler,
 273                   "__gnat_create_machine_occurrence_from_signal_handler");
 274    --  Create and build an exception occurrence using exception id E and
 275    --  nul-terminated message M. Return the machine occurrence.
 276 
 277    procedure Raise_Exception_No_Defer
 278      (E       : Exception_Id;
 279       Message : String := "");
 280    pragma Export
 281     (Ada, Raise_Exception_No_Defer,
 282      "ada__exceptions__raise_exception_no_defer");
 283    pragma No_Return (Raise_Exception_No_Defer);
 284    --  Similar to Raise_Exception, but with no abort deferral
 285 
 286    procedure Raise_With_Msg (E : Exception_Id);
 287    pragma No_Return (Raise_With_Msg);
 288    pragma Export (C, Raise_With_Msg, "__gnat_raise_with_msg");
 289    --  Raises an exception with given exception id value. A message
 290    --  is associated with the raise, and has already been stored in the
 291    --  exception occurrence referenced by the Current_Excep in the TSD.
 292    --  Abort is deferred before the raise call.
 293 
 294    procedure Raise_With_Location_And_Msg
 295      (E : Exception_Id;
 296       F : System.Address;
 297       L : Integer;
 298       C : Integer := 0;
 299       M : System.Address := System.Null_Address);
 300    pragma No_Return (Raise_With_Location_And_Msg);
 301    --  Raise an exception with given exception id value. A filename and line
 302    --  number is associated with the raise and is stored in the exception
 303    --  occurrence and in addition a column and a string message M may be
 304    --  appended to this (if not null/0).
 305 
 306    procedure Raise_Constraint_Error (File : System.Address; Line : Integer);
 307    pragma No_Return (Raise_Constraint_Error);
 308    pragma Export (C, Raise_Constraint_Error, "__gnat_raise_constraint_error");
 309    --  Raise constraint error with file:line information
 310 
 311    procedure Raise_Constraint_Error_Msg
 312      (File   : System.Address;
 313       Line   : Integer;
 314       Column : Integer;
 315       Msg    : System.Address);
 316    pragma No_Return (Raise_Constraint_Error_Msg);
 317    pragma Export
 318      (C, Raise_Constraint_Error_Msg, "__gnat_raise_constraint_error_msg");
 319    --  Raise constraint error with file:line:col + msg information
 320 
 321    procedure Raise_Program_Error (File : System.Address; Line : Integer);
 322    pragma No_Return (Raise_Program_Error);
 323    pragma Export (C, Raise_Program_Error, "__gnat_raise_program_error");
 324    --  Raise program error with file:line information
 325 
 326    procedure Raise_Program_Error_Msg
 327      (File : System.Address;
 328       Line : Integer;
 329       Msg  : System.Address);
 330    pragma No_Return (Raise_Program_Error_Msg);
 331    pragma Export
 332      (C, Raise_Program_Error_Msg, "__gnat_raise_program_error_msg");
 333    --  Raise program error with file:line + msg information
 334 
 335    procedure Raise_Storage_Error (File : System.Address; Line : Integer);
 336    pragma No_Return (Raise_Storage_Error);
 337    pragma Export (C, Raise_Storage_Error, "__gnat_raise_storage_error");
 338    --  Raise storage error with file:line information
 339 
 340    procedure Raise_Storage_Error_Msg
 341      (File : System.Address;
 342       Line : Integer;
 343       Msg  : System.Address);
 344    pragma No_Return (Raise_Storage_Error_Msg);
 345    pragma Export
 346      (C, Raise_Storage_Error_Msg, "__gnat_raise_storage_error_msg");
 347    --  Raise storage error with file:line + reason msg information
 348 
 349    --  The exception raising process and the automatic tracing mechanism rely
 350    --  on some careful use of flags attached to the exception occurrence. The
 351    --  graph below illustrates the relations between the Raise_ subprograms
 352    --  and identifies the points where basic flags such as Exception_Raised
 353    --  are initialized.
 354 
 355    --  (i) signs indicate the flags initialization points. R stands for Raise,
 356    --  W for With, and E for Exception.
 357 
 358    --                   R_No_Msg    R_E   R_Pe  R_Ce  R_Se
 359    --                       |        |     |     |     |
 360    --                       +--+  +--+     +---+ | +---+
 361    --                          |  |            | | |
 362    --     R_E_No_Defer(i)    R_W_Msg(i)       R_W_Loc
 363    --           |               |              |   |
 364    --           +------------+  |  +-----------+   +--+
 365    --                        |  |  |                  |
 366    --                        |  |  |             Set_E_C_Msg(i)
 367    --                        |  |  |
 368    --            Complete_And_Propagate_Occurrence
 369 
 370    procedure Reraise;
 371    pragma No_Return (Reraise);
 372    pragma Export (C, Reraise, "__gnat_reraise");
 373    --  Reraises the exception referenced by the Current_Excep field
 374    --  of the TSD (all fields of this exception occurrence are set).
 375    --  Abort is deferred before the reraise operation. Called from
 376    --  System.Tasking.RendezVous.Exceptional_Complete_RendezVous
 377 
 378    procedure Transfer_Occurrence
 379      (Target : Exception_Occurrence_Access;
 380       Source : Exception_Occurrence);
 381    pragma Export (C, Transfer_Occurrence, "__gnat_transfer_occurrence");
 382    --  Called from s-tasren.adb:Local_Complete_RendezVous and
 383    --  s-tpobop.adb:Exceptional_Complete_Entry_Body to setup Target from
 384    --  Source as an exception to be propagated in the caller task. Target is
 385    --  expected to be a pointer to the fixed TSD occurrence for this task.
 386 
 387    --------------------------------
 388    -- Run-Time Check Subprograms --
 389    --------------------------------
 390 
 391    --  These subprograms raise a specific exception with a reason message
 392    --  attached. The parameters are the file name and line number in each
 393    --  case. The names are defined by Exp_Ch11.Get_RT_Exception_Name.
 394 
 395    procedure Rcheck_CE_Access_Check
 396      (File : System.Address; Line : Integer);
 397    procedure Rcheck_CE_Null_Access_Parameter
 398      (File : System.Address; Line : Integer);
 399    procedure Rcheck_CE_Discriminant_Check
 400      (File : System.Address; Line : Integer);
 401    procedure Rcheck_CE_Divide_By_Zero
 402      (File : System.Address; Line : Integer);
 403    procedure Rcheck_CE_Explicit_Raise
 404      (File : System.Address; Line : Integer);
 405    procedure Rcheck_CE_Index_Check
 406      (File : System.Address; Line : Integer);
 407    procedure Rcheck_CE_Invalid_Data
 408      (File : System.Address; Line : Integer);
 409    procedure Rcheck_CE_Length_Check
 410      (File : System.Address; Line : Integer);
 411    procedure Rcheck_CE_Null_Exception_Id
 412      (File : System.Address; Line : Integer);
 413    procedure Rcheck_CE_Null_Not_Allowed
 414      (File : System.Address; Line : Integer);
 415    procedure Rcheck_CE_Overflow_Check
 416      (File : System.Address; Line : Integer);
 417    procedure Rcheck_CE_Partition_Check
 418      (File : System.Address; Line : Integer);
 419    procedure Rcheck_CE_Range_Check
 420      (File : System.Address; Line : Integer);
 421    procedure Rcheck_CE_Tag_Check
 422      (File : System.Address; Line : Integer);
 423    procedure Rcheck_PE_Access_Before_Elaboration
 424      (File : System.Address; Line : Integer);
 425    procedure Rcheck_PE_Accessibility_Check
 426      (File : System.Address; Line : Integer);
 427    procedure Rcheck_PE_Address_Of_Intrinsic
 428      (File : System.Address; Line : Integer);
 429    procedure Rcheck_PE_Aliased_Parameters
 430      (File : System.Address; Line : Integer);
 431    procedure Rcheck_PE_All_Guards_Closed
 432      (File : System.Address; Line : Integer);
 433    procedure Rcheck_PE_Bad_Predicated_Generic_Type
 434      (File : System.Address; Line : Integer);
 435    procedure Rcheck_PE_Current_Task_In_Entry_Body
 436      (File : System.Address; Line : Integer);
 437    procedure Rcheck_PE_Duplicated_Entry_Address
 438      (File : System.Address; Line : Integer);
 439    procedure Rcheck_PE_Explicit_Raise
 440      (File : System.Address; Line : Integer);
 441    procedure Rcheck_PE_Implicit_Return
 442      (File : System.Address; Line : Integer);
 443    procedure Rcheck_PE_Misaligned_Address_Value
 444      (File : System.Address; Line : Integer);
 445    procedure Rcheck_PE_Missing_Return
 446      (File : System.Address; Line : Integer);
 447    procedure Rcheck_PE_Non_Transportable_Actual
 448      (File : System.Address; Line : Integer);
 449    procedure Rcheck_PE_Overlaid_Controlled_Object
 450      (File : System.Address; Line : Integer);
 451    procedure Rcheck_PE_Potentially_Blocking_Operation
 452      (File : System.Address; Line : Integer);
 453    procedure Rcheck_PE_Stubbed_Subprogram_Called
 454      (File : System.Address; Line : Integer);
 455    procedure Rcheck_PE_Unchecked_Union_Restriction
 456      (File : System.Address; Line : Integer);
 457    procedure Rcheck_SE_Empty_Storage_Pool
 458      (File : System.Address; Line : Integer);
 459    procedure Rcheck_SE_Explicit_Raise
 460      (File : System.Address; Line : Integer);
 461    procedure Rcheck_SE_Infinite_Recursion
 462      (File : System.Address; Line : Integer);
 463    procedure Rcheck_SE_Object_Too_Large
 464      (File : System.Address; Line : Integer);
 465    procedure Rcheck_PE_Stream_Operation_Not_Allowed
 466      (File : System.Address; Line : Integer);
 467    procedure Rcheck_CE_Access_Check_Ext
 468      (File : System.Address; Line, Column : Integer);
 469    procedure Rcheck_CE_Index_Check_Ext
 470      (File : System.Address; Line, Column, Index, First, Last : Integer);
 471    procedure Rcheck_CE_Invalid_Data_Ext
 472      (File : System.Address; Line, Column, Index, First, Last : Integer);
 473    procedure Rcheck_CE_Range_Check_Ext
 474      (File : System.Address; Line, Column, Index, First, Last : Integer);
 475 
 476    procedure Rcheck_PE_Finalize_Raised_Exception
 477      (File : System.Address; Line : Integer);
 478    --  This routine is separated out because it has quite different behavior
 479    --  from the others. This is the "finalize/adjust raised exception". This
 480    --  subprogram is always called with abort deferred, unlike all other
 481    --  Rcheck_* subprograms, it needs to call Raise_Exception_No_Defer.
 482 
 483    pragma Export (C, Rcheck_CE_Access_Check,
 484                   "__gnat_rcheck_CE_Access_Check");
 485    pragma Export (C, Rcheck_CE_Null_Access_Parameter,
 486                   "__gnat_rcheck_CE_Null_Access_Parameter");
 487    pragma Export (C, Rcheck_CE_Discriminant_Check,
 488                   "__gnat_rcheck_CE_Discriminant_Check");
 489    pragma Export (C, Rcheck_CE_Divide_By_Zero,
 490                   "__gnat_rcheck_CE_Divide_By_Zero");
 491    pragma Export (C, Rcheck_CE_Explicit_Raise,
 492                   "__gnat_rcheck_CE_Explicit_Raise");
 493    pragma Export (C, Rcheck_CE_Index_Check,
 494                   "__gnat_rcheck_CE_Index_Check");
 495    pragma Export (C, Rcheck_CE_Invalid_Data,
 496                   "__gnat_rcheck_CE_Invalid_Data");
 497    pragma Export (C, Rcheck_CE_Length_Check,
 498                   "__gnat_rcheck_CE_Length_Check");
 499    pragma Export (C, Rcheck_CE_Null_Exception_Id,
 500                   "__gnat_rcheck_CE_Null_Exception_Id");
 501    pragma Export (C, Rcheck_CE_Null_Not_Allowed,
 502                   "__gnat_rcheck_CE_Null_Not_Allowed");
 503    pragma Export (C, Rcheck_CE_Overflow_Check,
 504                   "__gnat_rcheck_CE_Overflow_Check");
 505    pragma Export (C, Rcheck_CE_Partition_Check,
 506                   "__gnat_rcheck_CE_Partition_Check");
 507    pragma Export (C, Rcheck_CE_Range_Check,
 508                   "__gnat_rcheck_CE_Range_Check");
 509    pragma Export (C, Rcheck_CE_Tag_Check,
 510                   "__gnat_rcheck_CE_Tag_Check");
 511    pragma Export (C, Rcheck_PE_Access_Before_Elaboration,
 512                   "__gnat_rcheck_PE_Access_Before_Elaboration");
 513    pragma Export (C, Rcheck_PE_Accessibility_Check,
 514                   "__gnat_rcheck_PE_Accessibility_Check");
 515    pragma Export (C, Rcheck_PE_Address_Of_Intrinsic,
 516                   "__gnat_rcheck_PE_Address_Of_Intrinsic");
 517    pragma Export (C, Rcheck_PE_Aliased_Parameters,
 518                   "__gnat_rcheck_PE_Aliased_Parameters");
 519    pragma Export (C, Rcheck_PE_All_Guards_Closed,
 520                   "__gnat_rcheck_PE_All_Guards_Closed");
 521    pragma Export (C, Rcheck_PE_Bad_Predicated_Generic_Type,
 522                   "__gnat_rcheck_PE_Bad_Predicated_Generic_Type");
 523    pragma Export (C, Rcheck_PE_Current_Task_In_Entry_Body,
 524                   "__gnat_rcheck_PE_Current_Task_In_Entry_Body");
 525    pragma Export (C, Rcheck_PE_Duplicated_Entry_Address,
 526                   "__gnat_rcheck_PE_Duplicated_Entry_Address");
 527    pragma Export (C, Rcheck_PE_Explicit_Raise,
 528                   "__gnat_rcheck_PE_Explicit_Raise");
 529    pragma Export (C, Rcheck_PE_Finalize_Raised_Exception,
 530                   "__gnat_rcheck_PE_Finalize_Raised_Exception");
 531    pragma Export (C, Rcheck_PE_Implicit_Return,
 532                   "__gnat_rcheck_PE_Implicit_Return");
 533    pragma Export (C, Rcheck_PE_Misaligned_Address_Value,
 534                   "__gnat_rcheck_PE_Misaligned_Address_Value");
 535    pragma Export (C, Rcheck_PE_Missing_Return,
 536                   "__gnat_rcheck_PE_Missing_Return");
 537    pragma Export (C, Rcheck_PE_Non_Transportable_Actual,
 538                   "__gnat_rcheck_PE_Non_Transportable_Actual");
 539    pragma Export (C, Rcheck_PE_Overlaid_Controlled_Object,
 540                   "__gnat_rcheck_PE_Overlaid_Controlled_Object");
 541    pragma Export (C, Rcheck_PE_Potentially_Blocking_Operation,
 542                   "__gnat_rcheck_PE_Potentially_Blocking_Operation");
 543    pragma Export (C, Rcheck_PE_Stream_Operation_Not_Allowed,
 544                   "__gnat_rcheck_PE_Stream_Operation_Not_Allowed");
 545    pragma Export (C, Rcheck_PE_Stubbed_Subprogram_Called,
 546                   "__gnat_rcheck_PE_Stubbed_Subprogram_Called");
 547    pragma Export (C, Rcheck_PE_Unchecked_Union_Restriction,
 548                   "__gnat_rcheck_PE_Unchecked_Union_Restriction");
 549    pragma Export (C, Rcheck_SE_Empty_Storage_Pool,
 550                   "__gnat_rcheck_SE_Empty_Storage_Pool");
 551    pragma Export (C, Rcheck_SE_Explicit_Raise,
 552                   "__gnat_rcheck_SE_Explicit_Raise");
 553    pragma Export (C, Rcheck_SE_Infinite_Recursion,
 554                   "__gnat_rcheck_SE_Infinite_Recursion");
 555    pragma Export (C, Rcheck_SE_Object_Too_Large,
 556                   "__gnat_rcheck_SE_Object_Too_Large");
 557 
 558    pragma Export (C, Rcheck_CE_Access_Check_Ext,
 559                   "__gnat_rcheck_CE_Access_Check_ext");
 560    pragma Export (C, Rcheck_CE_Index_Check_Ext,
 561                   "__gnat_rcheck_CE_Index_Check_ext");
 562    pragma Export (C, Rcheck_CE_Invalid_Data_Ext,
 563                   "__gnat_rcheck_CE_Invalid_Data_ext");
 564    pragma Export (C, Rcheck_CE_Range_Check_Ext,
 565                   "__gnat_rcheck_CE_Range_Check_ext");
 566 
 567    --  None of these procedures ever returns (they raise an exception). By
 568    --  using pragma No_Return, we ensure that any junk code after the call,
 569    --  such as normal return epilogue stuff, can be eliminated).
 570 
 571    pragma No_Return (Rcheck_CE_Access_Check);
 572    pragma No_Return (Rcheck_CE_Null_Access_Parameter);
 573    pragma No_Return (Rcheck_CE_Discriminant_Check);
 574    pragma No_Return (Rcheck_CE_Divide_By_Zero);
 575    pragma No_Return (Rcheck_CE_Explicit_Raise);
 576    pragma No_Return (Rcheck_CE_Index_Check);
 577    pragma No_Return (Rcheck_CE_Invalid_Data);
 578    pragma No_Return (Rcheck_CE_Length_Check);
 579    pragma No_Return (Rcheck_CE_Null_Exception_Id);
 580    pragma No_Return (Rcheck_CE_Null_Not_Allowed);
 581    pragma No_Return (Rcheck_CE_Overflow_Check);
 582    pragma No_Return (Rcheck_CE_Partition_Check);
 583    pragma No_Return (Rcheck_CE_Range_Check);
 584    pragma No_Return (Rcheck_CE_Tag_Check);
 585    pragma No_Return (Rcheck_PE_Access_Before_Elaboration);
 586    pragma No_Return (Rcheck_PE_Accessibility_Check);
 587    pragma No_Return (Rcheck_PE_Address_Of_Intrinsic);
 588    pragma No_Return (Rcheck_PE_Aliased_Parameters);
 589    pragma No_Return (Rcheck_PE_All_Guards_Closed);
 590    pragma No_Return (Rcheck_PE_Bad_Predicated_Generic_Type);
 591    pragma No_Return (Rcheck_PE_Current_Task_In_Entry_Body);
 592    pragma No_Return (Rcheck_PE_Duplicated_Entry_Address);
 593    pragma No_Return (Rcheck_PE_Explicit_Raise);
 594    pragma No_Return (Rcheck_PE_Implicit_Return);
 595    pragma No_Return (Rcheck_PE_Misaligned_Address_Value);
 596    pragma No_Return (Rcheck_PE_Missing_Return);
 597    pragma No_Return (Rcheck_PE_Non_Transportable_Actual);
 598    pragma No_Return (Rcheck_PE_Overlaid_Controlled_Object);
 599    pragma No_Return (Rcheck_PE_Potentially_Blocking_Operation);
 600    pragma No_Return (Rcheck_PE_Stream_Operation_Not_Allowed);
 601    pragma No_Return (Rcheck_PE_Stubbed_Subprogram_Called);
 602    pragma No_Return (Rcheck_PE_Unchecked_Union_Restriction);
 603    pragma No_Return (Rcheck_PE_Finalize_Raised_Exception);
 604    pragma No_Return (Rcheck_SE_Empty_Storage_Pool);
 605    pragma No_Return (Rcheck_SE_Explicit_Raise);
 606    pragma No_Return (Rcheck_SE_Infinite_Recursion);
 607    pragma No_Return (Rcheck_SE_Object_Too_Large);
 608 
 609    pragma No_Return (Rcheck_CE_Access_Check_Ext);
 610    pragma No_Return (Rcheck_CE_Index_Check_Ext);
 611    pragma No_Return (Rcheck_CE_Invalid_Data_Ext);
 612    pragma No_Return (Rcheck_CE_Range_Check_Ext);
 613 
 614    ---------------------------------------------
 615    -- Reason Strings for Run-Time Check Calls --
 616    ---------------------------------------------
 617 
 618    --  These strings are null-terminated and are used by Rcheck_nn. The
 619    --  strings correspond to the definitions for Types.RT_Exception_Code.
 620 
 621    use ASCII;
 622 
 623    Rmsg_00 : constant String := "access check failed"              & NUL;
 624    Rmsg_01 : constant String := "access parameter is null"         & NUL;
 625    Rmsg_02 : constant String := "discriminant check failed"        & NUL;
 626    Rmsg_03 : constant String := "divide by zero"                   & NUL;
 627    Rmsg_04 : constant String := "explicit raise"                   & NUL;
 628    Rmsg_05 : constant String := "index check failed"               & NUL;
 629    Rmsg_06 : constant String := "invalid data"                     & NUL;
 630    Rmsg_07 : constant String := "length check failed"              & NUL;
 631    Rmsg_08 : constant String := "null Exception_Id"                & NUL;
 632    Rmsg_09 : constant String := "null-exclusion check failed"      & NUL;
 633    Rmsg_10 : constant String := "overflow check failed"            & NUL;
 634    Rmsg_11 : constant String := "partition check failed"           & NUL;
 635    Rmsg_12 : constant String := "range check failed"               & NUL;
 636    Rmsg_13 : constant String := "tag check failed"                 & NUL;
 637    Rmsg_14 : constant String := "access before elaboration"        & NUL;
 638    Rmsg_15 : constant String := "accessibility check failed"       & NUL;
 639    Rmsg_16 : constant String := "attempt to take address of"       &
 640                                 " intrinsic subprogram"            & NUL;
 641    Rmsg_17 : constant String := "aliased parameters"               & NUL;
 642    Rmsg_18 : constant String := "all guards closed"                & NUL;
 643    Rmsg_19 : constant String := "improper use of generic subtype"  &
 644                                 " with predicate"                  & NUL;
 645    Rmsg_20 : constant String := "Current_Task referenced in entry" &
 646                                 " body"                            & NUL;
 647    Rmsg_21 : constant String := "duplicated entry address"         & NUL;
 648    Rmsg_22 : constant String := "explicit raise"                   & NUL;
 649    Rmsg_23 : constant String := "finalize/adjust raised exception" & NUL;
 650    Rmsg_24 : constant String := "implicit return with No_Return"   & NUL;
 651    Rmsg_25 : constant String := "misaligned address value"         & NUL;
 652    Rmsg_26 : constant String := "missing return"                   & NUL;
 653    Rmsg_27 : constant String := "overlaid controlled object"       & NUL;
 654    Rmsg_28 : constant String := "potentially blocking operation"   & NUL;
 655    Rmsg_29 : constant String := "stubbed subprogram called"        & NUL;
 656    Rmsg_30 : constant String := "unchecked union restriction"      & NUL;
 657    Rmsg_31 : constant String := "actual/returned class-wide"       &
 658                                 " value not transportable"         & NUL;
 659    Rmsg_32 : constant String := "empty storage pool"               & NUL;
 660    Rmsg_33 : constant String := "explicit raise"                   & NUL;
 661    Rmsg_34 : constant String := "infinite recursion"               & NUL;
 662    Rmsg_35 : constant String := "object too large"                 & NUL;
 663    Rmsg_36 : constant String := "stream operation not allowed"     & NUL;
 664 
 665    -----------------------
 666    -- Polling Interface --
 667    -----------------------
 668 
 669    type Unsigned is mod 2 ** 32;
 670 
 671    Counter : Unsigned := 0;
 672    pragma Warnings (Off, Counter);
 673    --  This counter is provided for convenience. It can be used in Poll to
 674    --  perform periodic but not systematic operations.
 675 
 676    procedure Poll is separate;
 677    --  The actual polling routine is separate, so that it can easily be
 678    --  replaced with a target dependent version.
 679 
 680    --------------------------
 681    -- Code_Address_For_AAA --
 682    --------------------------
 683 
 684    --  This function gives us the start of the PC range for addresses within
 685    --  the exception unit itself. We hope that gigi/gcc keep all the procedures
 686    --  in their original order.
 687 
 688    function Code_Address_For_AAA return System.Address is
 689    begin
 690       --  We are using a label instead of Code_Address_For_AAA'Address because
 691       --  on some platforms the latter does not yield the address we want, but
 692       --  the address of a stub or of a descriptor instead. This is the case at
 693       --  least on PA-HPUX.
 694 
 695       <<Start_Of_AAA>>
 696       return Start_Of_AAA'Address;
 697    end Code_Address_For_AAA;
 698 
 699    ----------------
 700    -- Call_Chain --
 701    ----------------
 702 
 703    procedure Call_Chain (Excep : EOA) is separate;
 704    --  The actual Call_Chain routine is separate, so that it can easily
 705    --  be dummied out when no exception traceback information is needed.
 706 
 707    -------------------
 708    -- EId_To_String --
 709    -------------------
 710 
 711    function EId_To_String (X : Exception_Id) return String
 712      renames Stream_Attributes.EId_To_String;
 713 
 714    ------------------
 715    -- EO_To_String --
 716    ------------------
 717 
 718    --  We use the null string to represent the null occurrence, otherwise we
 719    --  output the Untailored_Exception_Information string for the occurrence.
 720 
 721    function EO_To_String (X : Exception_Occurrence) return String
 722      renames Stream_Attributes.EO_To_String;
 723 
 724    ------------------------
 725    -- Exception_Identity --
 726    ------------------------
 727 
 728    function Exception_Identity
 729      (X : Exception_Occurrence) return Exception_Id
 730    is
 731    begin
 732       --  Note that the following test used to be here for the original
 733       --  Ada 95 semantics, but these were modified by AI-241 to require
 734       --  returning Null_Id instead of raising Constraint_Error.
 735 
 736       --  if X.Id = Null_Id then
 737       --     raise Constraint_Error;
 738       --  end if;
 739 
 740       return X.Id;
 741    end Exception_Identity;
 742 
 743    ---------------------------
 744    -- Exception_Information --
 745    ---------------------------
 746 
 747    function Exception_Information (X : Exception_Occurrence) return String is
 748    begin
 749       if X.Id = Null_Id then
 750          raise Constraint_Error;
 751       else
 752          return Exception_Data.Exception_Information (X);
 753       end if;
 754    end Exception_Information;
 755 
 756    -----------------------
 757    -- Exception_Message --
 758    -----------------------
 759 
 760    function Exception_Message (X : Exception_Occurrence) return String is
 761    begin
 762       if X.Id = Null_Id then
 763          raise Constraint_Error;
 764       else
 765          return X.Msg (1 .. X.Msg_Length);
 766       end if;
 767    end Exception_Message;
 768 
 769    --------------------
 770    -- Exception_Name --
 771    --------------------
 772 
 773    function Exception_Name (Id : Exception_Id) return String is
 774    begin
 775       if Id = null then
 776          raise Constraint_Error;
 777       else
 778          return To_Ptr (Id.Full_Name) (1 .. Id.Name_Length - 1);
 779       end if;
 780    end Exception_Name;
 781 
 782    function Exception_Name (X : Exception_Occurrence) return String is
 783    begin
 784       return Exception_Name (X.Id);
 785    end Exception_Name;
 786 
 787    ---------------------------
 788    -- Exception_Name_Simple --
 789    ---------------------------
 790 
 791    function Exception_Name_Simple (X : Exception_Occurrence) return String is
 792       Name : constant String := Exception_Name (X);
 793       P    : Natural;
 794 
 795    begin
 796       P := Name'Length;
 797       while P > 1 loop
 798          exit when Name (P - 1) = '.';
 799          P := P - 1;
 800       end loop;
 801 
 802       --  Return result making sure lower bound is 1
 803 
 804       declare
 805          subtype Rname is String (1 .. Name'Length - P + 1);
 806       begin
 807          return Rname (Name (P .. Name'Length));
 808       end;
 809    end Exception_Name_Simple;
 810 
 811    --------------------
 812    -- Exception_Data --
 813    --------------------
 814 
 815    package body Exception_Data is separate;
 816    --  This package can be easily dummied out if we do not want the basic
 817    --  support for exception messages (such as in Ada 83).
 818 
 819    ---------------------------
 820    -- Exception_Propagation --
 821    ---------------------------
 822 
 823    package body Exception_Propagation is separate;
 824    --  Depending on the actual exception mechanism used (front-end or
 825    --  back-end based), the implementation will differ, which is why this
 826    --  package is separated.
 827 
 828    ----------------------
 829    -- Exception_Traces --
 830    ----------------------
 831 
 832    package body Exception_Traces is separate;
 833    --  Depending on the underlying support for IO the implementation will
 834    --  differ. Moreover we would like to dummy out this package in case we
 835    --  do not want any exception tracing support. This is why this package
 836    --  is separated.
 837 
 838    --------------------------------------
 839    -- Get_Exception_Machine_Occurrence --
 840    --------------------------------------
 841 
 842    function Get_Exception_Machine_Occurrence
 843      (X : Exception_Occurrence) return System.Address
 844    is
 845    begin
 846       return X.Machine_Occurrence;
 847    end Get_Exception_Machine_Occurrence;
 848 
 849    -----------
 850    -- Image --
 851    -----------
 852 
 853    function Image (Index : Integer) return String is
 854       Result : constant String := Integer'Image (Index);
 855    begin
 856       if Result (1) = ' ' then
 857          return Result (2 .. Result'Last);
 858       else
 859          return Result;
 860       end if;
 861    end Image;
 862 
 863    -----------------------
 864    -- Stream Attributes --
 865    -----------------------
 866 
 867    package body Stream_Attributes is separate;
 868    --  This package can be easily dummied out if we do not want the
 869    --  support for streaming Exception_Ids and Exception_Occurrences.
 870 
 871    ----------------------------
 872    -- Raise_Constraint_Error --
 873    ----------------------------
 874 
 875    procedure Raise_Constraint_Error (File : System.Address; Line : Integer) is
 876    begin
 877       Raise_With_Location_And_Msg (Constraint_Error_Def'Access, File, Line);
 878    end Raise_Constraint_Error;
 879 
 880    --------------------------------
 881    -- Raise_Constraint_Error_Msg --
 882    --------------------------------
 883 
 884    procedure Raise_Constraint_Error_Msg
 885      (File   : System.Address;
 886       Line   : Integer;
 887       Column : Integer;
 888       Msg    : System.Address)
 889    is
 890    begin
 891       Raise_With_Location_And_Msg
 892         (Constraint_Error_Def'Access, File, Line, Column, Msg);
 893    end Raise_Constraint_Error_Msg;
 894 
 895    -------------------------
 896    -- Complete_Occurrence --
 897    -------------------------
 898 
 899    procedure Complete_Occurrence (X : EOA) is
 900    begin
 901       --  Compute the backtrace for this occurrence if the corresponding
 902       --  binder option has been set. Call_Chain takes care of the reraise
 903       --  case.
 904 
 905       --  ??? Using Call_Chain here means we are going to walk up the stack
 906       --  once only for backtracing purposes before doing it again for the
 907       --  propagation per se.
 908 
 909       --  The first inspection is much lighter, though, as it only requires
 910       --  partial unwinding of each frame. Additionally, although we could use
 911       --  the personality routine to record the addresses while propagating,
 912       --  this method has two drawbacks:
 913 
 914       --  1) the trace is incomplete if the exception is handled since we
 915       --  don't walk past the frame with the handler,
 916 
 917       --    and
 918 
 919       --  2) we would miss the frames for which our personality routine is not
 920       --  called, e.g. if C or C++ calls are on the way.
 921 
 922       Call_Chain (X);
 923 
 924       --  Notify the debugger
 925       Debug_Raise_Exception
 926         (E       => SSL.Exception_Data_Ptr (X.Id),
 927          Message => X.Msg (1 .. X.Msg_Length));
 928    end Complete_Occurrence;
 929 
 930    ---------------------------------------
 931    -- Complete_And_Propagate_Occurrence --
 932    ---------------------------------------
 933 
 934    procedure Complete_And_Propagate_Occurrence (X : EOA) is
 935    begin
 936       Complete_Occurrence (X);
 937       Exception_Propagation.Propagate_Exception (X);
 938    end Complete_And_Propagate_Occurrence;
 939 
 940    ---------------------
 941    -- Raise_Exception --
 942    ---------------------
 943 
 944    procedure Raise_Exception
 945      (E       : Exception_Id;
 946       Message : String := "")
 947    is
 948       EF : Exception_Id := E;
 949    begin
 950       --  Raise CE if E = Null_ID (AI-446)
 951 
 952       if E = null then
 953          EF := Constraint_Error'Identity;
 954       end if;
 955 
 956       --  Go ahead and raise appropriate exception
 957 
 958       Raise_Exception_Always (EF, Message);
 959    end Raise_Exception;
 960 
 961    ----------------------------
 962    -- Raise_Exception_Always --
 963    ----------------------------
 964 
 965    procedure Raise_Exception_Always
 966      (E       : Exception_Id;
 967       Message : String := "")
 968    is
 969       X : constant EOA := Exception_Propagation.Allocate_Occurrence;
 970 
 971    begin
 972       Exception_Data.Set_Exception_Msg (X, E, Message);
 973 
 974       if not ZCX_By_Default then
 975          Abort_Defer.all;
 976       end if;
 977 
 978       Complete_And_Propagate_Occurrence (X);
 979    end Raise_Exception_Always;
 980 
 981    ------------------------------
 982    -- Raise_Exception_No_Defer --
 983    ------------------------------
 984 
 985    procedure Raise_Exception_No_Defer
 986      (E       : Exception_Id;
 987       Message : String := "")
 988    is
 989       X : constant EOA := Exception_Propagation.Allocate_Occurrence;
 990 
 991    begin
 992       Exception_Data.Set_Exception_Msg (X, E, Message);
 993 
 994       --  Do not call Abort_Defer.all, as specified by the spec
 995 
 996       Complete_And_Propagate_Occurrence (X);
 997    end Raise_Exception_No_Defer;
 998 
 999    -------------------------------------
1000    -- Raise_From_Controlled_Operation --
1001    -------------------------------------
1002 
1003    procedure Raise_From_Controlled_Operation
1004      (X : Ada.Exceptions.Exception_Occurrence)
1005    is
1006       Prefix             : constant String := "adjust/finalize raised ";
1007       Orig_Msg           : constant String := Exception_Message (X);
1008       Orig_Prefix_Length : constant Natural :=
1009                              Integer'Min (Prefix'Length, Orig_Msg'Length);
1010 
1011       Orig_Prefix : String renames
1012         Orig_Msg (Orig_Msg'First .. Orig_Msg'First + Orig_Prefix_Length - 1);
1013 
1014    begin
1015       --  Message already has the proper prefix, just re-raise
1016 
1017       if Orig_Prefix = Prefix then
1018          Raise_Exception_No_Defer
1019            (E       => Program_Error'Identity,
1020             Message => Orig_Msg);
1021 
1022       else
1023          declare
1024             New_Msg  : constant String := Prefix & Exception_Name (X);
1025 
1026          begin
1027             --  No message present, just provide our own
1028 
1029             if Orig_Msg = "" then
1030                Raise_Exception_No_Defer
1031                  (E       => Program_Error'Identity,
1032                   Message => New_Msg);
1033 
1034             --  Message present, add informational prefix
1035 
1036             else
1037                Raise_Exception_No_Defer
1038                  (E       => Program_Error'Identity,
1039                   Message => New_Msg & ": " & Orig_Msg);
1040             end if;
1041          end;
1042       end if;
1043    end Raise_From_Controlled_Operation;
1044 
1045    -------------------------------------------
1046    -- Create_Occurrence_From_Signal_Handler --
1047    -------------------------------------------
1048 
1049    function Create_Occurrence_From_Signal_Handler
1050      (E : Exception_Id;
1051       M : System.Address) return EOA
1052    is
1053       X : constant EOA := Exception_Propagation.Allocate_Occurrence;
1054 
1055    begin
1056       Exception_Data.Set_Exception_C_Msg (X, E, M);
1057 
1058       if not ZCX_By_Default then
1059          Abort_Defer.all;
1060       end if;
1061 
1062       Complete_Occurrence (X);
1063       return X;
1064    end Create_Occurrence_From_Signal_Handler;
1065 
1066    ---------------------------------------------------
1067    -- Create_Machine_Occurrence_From_Signal_Handler --
1068    ---------------------------------------------------
1069 
1070    function Create_Machine_Occurrence_From_Signal_Handler
1071      (E : Exception_Id;
1072       M : System.Address) return System.Address
1073    is
1074    begin
1075       return Create_Occurrence_From_Signal_Handler (E, M).Machine_Occurrence;
1076    end Create_Machine_Occurrence_From_Signal_Handler;
1077 
1078    -------------------------------
1079    -- Raise_From_Signal_Handler --
1080    -------------------------------
1081 
1082    procedure Raise_From_Signal_Handler
1083      (E : Exception_Id;
1084       M : System.Address)
1085    is
1086    begin
1087       Exception_Propagation.Propagate_Exception
1088         (Create_Occurrence_From_Signal_Handler (E, M));
1089    end Raise_From_Signal_Handler;
1090 
1091    -------------------------
1092    -- Raise_Program_Error --
1093    -------------------------
1094 
1095    procedure Raise_Program_Error
1096      (File : System.Address;
1097       Line : Integer)
1098    is
1099    begin
1100       Raise_With_Location_And_Msg (Program_Error_Def'Access, File, Line);
1101    end Raise_Program_Error;
1102 
1103    -----------------------------
1104    -- Raise_Program_Error_Msg --
1105    -----------------------------
1106 
1107    procedure Raise_Program_Error_Msg
1108      (File : System.Address;
1109       Line : Integer;
1110       Msg  : System.Address)
1111    is
1112    begin
1113       Raise_With_Location_And_Msg
1114         (Program_Error_Def'Access, File, Line, M => Msg);
1115    end Raise_Program_Error_Msg;
1116 
1117    -------------------------
1118    -- Raise_Storage_Error --
1119    -------------------------
1120 
1121    procedure Raise_Storage_Error
1122      (File : System.Address;
1123       Line : Integer)
1124    is
1125    begin
1126       Raise_With_Location_And_Msg (Storage_Error_Def'Access, File, Line);
1127    end Raise_Storage_Error;
1128 
1129    -----------------------------
1130    -- Raise_Storage_Error_Msg --
1131    -----------------------------
1132 
1133    procedure Raise_Storage_Error_Msg
1134      (File : System.Address;
1135       Line : Integer;
1136       Msg  : System.Address)
1137    is
1138    begin
1139       Raise_With_Location_And_Msg
1140         (Storage_Error_Def'Access, File, Line, M => Msg);
1141    end Raise_Storage_Error_Msg;
1142 
1143    ---------------------------------
1144    -- Raise_With_Location_And_Msg --
1145    ---------------------------------
1146 
1147    procedure Raise_With_Location_And_Msg
1148      (E : Exception_Id;
1149       F : System.Address;
1150       L : Integer;
1151       C : Integer := 0;
1152       M : System.Address := System.Null_Address)
1153    is
1154       X : constant EOA := Exception_Propagation.Allocate_Occurrence;
1155    begin
1156       Exception_Data.Set_Exception_C_Msg (X, E, F, L, C, M);
1157 
1158       if not ZCX_By_Default then
1159          Abort_Defer.all;
1160       end if;
1161 
1162       Complete_And_Propagate_Occurrence (X);
1163    end Raise_With_Location_And_Msg;
1164 
1165    --------------------
1166    -- Raise_With_Msg --
1167    --------------------
1168 
1169    procedure Raise_With_Msg (E : Exception_Id) is
1170       Excep : constant EOA := Exception_Propagation.Allocate_Occurrence;
1171       Ex    : constant Exception_Occurrence_Access := Get_Current_Excep.all;
1172    begin
1173       Excep.Exception_Raised := False;
1174       Excep.Id               := E;
1175       Excep.Num_Tracebacks   := 0;
1176       Excep.Pid              := Local_Partition_ID;
1177 
1178       --  Copy the message from the current exception
1179       --  Change the interface to be called with an occurrence ???
1180 
1181       Excep.Msg_Length                  := Ex.Msg_Length;
1182       Excep.Msg (1 .. Excep.Msg_Length) := Ex.Msg (1 .. Ex.Msg_Length);
1183 
1184       --  The following is a common pattern, should be abstracted
1185       --  into a procedure call ???
1186 
1187       if not ZCX_By_Default then
1188          Abort_Defer.all;
1189       end if;
1190 
1191       Complete_And_Propagate_Occurrence (Excep);
1192    end Raise_With_Msg;
1193 
1194    -----------------------------------------
1195    -- Calls to Run-Time Check Subprograms --
1196    -----------------------------------------
1197 
1198    procedure Rcheck_CE_Access_Check
1199      (File : System.Address; Line : Integer)
1200    is
1201    begin
1202       Raise_Constraint_Error_Msg (File, Line, 0, Rmsg_00'Address);
1203    end Rcheck_CE_Access_Check;
1204 
1205    procedure Rcheck_CE_Null_Access_Parameter
1206      (File : System.Address; Line : Integer)
1207    is
1208    begin
1209       Raise_Constraint_Error_Msg (File, Line, 0, Rmsg_01'Address);
1210    end Rcheck_CE_Null_Access_Parameter;
1211 
1212    procedure Rcheck_CE_Discriminant_Check
1213      (File : System.Address; Line : Integer)
1214    is
1215    begin
1216       Raise_Constraint_Error_Msg (File, Line, 0, Rmsg_02'Address);
1217    end Rcheck_CE_Discriminant_Check;
1218 
1219    procedure Rcheck_CE_Divide_By_Zero
1220      (File : System.Address; Line : Integer)
1221    is
1222    begin
1223       Raise_Constraint_Error_Msg (File, Line, 0, Rmsg_03'Address);
1224    end Rcheck_CE_Divide_By_Zero;
1225 
1226    procedure Rcheck_CE_Explicit_Raise
1227      (File : System.Address; Line : Integer)
1228    is
1229    begin
1230       Raise_Constraint_Error_Msg (File, Line, 0, Rmsg_04'Address);
1231    end Rcheck_CE_Explicit_Raise;
1232 
1233    procedure Rcheck_CE_Index_Check
1234      (File : System.Address; Line : Integer)
1235    is
1236    begin
1237       Raise_Constraint_Error_Msg (File, Line, 0, Rmsg_05'Address);
1238    end Rcheck_CE_Index_Check;
1239 
1240    procedure Rcheck_CE_Invalid_Data
1241      (File : System.Address; Line : Integer)
1242    is
1243    begin
1244       Raise_Constraint_Error_Msg (File, Line, 0, Rmsg_06'Address);
1245    end Rcheck_CE_Invalid_Data;
1246 
1247    procedure Rcheck_CE_Length_Check
1248      (File : System.Address; Line : Integer)
1249    is
1250    begin
1251       Raise_Constraint_Error_Msg (File, Line, 0, Rmsg_07'Address);
1252    end Rcheck_CE_Length_Check;
1253 
1254    procedure Rcheck_CE_Null_Exception_Id
1255      (File : System.Address; Line : Integer)
1256    is
1257    begin
1258       Raise_Constraint_Error_Msg (File, Line, 0, Rmsg_08'Address);
1259    end Rcheck_CE_Null_Exception_Id;
1260 
1261    procedure Rcheck_CE_Null_Not_Allowed
1262      (File : System.Address; Line : Integer)
1263    is
1264    begin
1265       Raise_Constraint_Error_Msg (File, Line, 0, Rmsg_09'Address);
1266    end Rcheck_CE_Null_Not_Allowed;
1267 
1268    procedure Rcheck_CE_Overflow_Check
1269      (File : System.Address; Line : Integer)
1270    is
1271    begin
1272       Raise_Constraint_Error_Msg (File, Line, 0, Rmsg_10'Address);
1273    end Rcheck_CE_Overflow_Check;
1274 
1275    procedure Rcheck_CE_Partition_Check
1276      (File : System.Address; Line : Integer)
1277    is
1278    begin
1279       Raise_Constraint_Error_Msg (File, Line, 0, Rmsg_11'Address);
1280    end Rcheck_CE_Partition_Check;
1281 
1282    procedure Rcheck_CE_Range_Check
1283      (File : System.Address; Line : Integer)
1284    is
1285    begin
1286       Raise_Constraint_Error_Msg (File, Line, 0, Rmsg_12'Address);
1287    end Rcheck_CE_Range_Check;
1288 
1289    procedure Rcheck_CE_Tag_Check
1290      (File : System.Address; Line : Integer)
1291    is
1292    begin
1293       Raise_Constraint_Error_Msg (File, Line, 0, Rmsg_13'Address);
1294    end Rcheck_CE_Tag_Check;
1295 
1296    procedure Rcheck_PE_Access_Before_Elaboration
1297      (File : System.Address; Line : Integer)
1298    is
1299    begin
1300       Raise_Program_Error_Msg (File, Line, Rmsg_14'Address);
1301    end Rcheck_PE_Access_Before_Elaboration;
1302 
1303    procedure Rcheck_PE_Accessibility_Check
1304      (File : System.Address; Line : Integer)
1305    is
1306    begin
1307       Raise_Program_Error_Msg (File, Line, Rmsg_15'Address);
1308    end Rcheck_PE_Accessibility_Check;
1309 
1310    procedure Rcheck_PE_Address_Of_Intrinsic
1311      (File : System.Address; Line : Integer)
1312    is
1313    begin
1314       Raise_Program_Error_Msg (File, Line, Rmsg_16'Address);
1315    end Rcheck_PE_Address_Of_Intrinsic;
1316 
1317    procedure Rcheck_PE_Aliased_Parameters
1318      (File : System.Address; Line : Integer)
1319    is
1320    begin
1321       Raise_Program_Error_Msg (File, Line, Rmsg_17'Address);
1322    end Rcheck_PE_Aliased_Parameters;
1323 
1324    procedure Rcheck_PE_All_Guards_Closed
1325      (File : System.Address; Line : Integer)
1326    is
1327    begin
1328       Raise_Program_Error_Msg (File, Line, Rmsg_18'Address);
1329    end Rcheck_PE_All_Guards_Closed;
1330 
1331    procedure Rcheck_PE_Bad_Predicated_Generic_Type
1332      (File : System.Address; Line : Integer)
1333    is
1334    begin
1335       Raise_Program_Error_Msg (File, Line, Rmsg_19'Address);
1336    end Rcheck_PE_Bad_Predicated_Generic_Type;
1337 
1338    procedure Rcheck_PE_Current_Task_In_Entry_Body
1339      (File : System.Address; Line : Integer)
1340    is
1341    begin
1342       Raise_Program_Error_Msg (File, Line, Rmsg_20'Address);
1343    end Rcheck_PE_Current_Task_In_Entry_Body;
1344 
1345    procedure Rcheck_PE_Duplicated_Entry_Address
1346      (File : System.Address; Line : Integer)
1347    is
1348    begin
1349       Raise_Program_Error_Msg (File, Line, Rmsg_21'Address);
1350    end Rcheck_PE_Duplicated_Entry_Address;
1351 
1352    procedure Rcheck_PE_Explicit_Raise
1353      (File : System.Address; Line : Integer)
1354    is
1355    begin
1356       Raise_Program_Error_Msg (File, Line, Rmsg_22'Address);
1357    end Rcheck_PE_Explicit_Raise;
1358 
1359    procedure Rcheck_PE_Implicit_Return
1360      (File : System.Address; Line : Integer)
1361    is
1362    begin
1363       Raise_Program_Error_Msg (File, Line, Rmsg_24'Address);
1364    end Rcheck_PE_Implicit_Return;
1365 
1366    procedure Rcheck_PE_Misaligned_Address_Value
1367      (File : System.Address; Line : Integer)
1368    is
1369    begin
1370       Raise_Program_Error_Msg (File, Line, Rmsg_25'Address);
1371    end Rcheck_PE_Misaligned_Address_Value;
1372 
1373    procedure Rcheck_PE_Missing_Return
1374      (File : System.Address; Line : Integer)
1375    is
1376    begin
1377       Raise_Program_Error_Msg (File, Line, Rmsg_26'Address);
1378    end Rcheck_PE_Missing_Return;
1379 
1380    procedure Rcheck_PE_Non_Transportable_Actual
1381      (File : System.Address; Line : Integer)
1382    is
1383    begin
1384       Raise_Program_Error_Msg (File, Line, Rmsg_31'Address);
1385    end Rcheck_PE_Non_Transportable_Actual;
1386 
1387    procedure Rcheck_PE_Overlaid_Controlled_Object
1388      (File : System.Address; Line : Integer)
1389    is
1390    begin
1391       Raise_Program_Error_Msg (File, Line, Rmsg_27'Address);
1392    end Rcheck_PE_Overlaid_Controlled_Object;
1393 
1394    procedure Rcheck_PE_Potentially_Blocking_Operation
1395      (File : System.Address; Line : Integer)
1396    is
1397    begin
1398       Raise_Program_Error_Msg (File, Line, Rmsg_28'Address);
1399    end Rcheck_PE_Potentially_Blocking_Operation;
1400 
1401    procedure Rcheck_PE_Stream_Operation_Not_Allowed
1402      (File : System.Address; Line : Integer)
1403    is
1404    begin
1405       Raise_Program_Error_Msg (File, Line, Rmsg_36'Address);
1406    end Rcheck_PE_Stream_Operation_Not_Allowed;
1407 
1408    procedure Rcheck_PE_Stubbed_Subprogram_Called
1409      (File : System.Address; Line : Integer)
1410    is
1411    begin
1412       Raise_Program_Error_Msg (File, Line, Rmsg_29'Address);
1413    end Rcheck_PE_Stubbed_Subprogram_Called;
1414 
1415    procedure Rcheck_PE_Unchecked_Union_Restriction
1416      (File : System.Address; Line : Integer)
1417    is
1418    begin
1419       Raise_Program_Error_Msg (File, Line, Rmsg_30'Address);
1420    end Rcheck_PE_Unchecked_Union_Restriction;
1421 
1422    procedure Rcheck_SE_Empty_Storage_Pool
1423      (File : System.Address; Line : Integer)
1424    is
1425    begin
1426       Raise_Storage_Error_Msg (File, Line, Rmsg_32'Address);
1427    end Rcheck_SE_Empty_Storage_Pool;
1428 
1429    procedure Rcheck_SE_Explicit_Raise
1430      (File : System.Address; Line : Integer)
1431    is
1432    begin
1433       Raise_Storage_Error_Msg (File, Line, Rmsg_33'Address);
1434    end Rcheck_SE_Explicit_Raise;
1435 
1436    procedure Rcheck_SE_Infinite_Recursion
1437      (File : System.Address; Line : Integer)
1438    is
1439    begin
1440       Raise_Storage_Error_Msg (File, Line, Rmsg_34'Address);
1441    end Rcheck_SE_Infinite_Recursion;
1442 
1443    procedure Rcheck_SE_Object_Too_Large
1444      (File : System.Address; Line : Integer)
1445    is
1446    begin
1447       Raise_Storage_Error_Msg (File, Line, Rmsg_35'Address);
1448    end Rcheck_SE_Object_Too_Large;
1449 
1450    procedure Rcheck_CE_Access_Check_Ext
1451      (File : System.Address; Line, Column : Integer)
1452    is
1453    begin
1454       Raise_Constraint_Error_Msg (File, Line, Column, Rmsg_00'Address);
1455    end Rcheck_CE_Access_Check_Ext;
1456 
1457    procedure Rcheck_CE_Index_Check_Ext
1458      (File : System.Address; Line, Column, Index, First, Last : Integer)
1459    is
1460       Msg : constant String :=
1461               Rmsg_05 (Rmsg_05'First .. Rmsg_05'Last - 1) & ASCII.LF
1462               & "index " & Image (Index) & " not in " & Image (First)
1463               & ".." & Image (Last) & ASCII.NUL;
1464    begin
1465       Raise_Constraint_Error_Msg (File, Line, Column, Msg'Address);
1466    end Rcheck_CE_Index_Check_Ext;
1467 
1468    procedure Rcheck_CE_Invalid_Data_Ext
1469      (File : System.Address; Line, Column, Index, First, Last : Integer)
1470    is
1471       Msg : constant String :=
1472               Rmsg_06 (Rmsg_06'First .. Rmsg_06'Last - 1) & ASCII.LF
1473               & "value " & Image (Index) & " not in " & Image (First)
1474               & ".." & Image (Last) & ASCII.NUL;
1475    begin
1476       Raise_Constraint_Error_Msg (File, Line, Column, Msg'Address);
1477    end Rcheck_CE_Invalid_Data_Ext;
1478 
1479    procedure Rcheck_CE_Range_Check_Ext
1480      (File : System.Address; Line, Column, Index, First, Last : Integer)
1481    is
1482       Msg : constant String :=
1483               Rmsg_12 (Rmsg_12'First .. Rmsg_12'Last - 1) & ASCII.LF
1484               & "value " & Image (Index) & " not in " & Image (First)
1485               & ".." & Image (Last) & ASCII.NUL;
1486    begin
1487       Raise_Constraint_Error_Msg (File, Line, Column, Msg'Address);
1488    end Rcheck_CE_Range_Check_Ext;
1489 
1490    procedure Rcheck_PE_Finalize_Raised_Exception
1491      (File : System.Address; Line : Integer)
1492    is
1493       X : constant EOA := Exception_Propagation.Allocate_Occurrence;
1494 
1495    begin
1496       --  This is "finalize/adjust raised exception". This subprogram is always
1497       --  called with abort deferred, unlike all other Rcheck_* subprograms, it
1498       --  needs to call Raise_Exception_No_Defer.
1499 
1500       --  This is consistent with Raise_From_Controlled_Operation
1501 
1502       Exception_Data.Set_Exception_C_Msg
1503         (X, Program_Error_Def'Access, File, Line, 0, Rmsg_23'Address);
1504       Complete_And_Propagate_Occurrence (X);
1505    end Rcheck_PE_Finalize_Raised_Exception;
1506 
1507    -------------
1508    -- Reraise --
1509    -------------
1510 
1511    procedure Reraise is
1512       Excep    : constant EOA := Exception_Propagation.Allocate_Occurrence;
1513       Saved_MO : constant System.Address := Excep.Machine_Occurrence;
1514 
1515    begin
1516       if not ZCX_By_Default then
1517          Abort_Defer.all;
1518       end if;
1519 
1520       Save_Occurrence (Excep.all, Get_Current_Excep.all.all);
1521       Excep.Machine_Occurrence := Saved_MO;
1522       Complete_And_Propagate_Occurrence (Excep);
1523    end Reraise;
1524 
1525    --------------------------------------
1526    -- Reraise_Library_Exception_If_Any --
1527    --------------------------------------
1528 
1529    procedure Reraise_Library_Exception_If_Any is
1530       LE : Exception_Occurrence;
1531 
1532    begin
1533       if Library_Exception_Set then
1534          LE := Library_Exception;
1535 
1536          if LE.Id = Null_Id then
1537             Raise_Exception_No_Defer
1538               (E       => Program_Error'Identity,
1539                Message => "finalize/adjust raised exception");
1540          else
1541             Raise_From_Controlled_Operation (LE);
1542          end if;
1543       end if;
1544    end Reraise_Library_Exception_If_Any;
1545 
1546    ------------------------
1547    -- Reraise_Occurrence --
1548    ------------------------
1549 
1550    procedure Reraise_Occurrence (X : Exception_Occurrence) is
1551    begin
1552       if X.Id = null then
1553          return;
1554       else
1555          Reraise_Occurrence_Always (X);
1556       end if;
1557    end Reraise_Occurrence;
1558 
1559    -------------------------------
1560    -- Reraise_Occurrence_Always --
1561    -------------------------------
1562 
1563    procedure Reraise_Occurrence_Always (X : Exception_Occurrence) is
1564    begin
1565       if not ZCX_By_Default then
1566          Abort_Defer.all;
1567       end if;
1568 
1569       Reraise_Occurrence_No_Defer (X);
1570    end Reraise_Occurrence_Always;
1571 
1572    ---------------------------------
1573    -- Reraise_Occurrence_No_Defer --
1574    ---------------------------------
1575 
1576    procedure Reraise_Occurrence_No_Defer (X : Exception_Occurrence) is
1577       Excep    : constant EOA := Exception_Propagation.Allocate_Occurrence;
1578       Saved_MO : constant System.Address := Excep.Machine_Occurrence;
1579    begin
1580       Save_Occurrence (Excep.all, X);
1581       Excep.Machine_Occurrence := Saved_MO;
1582       Complete_And_Propagate_Occurrence (Excep);
1583    end Reraise_Occurrence_No_Defer;
1584 
1585    ---------------------
1586    -- Save_Occurrence --
1587    ---------------------
1588 
1589    procedure Save_Occurrence
1590      (Target : out Exception_Occurrence;
1591       Source : Exception_Occurrence)
1592    is
1593    begin
1594       --  As the machine occurrence might be a data that must be finalized
1595       --  (outside any Ada mechanism), do not copy it
1596 
1597       Target.Id                 := Source.Id;
1598       Target.Machine_Occurrence := System.Null_Address;
1599       Target.Msg_Length         := Source.Msg_Length;
1600       Target.Num_Tracebacks     := Source.Num_Tracebacks;
1601       Target.Pid                := Source.Pid;
1602 
1603       Target.Msg (1 .. Target.Msg_Length) :=
1604         Source.Msg (1 .. Target.Msg_Length);
1605 
1606       Target.Tracebacks (1 .. Target.Num_Tracebacks) :=
1607         Source.Tracebacks (1 .. Target.Num_Tracebacks);
1608    end Save_Occurrence;
1609 
1610    function Save_Occurrence (Source : Exception_Occurrence) return EOA is
1611       Target : constant EOA := new Exception_Occurrence;
1612    begin
1613       Save_Occurrence (Target.all, Source);
1614       return Target;
1615    end Save_Occurrence;
1616 
1617    -------------------
1618    -- String_To_EId --
1619    -------------------
1620 
1621    function String_To_EId (S : String) return Exception_Id
1622      renames Stream_Attributes.String_To_EId;
1623 
1624    ------------------
1625    -- String_To_EO --
1626    ------------------
1627 
1628    function String_To_EO (S : String) return Exception_Occurrence
1629      renames Stream_Attributes.String_To_EO;
1630 
1631    ---------------
1632    -- To_Stderr --
1633    ---------------
1634 
1635    procedure To_Stderr (C : Character) is
1636       procedure Put_Char_Stderr (C : Character);
1637       pragma Import (C, Put_Char_Stderr, "put_char_stderr");
1638    begin
1639       Put_Char_Stderr (C);
1640    end To_Stderr;
1641 
1642    procedure To_Stderr (S : String) is
1643    begin
1644       for J in S'Range loop
1645          if S (J) /= ASCII.CR then
1646             To_Stderr (S (J));
1647          end if;
1648       end loop;
1649    end To_Stderr;
1650 
1651    -------------------------
1652    -- Transfer_Occurrence --
1653    -------------------------
1654 
1655    procedure Transfer_Occurrence
1656      (Target : Exception_Occurrence_Access;
1657       Source : Exception_Occurrence)
1658    is
1659    begin
1660       Save_Occurrence (Target.all, Source);
1661    end Transfer_Occurrence;
1662 
1663    ------------------------
1664    -- Triggered_By_Abort --
1665    ------------------------
1666 
1667    function Triggered_By_Abort return Boolean is
1668       Ex : constant Exception_Occurrence_Access := Get_Current_Excep.all;
1669    begin
1670       return Ex /= null
1671         and then Exception_Identity (Ex.all) = Standard'Abort_Signal'Identity;
1672    end Triggered_By_Abort;
1673 
1674    -------------------------
1675    -- Wide_Exception_Name --
1676    -------------------------
1677 
1678    WC_Encoding : Character;
1679    pragma Import (C, WC_Encoding, "__gl_wc_encoding");
1680    --  Encoding method for source, as exported by binder
1681 
1682    function Wide_Exception_Name
1683      (Id : Exception_Id) return Wide_String
1684    is
1685       S : constant String := Exception_Name (Id);
1686       W : Wide_String (1 .. S'Length);
1687       L : Natural;
1688    begin
1689       String_To_Wide_String
1690         (S, W, L, Get_WC_Encoding_Method (WC_Encoding));
1691       return W (1 .. L);
1692    end Wide_Exception_Name;
1693 
1694    function Wide_Exception_Name
1695      (X : Exception_Occurrence) return Wide_String
1696    is
1697       S : constant String := Exception_Name (X);
1698       W : Wide_String (1 .. S'Length);
1699       L : Natural;
1700    begin
1701       String_To_Wide_String
1702         (S, W, L, Get_WC_Encoding_Method (WC_Encoding));
1703       return W (1 .. L);
1704    end Wide_Exception_Name;
1705 
1706    ----------------------------
1707    -- Wide_Wide_Exception_Name --
1708    -----------------------------
1709 
1710    function Wide_Wide_Exception_Name
1711      (Id : Exception_Id) return Wide_Wide_String
1712    is
1713       S : constant String := Exception_Name (Id);
1714       W : Wide_Wide_String (1 .. S'Length);
1715       L : Natural;
1716    begin
1717       String_To_Wide_Wide_String
1718         (S, W, L, Get_WC_Encoding_Method (WC_Encoding));
1719       return W (1 .. L);
1720    end Wide_Wide_Exception_Name;
1721 
1722    function Wide_Wide_Exception_Name
1723      (X : Exception_Occurrence) return Wide_Wide_String
1724    is
1725       S : constant String := Exception_Name (X);
1726       W : Wide_Wide_String (1 .. S'Length);
1727       L : Natural;
1728    begin
1729       String_To_Wide_Wide_String
1730         (S, W, L, Get_WC_Encoding_Method (WC_Encoding));
1731       return W (1 .. L);
1732    end Wide_Wide_Exception_Name;
1733 
1734    --------------------------
1735    -- Code_Address_For_ZZZ --
1736    --------------------------
1737 
1738    --  This function gives us the end of the PC range for addresses
1739    --  within the exception unit itself. We hope that gigi/gcc keeps all the
1740    --  procedures in their original order.
1741 
1742    function Code_Address_For_ZZZ return System.Address is
1743    begin
1744       <<Start_Of_ZZZ>>
1745       return Start_Of_ZZZ'Address;
1746    end Code_Address_For_ZZZ;
1747 
1748 end Ada.Exceptions;