Merge with main truk.
[official-gcc.git] / gcc / ada / s-memory-vms_64.adb
blob7a08f7d07994679b20e521fe0483fdd577649742
1 ------------------------------------------------------------------------------
2 -- --
3 -- GNAT RUN-TIME COMPONENTS --
4 -- --
5 -- S Y S T E M . M E M O R Y --
6 -- --
7 -- B o d y --
8 -- --
9 -- Copyright (C) 2001-2013, 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 -- 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. --
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 ------------------------------------------------------------------------------
32 -- This is the VMS 64 bit implementation of this package
34 -- This implementation assumes that the underlying malloc/free/realloc
35 -- implementation is thread safe, and thus, no additional lock is required.
36 -- Note that we still need to defer abort because on most systems, an
37 -- asynchronous signal (as used for implementing asynchronous abort of
38 -- task) cannot safely be handled while malloc is executing.
40 -- If you are not using Ada constructs containing the "abort" keyword, then
41 -- you can remove the calls to Abort_Defer.all and Abort_Undefer.all from
42 -- this unit.
44 pragma Compiler_Unit_Warning;
46 with Ada.Exceptions;
47 with System.Soft_Links;
48 with System.Parameters;
49 with System.CRTL;
51 package body System.Memory is
53 use Ada.Exceptions;
54 use System.Soft_Links;
56 function c_malloc (Size : System.CRTL.size_t) return System.Address
57 renames System.CRTL.malloc;
59 procedure c_free (Ptr : System.Address)
60 renames System.CRTL.free;
62 function c_realloc
63 (Ptr : System.Address; Size : System.CRTL.size_t) return System.Address
64 renames System.CRTL.realloc;
66 Gnat_Heap_Size : Integer;
67 pragma Import (C, Gnat_Heap_Size, "__gl_heap_size");
68 -- Set by Feature logical GNAT$NO_MALLOC_64 and/or Binder switch -Hnn
70 -----------
71 -- Alloc --
72 -----------
74 function Alloc (Size : size_t) return System.Address is
75 Result : System.Address;
76 Actual_Size : size_t := Size;
78 begin
79 if Gnat_Heap_Size = 32 then
80 return Alloc32 (Size);
81 end if;
83 if Size = size_t'Last then
84 Raise_Exception (Storage_Error'Identity, "object too large");
85 end if;
87 -- Change size from zero to non-zero. We still want a proper pointer
88 -- for the zero case because pointers to zero length objects have to
89 -- be distinct, but we can't just go ahead and allocate zero bytes,
90 -- since some malloc's return zero for a zero argument.
92 if Size = 0 then
93 Actual_Size := 1;
94 end if;
96 if Parameters.No_Abort then
97 Result := c_malloc (System.CRTL.size_t (Actual_Size));
98 else
99 Abort_Defer.all;
100 Result := c_malloc (System.CRTL.size_t (Actual_Size));
101 Abort_Undefer.all;
102 end if;
104 if Result = System.Null_Address then
105 Raise_Exception (Storage_Error'Identity, "heap exhausted");
106 end if;
108 return Result;
109 end Alloc;
111 -------------
112 -- Alloc32 --
113 -------------
115 function Alloc32 (Size : size_t) return System.Address is
116 Result : System.Address;
117 Actual_Size : size_t := Size;
119 begin
120 if Size = size_t'Last then
121 Raise_Exception (Storage_Error'Identity, "object too large");
122 end if;
124 -- Change size from zero to non-zero. We still want a proper pointer
125 -- for the zero case because pointers to zero length objects have to
126 -- be distinct, but we can't just go ahead and allocate zero bytes,
127 -- since some malloc's return zero for a zero argument.
129 if Size = 0 then
130 Actual_Size := 1;
131 end if;
133 if Parameters.No_Abort then
134 Result := C_malloc32 (Actual_Size);
135 else
136 Abort_Defer.all;
137 Result := C_malloc32 (Actual_Size);
138 Abort_Undefer.all;
139 end if;
141 if Result = System.Null_Address then
142 Raise_Exception (Storage_Error'Identity, "heap exhausted");
143 end if;
145 return Result;
146 end Alloc32;
148 ----------
149 -- Free --
150 ----------
152 procedure Free (Ptr : System.Address) is
153 begin
154 if Parameters.No_Abort then
155 c_free (Ptr);
156 else
157 Abort_Defer.all;
158 c_free (Ptr);
159 Abort_Undefer.all;
160 end if;
161 end Free;
163 -------------
164 -- Realloc --
165 -------------
167 function Realloc
168 (Ptr : System.Address;
169 Size : size_t)
170 return System.Address
172 Result : System.Address;
173 Actual_Size : constant size_t := Size;
175 begin
176 if Gnat_Heap_Size = 32 then
177 return Realloc32 (Ptr, Size);
178 end if;
180 if Size = size_t'Last then
181 Raise_Exception (Storage_Error'Identity, "object too large");
182 end if;
184 if Parameters.No_Abort then
185 Result := c_realloc (Ptr, System.CRTL.size_t (Actual_Size));
186 else
187 Abort_Defer.all;
188 Result := c_realloc (Ptr, System.CRTL.size_t (Actual_Size));
189 Abort_Undefer.all;
190 end if;
192 if Result = System.Null_Address then
193 Raise_Exception (Storage_Error'Identity, "heap exhausted");
194 end if;
196 return Result;
197 end Realloc;
199 ---------------
200 -- Realloc32 --
201 ---------------
203 function Realloc32
204 (Ptr : System.Address;
205 Size : size_t)
206 return System.Address
208 Result : System.Address;
209 Actual_Size : constant size_t := Size;
211 begin
212 if Size = size_t'Last then
213 Raise_Exception (Storage_Error'Identity, "object too large");
214 end if;
216 if Parameters.No_Abort then
217 Result := C_realloc32 (Ptr, Actual_Size);
218 else
219 Abort_Defer.all;
220 Result := C_realloc32 (Ptr, Actual_Size);
221 Abort_Undefer.all;
222 end if;
224 if Result = System.Null_Address then
225 Raise_Exception (Storage_Error'Identity, "heap exhausted");
226 end if;
228 return Result;
229 end Realloc32;
230 end System.Memory;