1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
5 -- A D A . E X C E P T I O N S --
9 -- Copyright (C) 1992-2014, Free Software Foundation, Inc. --
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. --
18 -- As a special exception under Section 7 of GPL version 3, you are granted --
19 -- additional permissions described in the GCC Runtime Library Exception, --
20 -- version 3.1, as published by the Free Software Foundation. --
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/>. --
27 -- GNAT was originally developed by the GNAT team at New York University. --
28 -- Extensive contributions were provided by Ada Core Technologies Inc. --
30 ------------------------------------------------------------------------------
32 -- This version of Ada.Exceptions fully supports both Ada 95 and Ada 2005.
33 -- It is used in all situations except for the build of the compiler and
34 -- other basic tools. For these latter builds, we use an Ada 95-only version.
36 -- The reason for this splitting off of a separate version is that bootstrap
37 -- compilers often will be used that do not support Ada 2005 features, and
38 -- Ada.Exceptions is part of the compiler sources.
40 pragma Style_Checks
(All_Checks
);
41 -- No subprogram ordering check, due to logical grouping
44 -- We must turn polling off for this unit, because otherwise we get
45 -- elaboration circularities with System.Exception_Tables.
47 with System
; use System
;
48 with System
.Exceptions
; use System
.Exceptions
;
49 with System
.Exceptions_Debug
; use System
.Exceptions_Debug
;
50 with System
.Standard_Library
; use System
.Standard_Library
;
51 with System
.Soft_Links
; use System
.Soft_Links
;
52 with System
.WCh_Con
; use System
.WCh_Con
;
53 with System
.WCh_StW
; use System
.WCh_StW
;
55 package body Ada
.Exceptions
is
57 pragma Suppress
(All_Checks
);
58 -- We definitely do not want exceptions occurring within this unit, or
59 -- we are in big trouble. If an exceptional situation does occur, better
60 -- that it not be raised, since raising it can cause confusing chaos.
62 -----------------------
63 -- Local Subprograms --
64 -----------------------
66 -- Note: the exported subprograms in this package body are called directly
67 -- from C clients using the given external name, even though they are not
68 -- technically visible in the Ada sense.
70 function Code_Address_For_AAA
return System
.Address
;
71 function Code_Address_For_ZZZ
return System
.Address
;
72 -- Return start and end of procedures in this package
74 -- These procedures are used to provide exclusion bounds in
75 -- calls to Call_Chain at exception raise points from this unit. The
76 -- purpose is to arrange for the exception tracebacks not to include
77 -- frames from subprograms involved in the raise process, as these are
78 -- meaningless from the user's standpoint.
80 -- For these bounds to be meaningful, we need to ensure that the object
81 -- code for the subprograms involved in processing a raise is located
82 -- after the object code Code_Address_For_AAA and before the object
83 -- code Code_Address_For_ZZZ. This will indeed be the case as long as
84 -- the following rules are respected:
86 -- 1) The bodies of the subprograms involved in processing a raise
87 -- are located after the body of Code_Address_For_AAA and before the
88 -- body of Code_Address_For_ZZZ.
90 -- 2) No pragma Inline applies to any of these subprograms, as this
91 -- could delay the corresponding assembly output until the end of
94 procedure Call_Chain
(Excep
: EOA
);
95 -- Store up to Max_Tracebacks in Excep, corresponding to the current
98 function Image
(Index
: Integer) return String;
99 -- Return string image corresponding to Index
101 procedure To_Stderr
(S
: String);
102 pragma Export
(Ada
, To_Stderr
, "__gnat_to_stderr");
103 -- Little routine to output string to stderr that is also used
104 -- in the tasking run time.
106 procedure To_Stderr
(C
: Character);
107 pragma Inline
(To_Stderr
);
108 pragma Export
(Ada
, To_Stderr
, "__gnat_to_stderr_char");
109 -- Little routine to output a character to stderr, used by some of
110 -- the separate units below.
112 package Exception_Data
is
114 -----------------------------------
115 -- Exception Message Subprograms --
116 -----------------------------------
118 procedure Set_Exception_C_Msg
121 Msg1
: System
.Address
;
123 Column
: Integer := 0;
124 Msg2
: System
.Address
:= System
.Null_Address
);
125 -- This routine is called to setup the exception referenced by X
126 -- to contain the indicated Id value and message. Msg1 is a null
127 -- terminated string which is generated as the exception message. If
128 -- line is non-zero, then a colon and the decimal representation of
129 -- this integer is appended to the message. Ditto for Column. When Msg2
130 -- is non-null, a space and this additional null terminated string is
131 -- added to the message.
133 procedure Set_Exception_Msg
137 -- This routine is called to setup the exception referenced by X
138 -- to contain the indicated Id value and message. Message is a string
139 -- which is generated as the exception message.
141 ---------------------------------------
142 -- Exception Information Subprograms --
143 ---------------------------------------
145 function Untailored_Exception_Information
146 (X
: Exception_Occurrence
) return String;
147 -- This is used by Stream_Attributes.EO_To_String to convert an
148 -- Exception_Occurrence to a String for the stream attributes.
149 -- String_To_EO understands the format, as documented here.
151 -- The format of the string is as follows:
153 -- Exception_Name: <exception name> (as in Exception_Name)
154 -- Message: <message> (only if Exception_Message is empty)
155 -- PID=nnnn (only if != 0)
156 -- Call stack traceback locations: (only if at least one location)
157 -- <0xyyyyyyyy 0xyyyyyyyy ...> (is recorded)
159 -- The lines are separated by a ASCII.LF character.
160 -- The nnnn is the partition Id given as decimal digits.
161 -- The 0x... line represents traceback program counter locations, in
162 -- execution order with the first one being the exception location.
164 -- The Exception_Name and Message lines are omitted in the abort
165 -- signal case, since this is not really an exception.
167 -- Note: If the format of the generated string is changed, please note
168 -- that an equivalent modification to the routine String_To_EO must be
169 -- made to preserve proper functioning of the stream attributes.
171 function Exception_Information
(X
: Exception_Occurrence
) return String;
172 -- This is the implementation of Ada.Exceptions.Exception_Information,
173 -- as defined in the Ada RM.
175 -- If no traceback decorator (see GNAT.Exception_Traces) is currently
176 -- in place, this is the same as Untailored_Exception_Information.
177 -- Otherwise, the decorator is used to produce a symbolic traceback
178 -- instead of hexadecimal addresses.
180 -- Note that unlike Untailored_Exception_Information, there is no need
181 -- to keep the output of Exception_Information stable for streaming
182 -- purposes, and in fact the output differs across platforms.
186 package Exception_Traces
is
188 -------------------------------------------------
189 -- Run-Time Exception Notification Subprograms --
190 -------------------------------------------------
192 -- These subprograms provide a common run-time interface to trigger the
193 -- actions required when an exception is about to be propagated (e.g.
194 -- user specified actions or output of exception information). They are
195 -- exported to be usable by the Ada exception handling personality
196 -- routine when the GCC 3 mechanism is used.
198 procedure Notify_Handled_Exception
(Excep
: EOA
);
200 (C
, Notify_Handled_Exception
, "__gnat_notify_handled_exception");
201 -- This routine is called for a handled occurrence is about to be
204 procedure Notify_Unhandled_Exception
(Excep
: EOA
);
206 (C
, Notify_Unhandled_Exception
, "__gnat_notify_unhandled_exception");
207 -- This routine is called when an unhandled occurrence is about to be
210 procedure Unhandled_Exception_Terminate
(Excep
: EOA
);
211 pragma No_Return
(Unhandled_Exception_Terminate
);
212 -- This procedure is called to terminate execution following an
213 -- unhandled exception. The exception information, including
214 -- traceback if available is output, and execution is then
215 -- terminated. Note that at the point where this routine is
216 -- called, the stack has typically been destroyed.
218 end Exception_Traces
;
220 package Exception_Propagation
is
222 ---------------------------------------
223 -- Exception Propagation Subprograms --
224 ---------------------------------------
226 function Allocate_Occurrence
return EOA
;
227 -- Allocate an exception occurence (as well as the machine occurence)
229 procedure Propagate_Exception
(Excep
: EOA
);
230 pragma No_Return
(Propagate_Exception
);
231 -- This procedure propagates the exception represented by Excep
233 end Exception_Propagation
;
235 package Stream_Attributes
is
237 ----------------------------------
238 -- Stream Attribute Subprograms --
239 ----------------------------------
241 function EId_To_String
(X
: Exception_Id
) return String;
242 function String_To_EId
(S
: String) return Exception_Id
;
243 -- Functions for implementing Exception_Id stream attributes
245 function EO_To_String
(X
: Exception_Occurrence
) return String;
246 function String_To_EO
(S
: String) return Exception_Occurrence
;
247 -- Functions for implementing Exception_Occurrence stream
250 end Stream_Attributes
;
252 procedure Complete_Occurrence
(X
: EOA
);
253 -- Finish building the occurrence: save the call chain and notify the
256 procedure Complete_And_Propagate_Occurrence
(X
: EOA
);
257 pragma No_Return
(Complete_And_Propagate_Occurrence
);
258 -- This is a simple wrapper to Complete_Occurrence and
259 -- Exception_Propagation.Propagate_Exception.
261 function Create_Occurrence_From_Signal_Handler
263 M
: System
.Address
) return EOA
;
264 -- Create and build an exception occurrence using exception id E and
265 -- nul-terminated message M.
267 function Create_Machine_Occurrence_From_Signal_Handler
269 M
: System
.Address
) return System
.Address
;
270 pragma Export
(C
, Create_Machine_Occurrence_From_Signal_Handler
,
271 "__gnat_create_machine_occurrence_from_signal_handler");
272 -- Create and build an exception occurrence using exception id E and
273 -- nul-terminated message M. Return the machine occurrence.
275 procedure Raise_Exception_No_Defer
277 Message
: String := "");
279 (Ada
, Raise_Exception_No_Defer
,
280 "ada__exceptions__raise_exception_no_defer");
281 pragma No_Return
(Raise_Exception_No_Defer
);
282 -- Similar to Raise_Exception, but with no abort deferral
284 procedure Raise_With_Msg
(E
: Exception_Id
);
285 pragma No_Return
(Raise_With_Msg
);
286 pragma Export
(C
, Raise_With_Msg
, "__gnat_raise_with_msg");
287 -- Raises an exception with given exception id value. A message
288 -- is associated with the raise, and has already been stored in the
289 -- exception occurrence referenced by the Current_Excep in the TSD.
290 -- Abort is deferred before the raise call.
292 procedure Raise_With_Location_And_Msg
297 M
: System
.Address
:= System
.Null_Address
);
298 pragma No_Return
(Raise_With_Location_And_Msg
);
299 -- Raise an exception with given exception id value. A filename and line
300 -- number is associated with the raise and is stored in the exception
301 -- occurrence and in addition a column and a string message M may be
302 -- appended to this (if not null/0).
304 procedure Raise_Constraint_Error
(File
: System
.Address
; Line
: Integer);
305 pragma No_Return
(Raise_Constraint_Error
);
306 pragma Export
(C
, Raise_Constraint_Error
, "__gnat_raise_constraint_error");
307 -- Raise constraint error with file:line information
309 procedure Raise_Constraint_Error_Msg
310 (File
: System
.Address
;
313 Msg
: System
.Address
);
314 pragma No_Return
(Raise_Constraint_Error_Msg
);
316 (C
, Raise_Constraint_Error_Msg
, "__gnat_raise_constraint_error_msg");
317 -- Raise constraint error with file:line:col + msg information
319 procedure Raise_Program_Error
(File
: System
.Address
; Line
: Integer);
320 pragma No_Return
(Raise_Program_Error
);
321 pragma Export
(C
, Raise_Program_Error
, "__gnat_raise_program_error");
322 -- Raise program error with file:line information
324 procedure Raise_Program_Error_Msg
325 (File
: System
.Address
;
327 Msg
: System
.Address
);
328 pragma No_Return
(Raise_Program_Error_Msg
);
330 (C
, Raise_Program_Error_Msg
, "__gnat_raise_program_error_msg");
331 -- Raise program error with file:line + msg information
333 procedure Raise_Storage_Error
(File
: System
.Address
; Line
: Integer);
334 pragma No_Return
(Raise_Storage_Error
);
335 pragma Export
(C
, Raise_Storage_Error
, "__gnat_raise_storage_error");
336 -- Raise storage error with file:line information
338 procedure Raise_Storage_Error_Msg
339 (File
: System
.Address
;
341 Msg
: System
.Address
);
342 pragma No_Return
(Raise_Storage_Error_Msg
);
344 (C
, Raise_Storage_Error_Msg
, "__gnat_raise_storage_error_msg");
345 -- Raise storage error with file:line + reason msg information
347 -- The exception raising process and the automatic tracing mechanism rely
348 -- on some careful use of flags attached to the exception occurrence. The
349 -- graph below illustrates the relations between the Raise_ subprograms
350 -- and identifies the points where basic flags such as Exception_Raised
353 -- (i) signs indicate the flags initialization points. R stands for Raise,
354 -- W for With, and E for Exception.
356 -- R_No_Msg R_E R_Pe R_Ce R_Se
358 -- +--+ +--+ +---+ | +---+
360 -- R_E_No_Defer(i) R_W_Msg(i) R_W_Loc
362 -- +------------+ | +-----------+ +--+
364 -- | | | Set_E_C_Msg(i)
366 -- Complete_And_Propagate_Occurrence
369 pragma No_Return
(Reraise
);
370 pragma Export
(C
, Reraise
, "__gnat_reraise");
371 -- Reraises the exception referenced by the Current_Excep field
372 -- of the TSD (all fields of this exception occurrence are set).
373 -- Abort is deferred before the reraise operation. Called from
374 -- System.Tasking.RendezVous.Exceptional_Complete_RendezVous
376 procedure Transfer_Occurrence
377 (Target
: Exception_Occurrence_Access
;
378 Source
: Exception_Occurrence
);
379 pragma Export
(C
, Transfer_Occurrence
, "__gnat_transfer_occurrence");
380 -- Called from s-tasren.adb:Local_Complete_RendezVous and
381 -- s-tpobop.adb:Exceptional_Complete_Entry_Body to setup Target from
382 -- Source as an exception to be propagated in the caller task. Target is
383 -- expected to be a pointer to the fixed TSD occurrence for this task.
385 --------------------------------
386 -- Run-Time Check Subprograms --
387 --------------------------------
389 -- These subprograms raise a specific exception with a reason message
390 -- attached. The parameters are the file name and line number in each
391 -- case. The names are defined by Exp_Ch11.Get_RT_Exception_Name.
393 procedure Rcheck_CE_Access_Check
394 (File
: System
.Address
; Line
: Integer);
395 procedure Rcheck_CE_Null_Access_Parameter
396 (File
: System
.Address
; Line
: Integer);
397 procedure Rcheck_CE_Discriminant_Check
398 (File
: System
.Address
; Line
: Integer);
399 procedure Rcheck_CE_Divide_By_Zero
400 (File
: System
.Address
; Line
: Integer);
401 procedure Rcheck_CE_Explicit_Raise
402 (File
: System
.Address
; Line
: Integer);
403 procedure Rcheck_CE_Index_Check
404 (File
: System
.Address
; Line
: Integer);
405 procedure Rcheck_CE_Invalid_Data
406 (File
: System
.Address
; Line
: Integer);
407 procedure Rcheck_CE_Length_Check
408 (File
: System
.Address
; Line
: Integer);
409 procedure Rcheck_CE_Null_Exception_Id
410 (File
: System
.Address
; Line
: Integer);
411 procedure Rcheck_CE_Null_Not_Allowed
412 (File
: System
.Address
; Line
: Integer);
413 procedure Rcheck_CE_Overflow_Check
414 (File
: System
.Address
; Line
: Integer);
415 procedure Rcheck_CE_Partition_Check
416 (File
: System
.Address
; Line
: Integer);
417 procedure Rcheck_CE_Range_Check
418 (File
: System
.Address
; Line
: Integer);
419 procedure Rcheck_CE_Tag_Check
420 (File
: System
.Address
; Line
: Integer);
421 procedure Rcheck_PE_Access_Before_Elaboration
422 (File
: System
.Address
; Line
: Integer);
423 procedure Rcheck_PE_Accessibility_Check
424 (File
: System
.Address
; Line
: Integer);
425 procedure Rcheck_PE_Address_Of_Intrinsic
426 (File
: System
.Address
; Line
: Integer);
427 procedure Rcheck_PE_Aliased_Parameters
428 (File
: System
.Address
; Line
: Integer);
429 procedure Rcheck_PE_All_Guards_Closed
430 (File
: System
.Address
; Line
: Integer);
431 procedure Rcheck_PE_Bad_Predicated_Generic_Type
432 (File
: System
.Address
; Line
: Integer);
433 procedure Rcheck_PE_Current_Task_In_Entry_Body
434 (File
: System
.Address
; Line
: Integer);
435 procedure Rcheck_PE_Duplicated_Entry_Address
436 (File
: System
.Address
; Line
: Integer);
437 procedure Rcheck_PE_Explicit_Raise
438 (File
: System
.Address
; Line
: Integer);
439 procedure Rcheck_PE_Implicit_Return
440 (File
: System
.Address
; Line
: Integer);
441 procedure Rcheck_PE_Misaligned_Address_Value
442 (File
: System
.Address
; Line
: Integer);
443 procedure Rcheck_PE_Missing_Return
444 (File
: System
.Address
; Line
: Integer);
445 procedure Rcheck_PE_Non_Transportable_Actual
446 (File
: System
.Address
; Line
: Integer);
447 procedure Rcheck_PE_Overlaid_Controlled_Object
448 (File
: System
.Address
; Line
: Integer);
449 procedure Rcheck_PE_Potentially_Blocking_Operation
450 (File
: System
.Address
; Line
: Integer);
451 procedure Rcheck_PE_Stubbed_Subprogram_Called
452 (File
: System
.Address
; Line
: Integer);
453 procedure Rcheck_PE_Unchecked_Union_Restriction
454 (File
: System
.Address
; Line
: Integer);
455 procedure Rcheck_SE_Empty_Storage_Pool
456 (File
: System
.Address
; Line
: Integer);
457 procedure Rcheck_SE_Explicit_Raise
458 (File
: System
.Address
; Line
: Integer);
459 procedure Rcheck_SE_Infinite_Recursion
460 (File
: System
.Address
; Line
: Integer);
461 procedure Rcheck_SE_Object_Too_Large
462 (File
: System
.Address
; Line
: Integer);
463 procedure Rcheck_PE_Stream_Operation_Not_Allowed
464 (File
: System
.Address
; Line
: Integer);
465 procedure Rcheck_CE_Access_Check_Ext
466 (File
: System
.Address
; Line
, Column
: Integer);
467 procedure Rcheck_CE_Index_Check_Ext
468 (File
: System
.Address
; Line
, Column
, Index
, First
, Last
: Integer);
469 procedure Rcheck_CE_Invalid_Data_Ext
470 (File
: System
.Address
; Line
, Column
, Index
, First
, Last
: Integer);
471 procedure Rcheck_CE_Range_Check_Ext
472 (File
: System
.Address
; Line
, Column
, Index
, First
, Last
: Integer);
474 procedure Rcheck_PE_Finalize_Raised_Exception
475 (File
: System
.Address
; Line
: Integer);
476 -- This routine is separated out because it has quite different behavior
477 -- from the others. This is the "finalize/adjust raised exception". This
478 -- subprogram is always called with abort deferred, unlike all other
479 -- Rcheck_* subprograms, it needs to call Raise_Exception_No_Defer.
481 pragma Export
(C
, Rcheck_CE_Access_Check
,
482 "__gnat_rcheck_CE_Access_Check");
483 pragma Export
(C
, Rcheck_CE_Null_Access_Parameter
,
484 "__gnat_rcheck_CE_Null_Access_Parameter");
485 pragma Export
(C
, Rcheck_CE_Discriminant_Check
,
486 "__gnat_rcheck_CE_Discriminant_Check");
487 pragma Export
(C
, Rcheck_CE_Divide_By_Zero
,
488 "__gnat_rcheck_CE_Divide_By_Zero");
489 pragma Export
(C
, Rcheck_CE_Explicit_Raise
,
490 "__gnat_rcheck_CE_Explicit_Raise");
491 pragma Export
(C
, Rcheck_CE_Index_Check
,
492 "__gnat_rcheck_CE_Index_Check");
493 pragma Export
(C
, Rcheck_CE_Invalid_Data
,
494 "__gnat_rcheck_CE_Invalid_Data");
495 pragma Export
(C
, Rcheck_CE_Length_Check
,
496 "__gnat_rcheck_CE_Length_Check");
497 pragma Export
(C
, Rcheck_CE_Null_Exception_Id
,
498 "__gnat_rcheck_CE_Null_Exception_Id");
499 pragma Export
(C
, Rcheck_CE_Null_Not_Allowed
,
500 "__gnat_rcheck_CE_Null_Not_Allowed");
501 pragma Export
(C
, Rcheck_CE_Overflow_Check
,
502 "__gnat_rcheck_CE_Overflow_Check");
503 pragma Export
(C
, Rcheck_CE_Partition_Check
,
504 "__gnat_rcheck_CE_Partition_Check");
505 pragma Export
(C
, Rcheck_CE_Range_Check
,
506 "__gnat_rcheck_CE_Range_Check");
507 pragma Export
(C
, Rcheck_CE_Tag_Check
,
508 "__gnat_rcheck_CE_Tag_Check");
509 pragma Export
(C
, Rcheck_PE_Access_Before_Elaboration
,
510 "__gnat_rcheck_PE_Access_Before_Elaboration");
511 pragma Export
(C
, Rcheck_PE_Accessibility_Check
,
512 "__gnat_rcheck_PE_Accessibility_Check");
513 pragma Export
(C
, Rcheck_PE_Address_Of_Intrinsic
,
514 "__gnat_rcheck_PE_Address_Of_Intrinsic");
515 pragma Export
(C
, Rcheck_PE_Aliased_Parameters
,
516 "__gnat_rcheck_PE_Aliased_Parameters");
517 pragma Export
(C
, Rcheck_PE_All_Guards_Closed
,
518 "__gnat_rcheck_PE_All_Guards_Closed");
519 pragma Export
(C
, Rcheck_PE_Bad_Predicated_Generic_Type
,
520 "__gnat_rcheck_PE_Bad_Predicated_Generic_Type");
521 pragma Export
(C
, Rcheck_PE_Current_Task_In_Entry_Body
,
522 "__gnat_rcheck_PE_Current_Task_In_Entry_Body");
523 pragma Export
(C
, Rcheck_PE_Duplicated_Entry_Address
,
524 "__gnat_rcheck_PE_Duplicated_Entry_Address");
525 pragma Export
(C
, Rcheck_PE_Explicit_Raise
,
526 "__gnat_rcheck_PE_Explicit_Raise");
527 pragma Export
(C
, Rcheck_PE_Finalize_Raised_Exception
,
528 "__gnat_rcheck_PE_Finalize_Raised_Exception");
529 pragma Export
(C
, Rcheck_PE_Implicit_Return
,
530 "__gnat_rcheck_PE_Implicit_Return");
531 pragma Export
(C
, Rcheck_PE_Misaligned_Address_Value
,
532 "__gnat_rcheck_PE_Misaligned_Address_Value");
533 pragma Export
(C
, Rcheck_PE_Missing_Return
,
534 "__gnat_rcheck_PE_Missing_Return");
535 pragma Export
(C
, Rcheck_PE_Non_Transportable_Actual
,
536 "__gnat_rcheck_PE_Non_Transportable_Actual");
537 pragma Export
(C
, Rcheck_PE_Overlaid_Controlled_Object
,
538 "__gnat_rcheck_PE_Overlaid_Controlled_Object");
539 pragma Export
(C
, Rcheck_PE_Potentially_Blocking_Operation
,
540 "__gnat_rcheck_PE_Potentially_Blocking_Operation");
541 pragma Export
(C
, Rcheck_PE_Stream_Operation_Not_Allowed
,
542 "__gnat_rcheck_PE_Stream_Operation_Not_Allowed");
543 pragma Export
(C
, Rcheck_PE_Stubbed_Subprogram_Called
,
544 "__gnat_rcheck_PE_Stubbed_Subprogram_Called");
545 pragma Export
(C
, Rcheck_PE_Unchecked_Union_Restriction
,
546 "__gnat_rcheck_PE_Unchecked_Union_Restriction");
547 pragma Export
(C
, Rcheck_SE_Empty_Storage_Pool
,
548 "__gnat_rcheck_SE_Empty_Storage_Pool");
549 pragma Export
(C
, Rcheck_SE_Explicit_Raise
,
550 "__gnat_rcheck_SE_Explicit_Raise");
551 pragma Export
(C
, Rcheck_SE_Infinite_Recursion
,
552 "__gnat_rcheck_SE_Infinite_Recursion");
553 pragma Export
(C
, Rcheck_SE_Object_Too_Large
,
554 "__gnat_rcheck_SE_Object_Too_Large");
556 pragma Export
(C
, Rcheck_CE_Access_Check_Ext
,
557 "__gnat_rcheck_CE_Access_Check_ext");
558 pragma Export
(C
, Rcheck_CE_Index_Check_Ext
,
559 "__gnat_rcheck_CE_Index_Check_ext");
560 pragma Export
(C
, Rcheck_CE_Invalid_Data_Ext
,
561 "__gnat_rcheck_CE_Invalid_Data_ext");
562 pragma Export
(C
, Rcheck_CE_Range_Check_Ext
,
563 "__gnat_rcheck_CE_Range_Check_ext");
565 -- None of these procedures ever returns (they raise an exception). By
566 -- using pragma No_Return, we ensure that any junk code after the call,
567 -- such as normal return epilogue stuff, can be eliminated).
569 pragma No_Return
(Rcheck_CE_Access_Check
);
570 pragma No_Return
(Rcheck_CE_Null_Access_Parameter
);
571 pragma No_Return
(Rcheck_CE_Discriminant_Check
);
572 pragma No_Return
(Rcheck_CE_Divide_By_Zero
);
573 pragma No_Return
(Rcheck_CE_Explicit_Raise
);
574 pragma No_Return
(Rcheck_CE_Index_Check
);
575 pragma No_Return
(Rcheck_CE_Invalid_Data
);
576 pragma No_Return
(Rcheck_CE_Length_Check
);
577 pragma No_Return
(Rcheck_CE_Null_Exception_Id
);
578 pragma No_Return
(Rcheck_CE_Null_Not_Allowed
);
579 pragma No_Return
(Rcheck_CE_Overflow_Check
);
580 pragma No_Return
(Rcheck_CE_Partition_Check
);
581 pragma No_Return
(Rcheck_CE_Range_Check
);
582 pragma No_Return
(Rcheck_CE_Tag_Check
);
583 pragma No_Return
(Rcheck_PE_Access_Before_Elaboration
);
584 pragma No_Return
(Rcheck_PE_Accessibility_Check
);
585 pragma No_Return
(Rcheck_PE_Address_Of_Intrinsic
);
586 pragma No_Return
(Rcheck_PE_Aliased_Parameters
);
587 pragma No_Return
(Rcheck_PE_All_Guards_Closed
);
588 pragma No_Return
(Rcheck_PE_Bad_Predicated_Generic_Type
);
589 pragma No_Return
(Rcheck_PE_Current_Task_In_Entry_Body
);
590 pragma No_Return
(Rcheck_PE_Duplicated_Entry_Address
);
591 pragma No_Return
(Rcheck_PE_Explicit_Raise
);
592 pragma No_Return
(Rcheck_PE_Implicit_Return
);
593 pragma No_Return
(Rcheck_PE_Misaligned_Address_Value
);
594 pragma No_Return
(Rcheck_PE_Missing_Return
);
595 pragma No_Return
(Rcheck_PE_Non_Transportable_Actual
);
596 pragma No_Return
(Rcheck_PE_Overlaid_Controlled_Object
);
597 pragma No_Return
(Rcheck_PE_Potentially_Blocking_Operation
);
598 pragma No_Return
(Rcheck_PE_Stream_Operation_Not_Allowed
);
599 pragma No_Return
(Rcheck_PE_Stubbed_Subprogram_Called
);
600 pragma No_Return
(Rcheck_PE_Unchecked_Union_Restriction
);
601 pragma No_Return
(Rcheck_PE_Finalize_Raised_Exception
);
602 pragma No_Return
(Rcheck_SE_Empty_Storage_Pool
);
603 pragma No_Return
(Rcheck_SE_Explicit_Raise
);
604 pragma No_Return
(Rcheck_SE_Infinite_Recursion
);
605 pragma No_Return
(Rcheck_SE_Object_Too_Large
);
607 pragma No_Return
(Rcheck_CE_Access_Check_Ext
);
608 pragma No_Return
(Rcheck_CE_Index_Check_Ext
);
609 pragma No_Return
(Rcheck_CE_Invalid_Data_Ext
);
610 pragma No_Return
(Rcheck_CE_Range_Check_Ext
);
612 ---------------------------------------------
613 -- Reason Strings for Run-Time Check Calls --
614 ---------------------------------------------
616 -- These strings are null-terminated and are used by Rcheck_nn. The
617 -- strings correspond to the definitions for Types.RT_Exception_Code.
621 Rmsg_00
: constant String := "access check failed" & NUL
;
622 Rmsg_01
: constant String := "access parameter is null" & NUL
;
623 Rmsg_02
: constant String := "discriminant check failed" & NUL
;
624 Rmsg_03
: constant String := "divide by zero" & NUL
;
625 Rmsg_04
: constant String := "explicit raise" & NUL
;
626 Rmsg_05
: constant String := "index check failed" & NUL
;
627 Rmsg_06
: constant String := "invalid data" & NUL
;
628 Rmsg_07
: constant String := "length check failed" & NUL
;
629 Rmsg_08
: constant String := "null Exception_Id" & NUL
;
630 Rmsg_09
: constant String := "null-exclusion check failed" & NUL
;
631 Rmsg_10
: constant String := "overflow check failed" & NUL
;
632 Rmsg_11
: constant String := "partition check failed" & NUL
;
633 Rmsg_12
: constant String := "range check failed" & NUL
;
634 Rmsg_13
: constant String := "tag check failed" & NUL
;
635 Rmsg_14
: constant String := "access before elaboration" & NUL
;
636 Rmsg_15
: constant String := "accessibility check failed" & NUL
;
637 Rmsg_16
: constant String := "attempt to take address of" &
638 " intrinsic subprogram" & NUL
;
639 Rmsg_17
: constant String := "aliased parameters" & NUL
;
640 Rmsg_18
: constant String := "all guards closed" & NUL
;
641 Rmsg_19
: constant String := "improper use of generic subtype" &
642 " with predicate" & NUL
;
643 Rmsg_20
: constant String := "Current_Task referenced in entry" &
645 Rmsg_21
: constant String := "duplicated entry address" & NUL
;
646 Rmsg_22
: constant String := "explicit raise" & NUL
;
647 Rmsg_23
: constant String := "finalize/adjust raised exception" & NUL
;
648 Rmsg_24
: constant String := "implicit return with No_Return" & NUL
;
649 Rmsg_25
: constant String := "misaligned address value" & NUL
;
650 Rmsg_26
: constant String := "missing return" & NUL
;
651 Rmsg_27
: constant String := "overlaid controlled object" & NUL
;
652 Rmsg_28
: constant String := "potentially blocking operation" & NUL
;
653 Rmsg_29
: constant String := "stubbed subprogram called" & NUL
;
654 Rmsg_30
: constant String := "unchecked union restriction" & NUL
;
655 Rmsg_31
: constant String := "actual/returned class-wide" &
656 " value not transportable" & NUL
;
657 Rmsg_32
: constant String := "empty storage pool" & NUL
;
658 Rmsg_33
: constant String := "explicit raise" & NUL
;
659 Rmsg_34
: constant String := "infinite recursion" & NUL
;
660 Rmsg_35
: constant String := "object too large" & NUL
;
661 Rmsg_36
: constant String := "stream operation not allowed" & NUL
;
663 -----------------------
664 -- Polling Interface --
665 -----------------------
667 type Unsigned
is mod 2 ** 32;
669 Counter
: Unsigned
:= 0;
670 pragma Warnings
(Off
, Counter
);
671 -- This counter is provided for convenience. It can be used in Poll to
672 -- perform periodic but not systematic operations.
674 procedure Poll
is separate;
675 -- The actual polling routine is separate, so that it can easily be
676 -- replaced with a target dependent version.
678 --------------------------
679 -- Code_Address_For_AAA --
680 --------------------------
682 -- This function gives us the start of the PC range for addresses within
683 -- the exception unit itself. We hope that gigi/gcc keep all the procedures
684 -- in their original order.
686 function Code_Address_For_AAA
return System
.Address
is
688 -- We are using a label instead of Code_Address_For_AAA'Address because
689 -- on some platforms the latter does not yield the address we want, but
690 -- the address of a stub or of a descriptor instead. This is the case at
694 return Start_Of_AAA
'Address;
695 end Code_Address_For_AAA
;
701 procedure Call_Chain
(Excep
: EOA
) is separate;
702 -- The actual Call_Chain routine is separate, so that it can easily
703 -- be dummied out when no exception traceback information is needed.
705 ------------------------------
706 -- Current_Target_Exception --
707 ------------------------------
709 function Current_Target_Exception
return Exception_Occurrence
is
711 return Null_Occurrence
;
712 end Current_Target_Exception
;
718 function EId_To_String
(X
: Exception_Id
) return String
719 renames Stream_Attributes
.EId_To_String
;
725 -- We use the null string to represent the null occurrence, otherwise we
726 -- output the Untailored_Exception_Information string for the occurrence.
728 function EO_To_String
(X
: Exception_Occurrence
) return String
729 renames Stream_Attributes
.EO_To_String
;
731 ------------------------
732 -- Exception_Identity --
733 ------------------------
735 function Exception_Identity
736 (X
: Exception_Occurrence
) return Exception_Id
739 -- Note that the following test used to be here for the original
740 -- Ada 95 semantics, but these were modified by AI-241 to require
741 -- returning Null_Id instead of raising Constraint_Error.
743 -- if X.Id = Null_Id then
744 -- raise Constraint_Error;
748 end Exception_Identity
;
750 ---------------------------
751 -- Exception_Information --
752 ---------------------------
754 function Exception_Information
(X
: Exception_Occurrence
) return String is
756 if X
.Id
= Null_Id
then
757 raise Constraint_Error
;
759 return Exception_Data
.Exception_Information
(X
);
761 end Exception_Information
;
763 -----------------------
764 -- Exception_Message --
765 -----------------------
767 function Exception_Message
(X
: Exception_Occurrence
) return String is
769 if X
.Id
= Null_Id
then
770 raise Constraint_Error
;
772 return X
.Msg
(1 .. X
.Msg_Length
);
774 end Exception_Message
;
780 function Exception_Name
(Id
: Exception_Id
) return String is
783 raise Constraint_Error
;
785 return To_Ptr
(Id
.Full_Name
) (1 .. Id
.Name_Length
- 1);
789 function Exception_Name
(X
: Exception_Occurrence
) return String is
791 return Exception_Name
(X
.Id
);
794 ---------------------------
795 -- Exception_Name_Simple --
796 ---------------------------
798 function Exception_Name_Simple
(X
: Exception_Occurrence
) return String is
799 Name
: constant String := Exception_Name
(X
);
805 exit when Name
(P
- 1) = '.';
809 -- Return result making sure lower bound is 1
812 subtype Rname
is String (1 .. Name
'Length - P
+ 1);
814 return Rname
(Name
(P
.. Name
'Length));
816 end Exception_Name_Simple
;
822 package body Exception_Data
is separate;
823 -- This package can be easily dummied out if we do not want the basic
824 -- support for exception messages (such as in Ada 83).
826 ---------------------------
827 -- Exception_Propagation --
828 ---------------------------
830 package body Exception_Propagation
is separate;
831 -- Depending on the actual exception mechanism used (front-end or
832 -- back-end based), the implementation will differ, which is why this
833 -- package is separated.
835 ----------------------
836 -- Exception_Traces --
837 ----------------------
839 package body Exception_Traces
is separate;
840 -- Depending on the underlying support for IO the implementation will
841 -- differ. Moreover we would like to dummy out this package in case we
842 -- do not want any exception tracing support. This is why this package
845 --------------------------------------
846 -- Get_Exception_Machine_Occurrence --
847 --------------------------------------
849 function Get_Exception_Machine_Occurrence
850 (X
: Exception_Occurrence
) return System
.Address
853 return X
.Machine_Occurrence
;
854 end Get_Exception_Machine_Occurrence
;
860 function Image
(Index
: Integer) return String is
861 Result
: constant String := Integer'Image (Index
);
863 if Result
(1) = ' ' then
864 return Result
(2 .. Result
'Last);
870 -----------------------
871 -- Stream Attributes --
872 -----------------------
874 package body Stream_Attributes
is separate;
875 -- This package can be easily dummied out if we do not want the
876 -- support for streaming Exception_Ids and Exception_Occurrences.
878 ----------------------------
879 -- Raise_Constraint_Error --
880 ----------------------------
882 procedure Raise_Constraint_Error
(File
: System
.Address
; Line
: Integer) is
884 Raise_With_Location_And_Msg
(Constraint_Error_Def
'Access, File
, Line
);
885 end Raise_Constraint_Error
;
887 --------------------------------
888 -- Raise_Constraint_Error_Msg --
889 --------------------------------
891 procedure Raise_Constraint_Error_Msg
892 (File
: System
.Address
;
895 Msg
: System
.Address
)
898 Raise_With_Location_And_Msg
899 (Constraint_Error_Def
'Access, File
, Line
, Column
, Msg
);
900 end Raise_Constraint_Error_Msg
;
902 -------------------------
903 -- Complete_Occurrence --
904 -------------------------
906 procedure Complete_Occurrence
(X
: EOA
) is
908 -- Compute the backtrace for this occurrence if the corresponding
909 -- binder option has been set. Call_Chain takes care of the reraise
912 -- ??? Using Call_Chain here means we are going to walk up the stack
913 -- once only for backtracing purposes before doing it again for the
914 -- propagation per se.
916 -- The first inspection is much lighter, though, as it only requires
917 -- partial unwinding of each frame. Additionally, although we could use
918 -- the personality routine to record the addresses while propagating,
919 -- this method has two drawbacks:
921 -- 1) the trace is incomplete if the exception is handled since we
922 -- don't walk past the frame with the handler,
926 -- 2) we would miss the frames for which our personality routine is not
927 -- called, e.g. if C or C++ calls are on the way.
931 -- Notify the debugger
932 Debug_Raise_Exception
(E
=> SSL
.Exception_Data_Ptr
(X
.Id
));
933 end Complete_Occurrence
;
935 ---------------------------------------
936 -- Complete_And_Propagate_Occurrence --
937 ---------------------------------------
939 procedure Complete_And_Propagate_Occurrence
(X
: EOA
) is
941 Complete_Occurrence
(X
);
942 Exception_Propagation
.Propagate_Exception
(X
);
943 end Complete_And_Propagate_Occurrence
;
945 ---------------------
946 -- Raise_Exception --
947 ---------------------
949 procedure Raise_Exception
951 Message
: String := "")
953 EF
: Exception_Id
:= E
;
955 -- Raise CE if E = Null_ID (AI-446)
958 EF
:= Constraint_Error
'Identity;
961 -- Go ahead and raise appropriate exception
963 Raise_Exception_Always
(EF
, Message
);
966 ----------------------------
967 -- Raise_Exception_Always --
968 ----------------------------
970 procedure Raise_Exception_Always
972 Message
: String := "")
974 X
: constant EOA
:= Exception_Propagation
.Allocate_Occurrence
;
977 Exception_Data
.Set_Exception_Msg
(X
, E
, Message
);
979 if not ZCX_By_Default
then
983 Complete_And_Propagate_Occurrence
(X
);
984 end Raise_Exception_Always
;
986 ------------------------------
987 -- Raise_Exception_No_Defer --
988 ------------------------------
990 procedure Raise_Exception_No_Defer
992 Message
: String := "")
994 X
: constant EOA
:= Exception_Propagation
.Allocate_Occurrence
;
997 Exception_Data
.Set_Exception_Msg
(X
, E
, Message
);
999 -- Do not call Abort_Defer.all, as specified by the spec
1001 Complete_And_Propagate_Occurrence
(X
);
1002 end Raise_Exception_No_Defer
;
1004 -------------------------------------
1005 -- Raise_From_Controlled_Operation --
1006 -------------------------------------
1008 procedure Raise_From_Controlled_Operation
1009 (X
: Ada
.Exceptions
.Exception_Occurrence
)
1011 Prefix
: constant String := "adjust/finalize raised ";
1012 Orig_Msg
: constant String := Exception_Message
(X
);
1013 Orig_Prefix_Length
: constant Natural :=
1014 Integer'Min (Prefix
'Length, Orig_Msg
'Length);
1016 Orig_Prefix
: String renames
1017 Orig_Msg
(Orig_Msg
'First .. Orig_Msg
'First + Orig_Prefix_Length
- 1);
1020 -- Message already has the proper prefix, just re-raise
1022 if Orig_Prefix
= Prefix
then
1023 Raise_Exception_No_Defer
1024 (E
=> Program_Error
'Identity,
1025 Message
=> Orig_Msg
);
1029 New_Msg
: constant String := Prefix
& Exception_Name
(X
);
1032 -- No message present, just provide our own
1034 if Orig_Msg
= "" then
1035 Raise_Exception_No_Defer
1036 (E
=> Program_Error
'Identity,
1037 Message
=> New_Msg
);
1039 -- Message present, add informational prefix
1042 Raise_Exception_No_Defer
1043 (E
=> Program_Error
'Identity,
1044 Message
=> New_Msg
& ": " & Orig_Msg
);
1048 end Raise_From_Controlled_Operation
;
1050 -------------------------------------------
1051 -- Create_Occurrence_From_Signal_Handler --
1052 -------------------------------------------
1054 function Create_Occurrence_From_Signal_Handler
1056 M
: System
.Address
) return EOA
1058 X
: constant EOA
:= Exception_Propagation
.Allocate_Occurrence
;
1061 Exception_Data
.Set_Exception_C_Msg
(X
, E
, M
);
1063 if not ZCX_By_Default
then
1067 Complete_Occurrence
(X
);
1069 end Create_Occurrence_From_Signal_Handler
;
1071 ---------------------------------------------------
1072 -- Create_Machine_Occurrence_From_Signal_Handler --
1073 ---------------------------------------------------
1075 function Create_Machine_Occurrence_From_Signal_Handler
1077 M
: System
.Address
) return System
.Address
1080 return Create_Occurrence_From_Signal_Handler
(E
, M
).Machine_Occurrence
;
1081 end Create_Machine_Occurrence_From_Signal_Handler
;
1083 -------------------------------
1084 -- Raise_From_Signal_Handler --
1085 -------------------------------
1087 procedure Raise_From_Signal_Handler
1092 Exception_Propagation
.Propagate_Exception
1093 (Create_Occurrence_From_Signal_Handler
(E
, M
));
1094 end Raise_From_Signal_Handler
;
1096 -------------------------
1097 -- Raise_Program_Error --
1098 -------------------------
1100 procedure Raise_Program_Error
1101 (File
: System
.Address
;
1105 Raise_With_Location_And_Msg
(Program_Error_Def
'Access, File
, Line
);
1106 end Raise_Program_Error
;
1108 -----------------------------
1109 -- Raise_Program_Error_Msg --
1110 -----------------------------
1112 procedure Raise_Program_Error_Msg
1113 (File
: System
.Address
;
1115 Msg
: System
.Address
)
1118 Raise_With_Location_And_Msg
1119 (Program_Error_Def
'Access, File
, Line
, M
=> Msg
);
1120 end Raise_Program_Error_Msg
;
1122 -------------------------
1123 -- Raise_Storage_Error --
1124 -------------------------
1126 procedure Raise_Storage_Error
1127 (File
: System
.Address
;
1131 Raise_With_Location_And_Msg
(Storage_Error_Def
'Access, File
, Line
);
1132 end Raise_Storage_Error
;
1134 -----------------------------
1135 -- Raise_Storage_Error_Msg --
1136 -----------------------------
1138 procedure Raise_Storage_Error_Msg
1139 (File
: System
.Address
;
1141 Msg
: System
.Address
)
1144 Raise_With_Location_And_Msg
1145 (Storage_Error_Def
'Access, File
, Line
, M
=> Msg
);
1146 end Raise_Storage_Error_Msg
;
1148 ---------------------------------
1149 -- Raise_With_Location_And_Msg --
1150 ---------------------------------
1152 procedure Raise_With_Location_And_Msg
1157 M
: System
.Address
:= System
.Null_Address
)
1159 X
: constant EOA
:= Exception_Propagation
.Allocate_Occurrence
;
1161 Exception_Data
.Set_Exception_C_Msg
(X
, E
, F
, L
, C
, M
);
1163 if not ZCX_By_Default
then
1167 Complete_And_Propagate_Occurrence
(X
);
1168 end Raise_With_Location_And_Msg
;
1170 --------------------
1171 -- Raise_With_Msg --
1172 --------------------
1174 procedure Raise_With_Msg
(E
: Exception_Id
) is
1175 Excep
: constant EOA
:= Exception_Propagation
.Allocate_Occurrence
;
1176 Ex
: constant Exception_Occurrence_Access
:= Get_Current_Excep
.all;
1178 Excep
.Exception_Raised
:= False;
1180 Excep
.Num_Tracebacks
:= 0;
1181 Excep
.Pid
:= Local_Partition_ID
;
1183 -- Copy the message from the current exception
1184 -- Change the interface to be called with an occurrence ???
1186 Excep
.Msg_Length
:= Ex
.Msg_Length
;
1187 Excep
.Msg
(1 .. Excep
.Msg_Length
) := Ex
.Msg
(1 .. Ex
.Msg_Length
);
1189 -- The following is a common pattern, should be abstracted
1190 -- into a procedure call ???
1192 if not ZCX_By_Default
then
1196 Complete_And_Propagate_Occurrence
(Excep
);
1199 -----------------------------------------
1200 -- Calls to Run-Time Check Subprograms --
1201 -----------------------------------------
1203 procedure Rcheck_CE_Access_Check
1204 (File
: System
.Address
; Line
: Integer)
1207 Raise_Constraint_Error_Msg
(File
, Line
, 0, Rmsg_00
'Address);
1208 end Rcheck_CE_Access_Check
;
1210 procedure Rcheck_CE_Null_Access_Parameter
1211 (File
: System
.Address
; Line
: Integer)
1214 Raise_Constraint_Error_Msg
(File
, Line
, 0, Rmsg_01
'Address);
1215 end Rcheck_CE_Null_Access_Parameter
;
1217 procedure Rcheck_CE_Discriminant_Check
1218 (File
: System
.Address
; Line
: Integer)
1221 Raise_Constraint_Error_Msg
(File
, Line
, 0, Rmsg_02
'Address);
1222 end Rcheck_CE_Discriminant_Check
;
1224 procedure Rcheck_CE_Divide_By_Zero
1225 (File
: System
.Address
; Line
: Integer)
1228 Raise_Constraint_Error_Msg
(File
, Line
, 0, Rmsg_03
'Address);
1229 end Rcheck_CE_Divide_By_Zero
;
1231 procedure Rcheck_CE_Explicit_Raise
1232 (File
: System
.Address
; Line
: Integer)
1235 Raise_Constraint_Error_Msg
(File
, Line
, 0, Rmsg_04
'Address);
1236 end Rcheck_CE_Explicit_Raise
;
1238 procedure Rcheck_CE_Index_Check
1239 (File
: System
.Address
; Line
: Integer)
1242 Raise_Constraint_Error_Msg
(File
, Line
, 0, Rmsg_05
'Address);
1243 end Rcheck_CE_Index_Check
;
1245 procedure Rcheck_CE_Invalid_Data
1246 (File
: System
.Address
; Line
: Integer)
1249 Raise_Constraint_Error_Msg
(File
, Line
, 0, Rmsg_06
'Address);
1250 end Rcheck_CE_Invalid_Data
;
1252 procedure Rcheck_CE_Length_Check
1253 (File
: System
.Address
; Line
: Integer)
1256 Raise_Constraint_Error_Msg
(File
, Line
, 0, Rmsg_07
'Address);
1257 end Rcheck_CE_Length_Check
;
1259 procedure Rcheck_CE_Null_Exception_Id
1260 (File
: System
.Address
; Line
: Integer)
1263 Raise_Constraint_Error_Msg
(File
, Line
, 0, Rmsg_08
'Address);
1264 end Rcheck_CE_Null_Exception_Id
;
1266 procedure Rcheck_CE_Null_Not_Allowed
1267 (File
: System
.Address
; Line
: Integer)
1270 Raise_Constraint_Error_Msg
(File
, Line
, 0, Rmsg_09
'Address);
1271 end Rcheck_CE_Null_Not_Allowed
;
1273 procedure Rcheck_CE_Overflow_Check
1274 (File
: System
.Address
; Line
: Integer)
1277 Raise_Constraint_Error_Msg
(File
, Line
, 0, Rmsg_10
'Address);
1278 end Rcheck_CE_Overflow_Check
;
1280 procedure Rcheck_CE_Partition_Check
1281 (File
: System
.Address
; Line
: Integer)
1284 Raise_Constraint_Error_Msg
(File
, Line
, 0, Rmsg_11
'Address);
1285 end Rcheck_CE_Partition_Check
;
1287 procedure Rcheck_CE_Range_Check
1288 (File
: System
.Address
; Line
: Integer)
1291 Raise_Constraint_Error_Msg
(File
, Line
, 0, Rmsg_12
'Address);
1292 end Rcheck_CE_Range_Check
;
1294 procedure Rcheck_CE_Tag_Check
1295 (File
: System
.Address
; Line
: Integer)
1298 Raise_Constraint_Error_Msg
(File
, Line
, 0, Rmsg_13
'Address);
1299 end Rcheck_CE_Tag_Check
;
1301 procedure Rcheck_PE_Access_Before_Elaboration
1302 (File
: System
.Address
; Line
: Integer)
1305 Raise_Program_Error_Msg
(File
, Line
, Rmsg_14
'Address);
1306 end Rcheck_PE_Access_Before_Elaboration
;
1308 procedure Rcheck_PE_Accessibility_Check
1309 (File
: System
.Address
; Line
: Integer)
1312 Raise_Program_Error_Msg
(File
, Line
, Rmsg_15
'Address);
1313 end Rcheck_PE_Accessibility_Check
;
1315 procedure Rcheck_PE_Address_Of_Intrinsic
1316 (File
: System
.Address
; Line
: Integer)
1319 Raise_Program_Error_Msg
(File
, Line
, Rmsg_16
'Address);
1320 end Rcheck_PE_Address_Of_Intrinsic
;
1322 procedure Rcheck_PE_Aliased_Parameters
1323 (File
: System
.Address
; Line
: Integer)
1326 Raise_Program_Error_Msg
(File
, Line
, Rmsg_17
'Address);
1327 end Rcheck_PE_Aliased_Parameters
;
1329 procedure Rcheck_PE_All_Guards_Closed
1330 (File
: System
.Address
; Line
: Integer)
1333 Raise_Program_Error_Msg
(File
, Line
, Rmsg_18
'Address);
1334 end Rcheck_PE_All_Guards_Closed
;
1336 procedure Rcheck_PE_Bad_Predicated_Generic_Type
1337 (File
: System
.Address
; Line
: Integer)
1340 Raise_Program_Error_Msg
(File
, Line
, Rmsg_19
'Address);
1341 end Rcheck_PE_Bad_Predicated_Generic_Type
;
1343 procedure Rcheck_PE_Current_Task_In_Entry_Body
1344 (File
: System
.Address
; Line
: Integer)
1347 Raise_Program_Error_Msg
(File
, Line
, Rmsg_20
'Address);
1348 end Rcheck_PE_Current_Task_In_Entry_Body
;
1350 procedure Rcheck_PE_Duplicated_Entry_Address
1351 (File
: System
.Address
; Line
: Integer)
1354 Raise_Program_Error_Msg
(File
, Line
, Rmsg_21
'Address);
1355 end Rcheck_PE_Duplicated_Entry_Address
;
1357 procedure Rcheck_PE_Explicit_Raise
1358 (File
: System
.Address
; Line
: Integer)
1361 Raise_Program_Error_Msg
(File
, Line
, Rmsg_22
'Address);
1362 end Rcheck_PE_Explicit_Raise
;
1364 procedure Rcheck_PE_Implicit_Return
1365 (File
: System
.Address
; Line
: Integer)
1368 Raise_Program_Error_Msg
(File
, Line
, Rmsg_24
'Address);
1369 end Rcheck_PE_Implicit_Return
;
1371 procedure Rcheck_PE_Misaligned_Address_Value
1372 (File
: System
.Address
; Line
: Integer)
1375 Raise_Program_Error_Msg
(File
, Line
, Rmsg_25
'Address);
1376 end Rcheck_PE_Misaligned_Address_Value
;
1378 procedure Rcheck_PE_Missing_Return
1379 (File
: System
.Address
; Line
: Integer)
1382 Raise_Program_Error_Msg
(File
, Line
, Rmsg_26
'Address);
1383 end Rcheck_PE_Missing_Return
;
1385 procedure Rcheck_PE_Non_Transportable_Actual
1386 (File
: System
.Address
; Line
: Integer)
1389 Raise_Program_Error_Msg
(File
, Line
, Rmsg_31
'Address);
1390 end Rcheck_PE_Non_Transportable_Actual
;
1392 procedure Rcheck_PE_Overlaid_Controlled_Object
1393 (File
: System
.Address
; Line
: Integer)
1396 Raise_Program_Error_Msg
(File
, Line
, Rmsg_27
'Address);
1397 end Rcheck_PE_Overlaid_Controlled_Object
;
1399 procedure Rcheck_PE_Potentially_Blocking_Operation
1400 (File
: System
.Address
; Line
: Integer)
1403 Raise_Program_Error_Msg
(File
, Line
, Rmsg_28
'Address);
1404 end Rcheck_PE_Potentially_Blocking_Operation
;
1406 procedure Rcheck_PE_Stream_Operation_Not_Allowed
1407 (File
: System
.Address
; Line
: Integer)
1410 Raise_Program_Error_Msg
(File
, Line
, Rmsg_36
'Address);
1411 end Rcheck_PE_Stream_Operation_Not_Allowed
;
1413 procedure Rcheck_PE_Stubbed_Subprogram_Called
1414 (File
: System
.Address
; Line
: Integer)
1417 Raise_Program_Error_Msg
(File
, Line
, Rmsg_29
'Address);
1418 end Rcheck_PE_Stubbed_Subprogram_Called
;
1420 procedure Rcheck_PE_Unchecked_Union_Restriction
1421 (File
: System
.Address
; Line
: Integer)
1424 Raise_Program_Error_Msg
(File
, Line
, Rmsg_30
'Address);
1425 end Rcheck_PE_Unchecked_Union_Restriction
;
1427 procedure Rcheck_SE_Empty_Storage_Pool
1428 (File
: System
.Address
; Line
: Integer)
1431 Raise_Storage_Error_Msg
(File
, Line
, Rmsg_32
'Address);
1432 end Rcheck_SE_Empty_Storage_Pool
;
1434 procedure Rcheck_SE_Explicit_Raise
1435 (File
: System
.Address
; Line
: Integer)
1438 Raise_Storage_Error_Msg
(File
, Line
, Rmsg_33
'Address);
1439 end Rcheck_SE_Explicit_Raise
;
1441 procedure Rcheck_SE_Infinite_Recursion
1442 (File
: System
.Address
; Line
: Integer)
1445 Raise_Storage_Error_Msg
(File
, Line
, Rmsg_34
'Address);
1446 end Rcheck_SE_Infinite_Recursion
;
1448 procedure Rcheck_SE_Object_Too_Large
1449 (File
: System
.Address
; Line
: Integer)
1452 Raise_Storage_Error_Msg
(File
, Line
, Rmsg_35
'Address);
1453 end Rcheck_SE_Object_Too_Large
;
1455 procedure Rcheck_CE_Access_Check_Ext
1456 (File
: System
.Address
; Line
, Column
: Integer)
1459 Raise_Constraint_Error_Msg
(File
, Line
, Column
, Rmsg_00
'Address);
1460 end Rcheck_CE_Access_Check_Ext
;
1462 procedure Rcheck_CE_Index_Check_Ext
1463 (File
: System
.Address
; Line
, Column
, Index
, First
, Last
: Integer)
1465 Msg
: constant String :=
1466 Rmsg_05
(Rmsg_05
'First .. Rmsg_05
'Last - 1) & ASCII
.LF
1467 & "index " & Image
(Index
) & " not in " & Image
(First
)
1468 & ".." & Image
(Last
) & ASCII
.NUL
;
1470 Raise_Constraint_Error_Msg
(File
, Line
, Column
, Msg
'Address);
1471 end Rcheck_CE_Index_Check_Ext
;
1473 procedure Rcheck_CE_Invalid_Data_Ext
1474 (File
: System
.Address
; Line
, Column
, Index
, First
, Last
: Integer)
1476 Msg
: constant String :=
1477 Rmsg_06
(Rmsg_06
'First .. Rmsg_06
'Last - 1) & ASCII
.LF
1478 & "value " & Image
(Index
) & " not in " & Image
(First
)
1479 & ".." & Image
(Last
) & ASCII
.NUL
;
1481 Raise_Constraint_Error_Msg
(File
, Line
, Column
, Msg
'Address);
1482 end Rcheck_CE_Invalid_Data_Ext
;
1484 procedure Rcheck_CE_Range_Check_Ext
1485 (File
: System
.Address
; Line
, Column
, Index
, First
, Last
: Integer)
1487 Msg
: constant String :=
1488 Rmsg_12
(Rmsg_12
'First .. Rmsg_12
'Last - 1) & ASCII
.LF
1489 & "value " & Image
(Index
) & " not in " & Image
(First
)
1490 & ".." & Image
(Last
) & ASCII
.NUL
;
1492 Raise_Constraint_Error_Msg
(File
, Line
, Column
, Msg
'Address);
1493 end Rcheck_CE_Range_Check_Ext
;
1495 procedure Rcheck_PE_Finalize_Raised_Exception
1496 (File
: System
.Address
; Line
: Integer)
1498 X
: constant EOA
:= Exception_Propagation
.Allocate_Occurrence
;
1501 -- This is "finalize/adjust raised exception". This subprogram is always
1502 -- called with abort deferred, unlike all other Rcheck_* subprograms, it
1503 -- needs to call Raise_Exception_No_Defer.
1505 -- This is consistent with Raise_From_Controlled_Operation
1507 Exception_Data
.Set_Exception_C_Msg
1508 (X
, Program_Error_Def
'Access, File
, Line
, 0, Rmsg_23
'Address);
1509 Complete_And_Propagate_Occurrence
(X
);
1510 end Rcheck_PE_Finalize_Raised_Exception
;
1516 procedure Reraise
is
1517 Excep
: constant EOA
:= Exception_Propagation
.Allocate_Occurrence
;
1518 Saved_MO
: constant System
.Address
:= Excep
.Machine_Occurrence
;
1521 if not ZCX_By_Default
then
1525 Save_Occurrence
(Excep
.all, Get_Current_Excep
.all.all);
1526 Excep
.Machine_Occurrence
:= Saved_MO
;
1527 Complete_And_Propagate_Occurrence
(Excep
);
1530 --------------------------------------
1531 -- Reraise_Library_Exception_If_Any --
1532 --------------------------------------
1534 procedure Reraise_Library_Exception_If_Any
is
1535 LE
: Exception_Occurrence
;
1538 if Library_Exception_Set
then
1539 LE
:= Library_Exception
;
1541 if LE
.Id
= Null_Id
then
1542 Raise_Exception_No_Defer
1543 (E
=> Program_Error
'Identity,
1544 Message
=> "finalize/adjust raised exception");
1546 Raise_From_Controlled_Operation
(LE
);
1549 end Reraise_Library_Exception_If_Any
;
1551 ------------------------
1552 -- Reraise_Occurrence --
1553 ------------------------
1555 procedure Reraise_Occurrence
(X
: Exception_Occurrence
) is
1560 Reraise_Occurrence_Always
(X
);
1562 end Reraise_Occurrence
;
1564 -------------------------------
1565 -- Reraise_Occurrence_Always --
1566 -------------------------------
1568 procedure Reraise_Occurrence_Always
(X
: Exception_Occurrence
) is
1570 if not ZCX_By_Default
then
1574 Reraise_Occurrence_No_Defer
(X
);
1575 end Reraise_Occurrence_Always
;
1577 ---------------------------------
1578 -- Reraise_Occurrence_No_Defer --
1579 ---------------------------------
1581 procedure Reraise_Occurrence_No_Defer
(X
: Exception_Occurrence
) is
1582 Excep
: constant EOA
:= Exception_Propagation
.Allocate_Occurrence
;
1583 Saved_MO
: constant System
.Address
:= Excep
.Machine_Occurrence
;
1585 Save_Occurrence
(Excep
.all, X
);
1586 Excep
.Machine_Occurrence
:= Saved_MO
;
1587 Complete_And_Propagate_Occurrence
(Excep
);
1588 end Reraise_Occurrence_No_Defer
;
1590 ---------------------
1591 -- Save_Occurrence --
1592 ---------------------
1594 procedure Save_Occurrence
1595 (Target
: out Exception_Occurrence
;
1596 Source
: Exception_Occurrence
)
1599 -- As the machine occurrence might be a data that must be finalized
1600 -- (outside any Ada mechanism), do not copy it
1602 Target
.Id
:= Source
.Id
;
1603 Target
.Machine_Occurrence
:= System
.Null_Address
;
1604 Target
.Msg_Length
:= Source
.Msg_Length
;
1605 Target
.Num_Tracebacks
:= Source
.Num_Tracebacks
;
1606 Target
.Pid
:= Source
.Pid
;
1608 Target
.Msg
(1 .. Target
.Msg_Length
) :=
1609 Source
.Msg
(1 .. Target
.Msg_Length
);
1611 Target
.Tracebacks
(1 .. Target
.Num_Tracebacks
) :=
1612 Source
.Tracebacks
(1 .. Target
.Num_Tracebacks
);
1613 end Save_Occurrence
;
1615 function Save_Occurrence
(Source
: Exception_Occurrence
) return EOA
is
1616 Target
: constant EOA
:= new Exception_Occurrence
;
1618 Save_Occurrence
(Target
.all, Source
);
1620 end Save_Occurrence
;
1626 function String_To_EId
(S
: String) return Exception_Id
1627 renames Stream_Attributes
.String_To_EId
;
1633 function String_To_EO
(S
: String) return Exception_Occurrence
1634 renames Stream_Attributes
.String_To_EO
;
1640 procedure To_Stderr
(C
: Character) is
1641 type int
is new Integer;
1642 procedure put_char_stderr
(C
: int
);
1643 pragma Import
(C
, put_char_stderr
, "put_char_stderr");
1645 put_char_stderr
(Character'Pos (C
));
1648 procedure To_Stderr
(S
: String) is
1650 for J
in S
'Range loop
1651 if S
(J
) /= ASCII
.CR
then
1657 -------------------------
1658 -- Transfer_Occurrence --
1659 -------------------------
1661 procedure Transfer_Occurrence
1662 (Target
: Exception_Occurrence_Access
;
1663 Source
: Exception_Occurrence
)
1666 Save_Occurrence
(Target
.all, Source
);
1667 end Transfer_Occurrence
;
1669 ------------------------
1670 -- Triggered_By_Abort --
1671 ------------------------
1673 function Triggered_By_Abort
return Boolean is
1674 Ex
: constant Exception_Occurrence_Access
:= Get_Current_Excep
.all;
1677 and then Exception_Identity
(Ex
.all) = Standard
'Abort_Signal'Identity;
1678 end Triggered_By_Abort;
1680 -------------------------
1681 -- Wide_Exception_Name --
1682 -------------------------
1684 WC_Encoding : Character;
1685 pragma Import (C, WC_Encoding, "__gl_wc_encoding");
1686 -- Encoding method for source, as exported by binder
1688 function Wide_Exception_Name
1689 (Id : Exception_Id) return Wide_String
1691 S : constant String := Exception_Name (Id);
1692 W : Wide_String (1 .. S'Length);
1695 String_To_Wide_String
1696 (S, W, L, Get_WC_Encoding_Method (WC_Encoding));
1698 end Wide_Exception_Name;
1700 function Wide_Exception_Name
1701 (X : Exception_Occurrence) return Wide_String
1703 S : constant String := Exception_Name (X);
1704 W : Wide_String (1 .. S'Length);
1707 String_To_Wide_String
1708 (S, W, L, Get_WC_Encoding_Method (WC_Encoding));
1710 end Wide_Exception_Name;
1712 ----------------------------
1713 -- Wide_Wide_Exception_Name --
1714 -----------------------------
1716 function Wide_Wide_Exception_Name
1717 (Id : Exception_Id) return Wide_Wide_String
1719 S : constant String := Exception_Name (Id);
1720 W : Wide_Wide_String (1 .. S'Length);
1723 String_To_Wide_Wide_String
1724 (S, W, L, Get_WC_Encoding_Method (WC_Encoding));
1726 end Wide_Wide_Exception_Name;
1728 function Wide_Wide_Exception_Name
1729 (X : Exception_Occurrence) return Wide_Wide_String
1731 S : constant String := Exception_Name (X);
1732 W : Wide_Wide_String (1 .. S'Length);
1735 String_To_Wide_Wide_String
1736 (S, W, L, Get_WC_Encoding_Method (WC_Encoding));
1738 end Wide_Wide_Exception_Name;
1740 --------------------------
1741 -- Code_Address_For_ZZZ --
1742 --------------------------
1744 -- This function gives us the end of the PC range for addresses
1745 -- within the exception unit itself. We hope that gigi/gcc keeps all the
1746 -- procedures in their original order.
1748 function Code_Address_For_ZZZ return System.Address is
1751 return Start_Of_ZZZ'Address;
1752 end Code_Address_For_ZZZ;