
2014-02-25 Robert Dewar <dewar@adacore.com> * exp_ch7.adb, sem_util.adb, sem_util.ads, exp_ch6.adb: Minor reformatting. 2014-02-25 Ed Schonberg <schonberg@adacore.com> * freeze.adb (Freeze_Entity): If the return type of a function is a limited view, and the non-limited view has not been seen yet, defer freezing to some later point. 2014-02-25 Robert Dewar <dewar@adacore.com> * sem_ch3.adb: Minor reformatting. 2014-02-25 Robert Dewar <dewar@adacore.com> * s-excdeb.ads, s-except.ads, s-exctab.adb, s-exctab.ads, s-finmas.ads, s-htable.adb, s-htable.ads, s-imenne.adb, s-imenne.ads, s-imgenu.adb, s-imgenu.ads, s-mastop.adb, s-mastop.ads, s-memory-vms_64.adb, s-memory-vms_64.ads, s-memory.adb, s-memory.ads, s-os_lib.adb, s-os_lib.ads, s-parame.adb, s-parame.ads, s-purexc.ads, s-restri.adb, s-restri.ads, s-rident.ads, s-secsta.adb, s-secsta.ads, s-soflin.adb, s-soflin.ads, s-sopco3.adb, s-sopco3.ads, s-sopco4.adb, s-sopco4.ads, s-sopco5.adb, s-sopco5.ads, s-spsufi.ads, s-stache.adb, s-stache.ads, s-stalib.adb, s-stalib.ads, s-stoele.adb, s-stoele.ads, s-strcom.adb, s-strcom.ads, s-strhas.adb, s-string.adb, s-string.ads, s-strops.adb, s-strops.ads, s-ststop.adb, s-ststop.ads, s-traceb.adb, s-traceb.ads, s-traent.adb, s-traent.ads, s-unstyp.ads, s-utf_32.adb, s-utf_32.ads, s-wchcnv.adb, s-wchcnv.ads, s-wchcon.adb, s-wchcon.ads, s-wchjis.adb, s-wchjis.ads, sem_ch11.adb, sem_ch4.adb, sem_ch5.adb, sem_prag.adb, snames.ads-tmpl: Change Compiler_Unit everywhere to Compiler_Unit_Warning. From-SVN: r208135
150 lines
5.5 KiB
Ada
150 lines
5.5 KiB
Ada
------------------------------------------------------------------------------
|
|
-- --
|
|
-- GNAT RUN-TIME COMPONENTS --
|
|
-- --
|
|
-- S Y S T E M . M E M O R Y --
|
|
-- --
|
|
-- B o d y --
|
|
-- --
|
|
-- Copyright (C) 2001-2013, 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 3, 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. --
|
|
-- --
|
|
-- As a special exception under Section 7 of GPL version 3, you are granted --
|
|
-- additional permissions described in the GCC Runtime Library Exception, --
|
|
-- version 3.1, as published by the Free Software Foundation. --
|
|
-- --
|
|
-- You should have received a copy of the GNU General Public License and --
|
|
-- a copy of the GCC Runtime Library Exception along with this program; --
|
|
-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
|
|
-- <http://www.gnu.org/licenses/>. --
|
|
-- --
|
|
-- GNAT was originally developed by the GNAT team at New York University. --
|
|
-- Extensive contributions were provided by Ada Core Technologies Inc. --
|
|
-- --
|
|
------------------------------------------------------------------------------
|
|
|
|
-- This is the default implementation of this package
|
|
|
|
-- This implementation assumes that the underlying malloc/free/realloc
|
|
-- implementation is thread safe, and thus, no additional lock is required.
|
|
-- Note that we still need to defer abort because on most systems, an
|
|
-- asynchronous signal (as used for implementing asynchronous abort of
|
|
-- task) cannot safely be handled while malloc is executing.
|
|
|
|
-- If you are not using Ada constructs containing the "abort" keyword, then
|
|
-- you can remove the calls to Abort_Defer.all and Abort_Undefer.all from
|
|
-- this unit.
|
|
|
|
pragma Compiler_Unit_Warning;
|
|
|
|
with Ada.Exceptions;
|
|
with System.Soft_Links;
|
|
with System.Parameters;
|
|
with System.CRTL;
|
|
|
|
package body System.Memory is
|
|
|
|
use Ada.Exceptions;
|
|
use System.Soft_Links;
|
|
|
|
function c_malloc (Size : System.CRTL.size_t) return System.Address
|
|
renames System.CRTL.malloc;
|
|
|
|
procedure c_free (Ptr : System.Address)
|
|
renames System.CRTL.free;
|
|
|
|
function c_realloc
|
|
(Ptr : System.Address; Size : System.CRTL.size_t) return System.Address
|
|
renames System.CRTL.realloc;
|
|
|
|
-----------
|
|
-- Alloc --
|
|
-----------
|
|
|
|
function Alloc (Size : size_t) return System.Address is
|
|
Result : System.Address;
|
|
Actual_Size : size_t := Size;
|
|
|
|
begin
|
|
if Size = size_t'Last then
|
|
Raise_Exception (Storage_Error'Identity, "object too large");
|
|
end if;
|
|
|
|
-- Change size from zero to non-zero. We still want a proper pointer
|
|
-- for the zero case because pointers to zero length objects have to
|
|
-- be distinct, but we can't just go ahead and allocate zero bytes,
|
|
-- since some malloc's return zero for a zero argument.
|
|
|
|
if Size = 0 then
|
|
Actual_Size := 1;
|
|
end if;
|
|
|
|
if Parameters.No_Abort then
|
|
Result := c_malloc (System.CRTL.size_t (Actual_Size));
|
|
else
|
|
Abort_Defer.all;
|
|
Result := c_malloc (System.CRTL.size_t (Actual_Size));
|
|
Abort_Undefer.all;
|
|
end if;
|
|
|
|
if Result = System.Null_Address then
|
|
Raise_Exception (Storage_Error'Identity, "heap exhausted");
|
|
end if;
|
|
|
|
return Result;
|
|
end Alloc;
|
|
|
|
----------
|
|
-- Free --
|
|
----------
|
|
|
|
procedure Free (Ptr : System.Address) is
|
|
begin
|
|
if Parameters.No_Abort then
|
|
c_free (Ptr);
|
|
else
|
|
Abort_Defer.all;
|
|
c_free (Ptr);
|
|
Abort_Undefer.all;
|
|
end if;
|
|
end Free;
|
|
|
|
-------------
|
|
-- Realloc --
|
|
-------------
|
|
|
|
function Realloc
|
|
(Ptr : System.Address;
|
|
Size : size_t)
|
|
return System.Address
|
|
is
|
|
Result : System.Address;
|
|
Actual_Size : constant size_t := Size;
|
|
|
|
begin
|
|
if Size = size_t'Last then
|
|
Raise_Exception (Storage_Error'Identity, "object too large");
|
|
end if;
|
|
|
|
if Parameters.No_Abort then
|
|
Result := c_realloc (Ptr, System.CRTL.size_t (Actual_Size));
|
|
else
|
|
Abort_Defer.all;
|
|
Result := c_realloc (Ptr, System.CRTL.size_t (Actual_Size));
|
|
Abort_Undefer.all;
|
|
end if;
|
|
|
|
if Result = System.Null_Address then
|
|
Raise_Exception (Storage_Error'Identity, "heap exhausted");
|
|
end if;
|
|
|
|
return Result;
|
|
end Realloc;
|
|
|
|
end System.Memory;
|