OSDN Git Service

2005-06-15 Andrew Pinski <pinskia@physics.uc.edu>
[pf3gnuchains/gcc-fork.git] / gcc / ada / a-tags.ads
1 ------------------------------------------------------------------------------
2 --                                                                          --
3 --                         GNAT RUN-TIME COMPONENTS                         --
4 --                                                                          --
5 --                             A D A . T A G S                              --
6 --                                                                          --
7 --                                 S p e c                                  --
8 --                                                                          --
9 --          Copyright (C) 1992-2005 Free Software Foundation, Inc.          --
10 --                                                                          --
11 -- This specification is derived from the Ada Reference Manual for use with --
12 -- GNAT. The copyright notice above, and the license provisions that follow --
13 -- apply solely to the  contents of the part following the private keyword. --
14 --                                                                          --
15 -- GNAT is free software;  you can  redistribute it  and/or modify it under --
16 -- terms of the  GNU General Public License as published  by the Free Soft- --
17 -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
18 -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
19 -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
20 -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
21 -- for  more details.  You should have  received  a copy of the GNU General --
22 -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
23 -- to  the Free Software Foundation,  59 Temple Place - Suite 330,  Boston, --
24 -- MA 02111-1307, USA.                                                      --
25 --                                                                          --
26 -- As a special exception,  if other files  instantiate  generics from this --
27 -- unit, or you link  this unit with other files  to produce an executable, --
28 -- this  unit  does not  by itself cause  the resulting  executable  to  be --
29 -- covered  by the  GNU  General  Public  License.  This exception does not --
30 -- however invalidate  any other reasons why  the executable file  might be --
31 -- covered by the  GNU Public License.                                      --
32 --                                                                          --
33 -- GNAT was originally developed  by the GNAT team at  New York University. --
34 -- Extensive contributions were provided by Ada Core Technologies Inc.      --
35 --                                                                          --
36 ------------------------------------------------------------------------------
37
38 with System;
39 with System.Storage_Elements;
40 with Unchecked_Conversion;
41
42 package Ada.Tags is
43
44    pragma Elaborate_Body;
45
46    type Tag is private;
47
48    function Expanded_Name (T : Tag) return String;
49
50    function External_Tag (T : Tag) return String;
51
52    function Internal_Tag (External : String) return Tag;
53
54    Tag_Error : exception;
55
56 private
57
58    ---------------------------------------------------------------
59    -- Abstract Procedural Interface For The GNAT Dispatch Table --
60    ---------------------------------------------------------------
61
62    --  GNAT's Dispatch Table format is customizable in order to match the
63    --  format used in another language. GNAT supports programs that use
64    --  two different dispatch table formats at the same time: the native
65    --  format that supports Ada 95 tagged types and which is described in
66    --  Ada.Tags, and a foreign format for types that are imported from some
67    --  other language (typically C++) which is described in Interfaces.CPP.
68    --  The runtime information kept for each tagged type is separated into
69    --  two objects: the Dispatch Table and the Type Specific Data record.
70    --  These two objects are allocated statically using the constants:
71
72    --      DT Size  = DT_Prologue_Size  + Nb_Prim * DT_Entry_Size
73    --      TSD Size = TSD_Prologue_Size + (1 + Idepth)  * TSD_Entry_Size
74
75    --  where Nb_prim is the number of primitive operations of the given
76    --  type and Idepth its inheritance depth.
77
78    --  The compiler generates calls to the following SET routines to
79    --  initialize those structures and uses the GET functions to
80    --  retreive the information when needed
81
82    type Dispatch_Table;
83    type Tag is access all Dispatch_Table;
84
85    type Type_Specific_Data;
86    type Type_Specific_Data_Ptr is access all Type_Specific_Data;
87
88    package SSE renames System.Storage_Elements;
89
90    function CW_Membership (Obj_Tag : Tag; Typ_Tag : Tag) return Boolean;
91    --  Given the tag of an object and the tag associated to a type, return
92    --  true if Obj is in Typ'Class.
93
94    function Get_External_Tag (T : Tag) return System.Address;
95    --  Retrieve the address of a null terminated string containing
96    --  the external name
97
98    function Get_Prim_Op_Address
99      (T        : Tag;
100       Position : Positive) return System.Address;
101    --  Given a pointer to a dispatch Table (T) and a position in the DT
102    --  this function returns the address of the virtual function stored
103    --  in it (used for dispatching calls)
104
105    function Get_RC_Offset (T : Tag) return SSE.Storage_Offset;
106    --  Return the Offset of the implicit record controller when the object
107    --  has controlled components. O otherwise.
108
109    pragma Export (Ada, Get_RC_Offset, "ada__tags__get_rc_offset");
110    --  This procedure is used in s-finimp to compute the deep routines
111    --  it is exported manually in order to avoid changing completely the
112    --  organization of the run time.
113
114    function Get_Remotely_Callable (T : Tag) return Boolean;
115    --  Return the value previously set by Set_Remotely_Callable
116
117    procedure Inherit_DT
118     (Old_T   : Tag;
119      New_T   : Tag;
120      Entry_Count : Natural);
121    --  Entry point used to initialize the DT of a type knowing the tag
122    --  of the direct ancestor and the number of primitive ops that are
123    --  inherited (Entry_Count).
124
125    procedure Inherit_TSD (Old_Tag : Tag; New_Tag : Tag);
126    --  Initialize the TSD of a type knowing the tag of the direct ancestor
127
128    function Parent_Size
129      (Obj : System.Address;
130       T   : Tag) return SSE.Storage_Count;
131    --  Computes the size the ancestor part of a tagged extension object
132    --  whose address is 'obj' by calling the indirectly _size function of
133    --  the ancestor. The ancestor is the parent of the type represented by
134    --  tag T. This function assumes that _size is always in slot 1 of
135    --  the dispatch table.
136
137    pragma Export (Ada, Parent_Size, "ada__tags__parent_size");
138    --  This procedure is used in s-finimp and is thus exported manually
139
140    function Parent_Tag (T : Tag) return Tag;
141    --  Obj is the address of a tagged object. Parent_Tag fetch the tag of the
142    --  immediate ancestor (parent) of the type associated with Obj.
143
144    pragma Export (Ada, Parent_Tag, "ada__tags__parent_tag");
145    --  This procedure is used in s-finimp and is thus exported manually
146
147    procedure Register_Tag (T : Tag);
148    --  Insert the Tag and its associated external_tag in a table for the
149    --  sake of Internal_Tag
150
151    procedure Set_Prim_Op_Address
152      (T        : Tag;
153       Position : Positive;
154       Value    : System.Address);
155    --  Given a pointer to a dispatch Table (T) and a position in the
156    --  dispatch Table put the address of the virtual function in it
157    --  (used for overriding)
158
159    procedure Set_TSD (T : Tag; Value : System.Address);
160    --  Given a pointer T to a dispatch Table, stores the address of the record
161    --  containing the Type Specific Data generated by GNAT
162
163    procedure Set_Expanded_Name (T : Tag; Value : System.Address);
164    --  Set the address of the string containing the expanded name
165    --  in the Dispatch table
166
167    procedure Set_External_Tag (T : Tag; Value : System.Address);
168    --  Set the address of the string containing the external tag
169    --  in the Dispatch table
170
171    procedure Set_RC_Offset (T : Tag; Value : SSE.Storage_Offset);
172    --  Sets the Offset of the implicit record controller when the object
173    --  has controlled components. Set to O otherwise.
174
175    procedure Set_Remotely_Callable (T : Tag; Value : Boolean);
176    --  Set to true if the type has been declared in a context described
177    --  in E.4 (18).
178
179    function TSD (T : Tag) return Type_Specific_Data_Ptr;
180    --  Given a pointer T to a dispatch Table, retreives the address of the
181    --  record containing the Type Specific Data generated by GNAT
182
183    DT_Prologue_Size : constant SSE.Storage_Count :=
184                         SSE.Storage_Count
185                           (2 * (Standard'Address_Size / System.Storage_Unit));
186    --  Size of the first part of the dispatch table
187
188    DT_Typeinfo_Ptr_Size : constant SSE.Storage_Count :=
189                             SSE.Storage_Count
190                               (Standard'Address_Size / System.Storage_Unit);
191    --  Size of the Typeinfo_Ptr field of the Dispatch Table.
192
193    DT_Entry_Size : constant SSE.Storage_Count :=
194                      SSE.Storage_Count
195                        (1 * (Standard'Address_Size / System.Storage_Unit));
196    --  Size of each primitive operation entry in the Dispatch Table.
197
198    TSD_Prologue_Size : constant SSE.Storage_Count :=
199                          SSE.Storage_Count
200                            (6 * Standard'Address_Size / System.Storage_Unit);
201    --  Size of the first part of the type specific data
202
203    TSD_Entry_Size : constant SSE.Storage_Count :=
204      SSE.Storage_Count (1 * (Standard'Address_Size / System.Storage_Unit));
205    --  Size of each ancestor tag entry in the TSD
206
207    type Address_Array is array (Natural range <>) of System.Address;
208    pragma Suppress (Index_Check, On => Address_Array);
209    --  The reason we suppress index checks is that in the body, objects
210    --  of this type are declared with a dummy size of 1, the actual size
211    --  depending on the number of primitive operations.
212
213    function To_Type_Specific_Data_Ptr is
214      new Unchecked_Conversion (System.Address, Type_Specific_Data_Ptr);
215
216    function To_Address is
217      new Unchecked_Conversion (Type_Specific_Data_Ptr, System.Address);
218
219    function To_Address is
220      new Unchecked_Conversion (Tag, System.Address);
221
222    type Addr_Ptr is access System.Address;
223
224    function To_Addr_Ptr is
225       new Unchecked_Conversion (System.Address, Addr_Ptr);
226
227    --  Primitive dispatching operations are always inlined, to facilitate
228    --  use in a minimal/no run-time environment for high integrity use.
229
230    pragma Inline_Always (CW_Membership);
231    pragma Inline_Always (Get_Prim_Op_Address);
232    pragma Inline_Always (Get_RC_Offset);
233    pragma Inline_Always (Get_Remotely_Callable);
234    pragma Inline_Always (Inherit_DT);
235    pragma Inline_Always (Inherit_TSD);
236    pragma Inline_Always (Register_Tag);
237    pragma Inline_Always (Set_Expanded_Name);
238    pragma Inline_Always (Set_External_Tag);
239    pragma Inline_Always (Set_Prim_Op_Address);
240    pragma Inline_Always (Set_RC_Offset);
241    pragma Inline_Always (Set_Remotely_Callable);
242    pragma Inline_Always (Set_TSD);
243    pragma Inline_Always (TSD);
244
245 end Ada.Tags;