diff options
author | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-10-02 14:30:19 +0000 |
---|---|---|
committer | kenner <kenner@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-10-02 14:30:19 +0000 |
commit | c32d045231e086867f117700fbe01dbbbce3ea14 (patch) | |
tree | 86d33ed164722c539e5c03eb27ae96b8b7667e75 /gcc/ada/s-except.ads | |
parent | 49d882a7d8c985758c04737e801f6028d5b7240f (diff) | |
download | gcc-c32d045231e086867f117700fbe01dbbbce3ea14.tar.gz |
New Language: Ada
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45957 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/s-except.ads')
-rw-r--r-- | gcc/ada/s-except.ads | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/gcc/ada/s-except.ads b/gcc/ada/s-except.ads new file mode 100644 index 00000000000..e277e8c3d1a --- /dev/null +++ b/gcc/ada/s-except.ads @@ -0,0 +1,205 @@ +------------------------------------------------------------------------------ +-- -- +-- GNAT RUN-TIME COMPONENTS -- +-- -- +-- S Y S T E M . E X C E P T I O N S -- +-- -- +-- S p e c -- +-- -- +-- $Revision: 1.10 $ +-- -- +-- Copyright (C) 1992-2000 Free Software Foundation, Inc. -- +-- -- +-- GNAT is free software; you can redistribute it and/or modify it under -- +-- terms of the GNU General Public License as published by the Free Soft- -- +-- ware Foundation; either version 2, or (at your option) any later ver- -- +-- sion. GNAT is distributed in the hope that it will be useful, but WITH- -- +-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -- +-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -- +-- for more details. You should have received a copy of the GNU General -- +-- Public License distributed with GNAT; see file COPYING. If not, write -- +-- to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, -- +-- MA 02111-1307, USA. -- +-- -- +-- As a special exception, if other files instantiate generics from this -- +-- unit, or you link this unit with other files to produce an executable, -- +-- this unit does not by itself cause the resulting executable to be -- +-- covered by the GNU General Public License. This exception does not -- +-- however invalidate any other reasons why the executable file might be -- +-- covered by the GNU Public License. -- +-- -- +-- GNAT was originally developed by the GNAT team at New York University. -- +-- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). -- +-- -- +------------------------------------------------------------------------------ + +-- This package contains definitions used for zero cost exception handling. +-- See unit Ada.Exceptions for further details. Note that the reason that +-- we separate out these definitions is to avoid problems with recursion +-- in rtsfind. They must be in a unit which does not require any exception +-- table generation of any kind. + +with Ada.Exceptions; + +with System; +with System.Standard_Library; + +with Unchecked_Conversion; + +package System.Exceptions is + + package SSL renames System.Standard_Library; + package AEX renames Ada.Exceptions; + + -- The following section defines data structures used for zero cost + -- exception handling if System.Parameters.Zero_Cost_Exceptions is + -- set true (i.e. zero cost exceptions are implemented on this target). + + -- The approach is to build tables that describe the PC ranges that + -- are covered by various exception frames. When an exception occurs, + -- these tables are searched to determine the address of the applicable + -- handler for the current exception. + + subtype Handler_Loc is System.Address; + -- Code location representing entry address of a handler. Values of + -- this type are created using the N_Handler_Loc node, and then + -- passed to the Enter_Handler procedure to enter a handler. + + subtype Code_Loc is System.Address; + -- Code location used in building exception tables and for call + -- addresses when propagating an exception (also traceback table) + -- Values of this type are created by using Label'Address or + -- extracted from machine states using Get_Code_Loc. + + -------------------- + -- Handler_Record -- + -------------------- + + -- A Handler record is built for each choice for each exception handler + -- in a frame. + + function To_Exception_Id is + new Unchecked_Conversion (SSL.Exception_Data_Ptr, AEX.Exception_Id); + + Others_Dummy_Exception : aliased SSL.Exception_Data; + Others_Id : constant AEX.Exception_Id := + To_Exception_Id (Others_Dummy_Exception'Access); + -- Dummy exception used to signal others exception + + All_Others_Dummy_Exception : aliased SSL.Exception_Data; + All_Others_Id : constant AEX.Exception_Id := + To_Exception_Id (All_Others_Dummy_Exception'Access); + -- Dummy exception used to signal all others exception (including + -- exceptions not normally handled by others, e.g. Abort_Signal) + + type Handler_Record is record + Lo : Code_Loc; + Hi : Code_Loc; + -- Range of PC values of code covered by this handler record. The + -- handler covers all code addresses that are greater than the Lo + -- value, and less than or equal to the Hi value. + + Id : AEX.Exception_Id; + -- Id of exception being handled, or one of the above special values + + Handler : Handler_Loc; + -- Address of label at start of handler + end record; + + type Handler_Record_Ptr is access all Handler_Record; + type Handler_Record_List is array (Natural range <>) of Handler_Record_Ptr; + + --------------------------- + -- Subprogram_Descriptor -- + --------------------------- + + -- A Subprogram_Descriptor is built for each subprogram through which + -- exceptions may propagate, this includes all Ada subprograms, + -- and also all foreign language imported subprograms. + + subtype Subprogram_Info_Type is System.Address; + -- This type is used to represent a value that is used to unwind stack + -- frames. It references target dependent data that provides sufficient + -- information (e.g. about the location of the return point, use of a + -- frame pointer, save-over-call registers etc) to unwind the machine + -- state to the caller. For some targets, this is simply a pointer to + -- the entry point of the procedure (and the routine to pop the machine + -- state disassembles the code at the entry point to obtain the required + -- information). On other targets, it is a pointer to data created by the + -- backend or assembler to represent the required information. + + No_Info : constant Subprogram_Info_Type := System.Null_Address; + -- This is a special value used to indicate that it is not possible + -- to pop past this frame. This is used at the outer level (e.g. for + -- package elaboration procedures or the main procedure), and for any + -- other foreign language procedure for which propagation is known + -- to be impossible. An exception is considered unhandled if an + -- attempt is made to pop a frame whose Subprogram_Info_Type value + -- is set to No_Info. + + type Subprogram_Descriptor (Num_Handlers : Natural) is record + Code : Code_Loc; + -- This is a code location used to determine which procedure we are + -- in. Most usually it is simply the entry address for the procedure. + -- hA given address is considered to be within the procedure referenced + -- by a Subprogram_Descriptor record if this is the descriptor for + -- which the Code value is as large as possible without exceeding + -- the given value. + + Subprogram_Info : Subprogram_Info_Type; + -- This is a pointer to a target dependent data item that provides + -- sufficient information for unwinding the stack frame of this + -- procedure. A value of No_Info (zero) means that we are the + -- outer level procedure. + + Handler_Records : Handler_Record_List (1 .. Num_Handlers); + -- List of pointers to Handler_Records for this procedure. The array + -- is sorted inside out, i.e. entries for inner frames appear before + -- entries for outer handlers. This ensures that a serial search + -- finds the innermost applicable handler + end record; + + subtype Subprogram_Descriptor_0 is Subprogram_Descriptor (0); + subtype Subprogram_Descriptor_1 is Subprogram_Descriptor (1); + subtype Subprogram_Descriptor_2 is Subprogram_Descriptor (2); + subtype Subprogram_Descriptor_3 is Subprogram_Descriptor (3); + -- Predeclare commonly used subtypes for buildingt he tables + + type Subprogram_Descriptor_Ptr is access all Subprogram_Descriptor; + + type Subprogram_Descriptor_List + is array (Natural range <>) of Subprogram_Descriptor_Ptr; + + type Subprogram_Descriptors_Record (Count : Natural) is record + SDesc : Subprogram_Descriptor_List (1 .. Count); + end record; + + type Subprogram_Descriptors_Ptr is + access all Subprogram_Descriptors_Record; + + -------------------------- + -- Unit Exception_Table -- + -------------------------- + + -- If a unit contains at least one subprogram, then a library level + -- declaration of the form: + + -- Tnn : aliased constant Subprogram_Descriptors := + -- (Count => n, + -- SDesc => + -- (SD1'Unrestricted_Access, + -- SD2'Unrestricted_Access, + -- ... + -- SDn'Unrestricted_Access)); + -- pragma Export (Ada, Tnn, "__gnat_unit_name__SDP"); + + -- is generated where the initializing expression is an array aggregate + -- whose elements are pointers to the generated subprogram descriptors + -- for the units. + + -- Note: the ALI file contains the designation UX in each unit entry + -- if a unit exception table is generated. + + -- The binder generates a list of addresses of pointers to these tables. + +end System.Exceptions; |