OSDN Git Service

* doc/install.texi (xtensa-*-elf): New target.
[pf3gnuchains/gcc-fork.git] / gcc / ada / s-vmexta.adb
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT COMPILER COMPONENTS                         --
4 --                                                                          --
5 --           S Y S T E M . V M S _ E X C E P T I O N _ T A B L E            --
6 --                                                                          --
7 --                                 B o d y                                  --
8 --                                                                          --
9 --                            $Revision: 1.7 $
10 --                                                                          --
11 --          Copyright (C) 1997-2001, Free Software Foundation, Inc.         --
12 --                                                                          --
13 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
14 -- terms of the  GNU General Public License as published  by the Free Soft- --
15 -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
16 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
17 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
18 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
19 -- for  more details.  You should have  received  a copy of the GNU General --
20 -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
21 -- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
22 -- MA 02111-1307, USA.                                                      --
23 --                                                                          --
24 -- As a special exception,  if other files  instantiate  generics from this --
25 -- unit, or you link  this unit with other files  to produce an executable, --
26 -- this  unit  does not  by itself cause  the resulting  executable  to  be --
27 -- covered  by the  GNU  General  Public  License.  This exception does not --
28 -- however invalidate  any other reasons why  the executable file  might be --
29 -- covered by the  GNU Public License.                                      --
30 --                                                                          --
31 -- GNAT was originally developed  by the GNAT team at  New York University. --
32 -- It is now maintained by Ada Core Technologies Inc (http://www.gnat.com). --
33 --                                                                          --
34 ------------------------------------------------------------------------------
35
36 --  This is an Alpha/VMS package.
37
38 with GNAT.HTable;
39 pragma Elaborate_All (GNAT.HTable);
40
41 package body System.VMS_Exception_Table is
42
43    use System.Standard_Library;
44
45    type HTable_Headers is range 1 .. 37;
46
47    type Exception_Code_Data;
48    type Exception_Code_Data_Ptr is access all Exception_Code_Data;
49
50    --  The following record maps an imported VMS condition to an
51    --  Ada exception.
52
53    type Exception_Code_Data is record
54       Code       : Natural;
55       Except     : Exception_Data_Ptr;
56       HTable_Ptr : Exception_Code_Data_Ptr;
57    end record;
58
59    procedure Set_HT_Link
60      (T    : Exception_Code_Data_Ptr;
61       Next : Exception_Code_Data_Ptr);
62
63    function Get_HT_Link (T : Exception_Code_Data_Ptr)
64      return Exception_Code_Data_Ptr;
65
66    function Hash (F : Natural) return HTable_Headers;
67    function Get_Key (T : Exception_Code_Data_Ptr) return Natural;
68
69    package Exception_Code_HTable is new GNAT.HTable.Static_HTable (
70      Header_Num => HTable_Headers,
71      Element    => Exception_Code_Data,
72      Elmt_Ptr   => Exception_Code_Data_Ptr,
73      Null_Ptr   => null,
74      Set_Next   => Set_HT_Link,
75      Next       => Get_HT_Link,
76      Key        => Natural,
77      Get_Key    => Get_Key,
78      Hash       => Hash,
79      Equal      => "=");
80
81    ---------------------
82    -- Coded_Exception --
83    ---------------------
84
85    function Coded_Exception (X : Natural) return Exception_Data_Ptr is
86       Res : Exception_Code_Data_Ptr;
87
88    begin
89       Res := Exception_Code_HTable.Get (X);
90
91       if Res /= null  then
92          return Res.Except;
93       else
94          return null;
95       end if;
96
97    end Coded_Exception;
98
99    -----------------
100    -- Get_HT_Link --
101    -----------------
102
103    function  Get_HT_Link (T : Exception_Code_Data_Ptr)
104      return Exception_Code_Data_Ptr is
105    begin
106       return T.HTable_Ptr;
107    end Get_HT_Link;
108
109    -------------
110    -- Get_Key --
111    -------------
112
113    function Get_Key (T : Exception_Code_Data_Ptr) return Natural is
114    begin
115       return T.Code;
116    end Get_Key;
117
118    ----------
119    -- Hash --
120    ----------
121
122    function Hash (F : Natural) return HTable_Headers is
123    begin
124       return HTable_Headers
125         (F mod Natural (HTable_Headers'Last - HTable_Headers'First + 1) + 1);
126    end Hash;
127
128    ----------------------------
129    -- Register_VMS_Exception --
130    ----------------------------
131
132    procedure Register_VMS_Exception (Code : Integer) is
133       --  Mask off lower 3 bits which are the severity
134
135       Excode : Integer := (Code / 8) * 8;
136    begin
137
138       --  This allocates an empty exception that gets filled in by
139       --  __gnat_error_handler when the exception is raised. Allocating
140       --  it here prevents having to allocate it each time the exception
141       --  is raised.
142
143       if Exception_Code_HTable.Get (Excode) = null then
144          Exception_Code_HTable.Set
145            (new Exception_Code_Data'
146              (Excode,
147               new Exception_Data'(False, 'V', 0, null, null, 0),
148               null));
149       end if;
150    end Register_VMS_Exception;
151
152    -----------------
153    -- Set_HT_Link --
154    -----------------
155
156    procedure Set_HT_Link
157      (T    : Exception_Code_Data_Ptr;
158       Next : Exception_Code_Data_Ptr)
159    is
160    begin
161       T.HTable_Ptr := Next;
162    end Set_HT_Link;
163
164 end System.VMS_Exception_Table;