blob: 18a170b0b2d0f96e8b103c63570a9d5a4a3d8fef [file] [log] [blame]
------------------------------------------------------------------------------
-- --
-- GNAT COMPILER COMPONENTS --
-- --
-- S Y S T E M . S T O R A G E _ E L E M E N T S --
-- --
-- S p e c --
-- --
-- $Revision: 1.23 $ --
-- --
-- This specification is adapted from the Ada Reference Manual for use with --
-- GNAT. In accordance with the copyright of that document, you can freely --
-- copy and modify this specification, provided that if you redistribute a --
-- modified version, any changes that you have made are clearly indicated. --
-- --
------------------------------------------------------------------------------
-- Warning: declarations in this package are ambiguous with respect to the
-- extra declarations that can be introduced into System using Extend_System.
-- It is a good idea to avoid use clauses for this package!
pragma Warnings (Off);
-- This is to stop bootstrap problems with the use of Inline_Always
-- To be removed (along with redundant Inline pragmas) in 3.13.
package System.Storage_Elements is
pragma Pure (Storage_Elements);
-- Note that we take advantage of the implementation permission to make
-- this unit Pure instead of Preelaborable; see RM 13.7.1(15).
type Storage_Offset is range
-(2 ** (Standard."-" (Standard'Address_Size, 1))) ..
+(2 ** (Standard."-" (Standard'Address_Size, 1))) - 1;
-- Note: the reason for the qualification of "-" here by Standard is
-- that we have a current bug in GNAT that otherwise causes a bogus
-- ambiguity when this unit is analyzed in an Rtsfind context.
subtype Storage_Count is Storage_Offset range 0 .. Storage_Offset'Last;
type Storage_Element is mod 2 ** Storage_Unit;
for Storage_Element'Size use Storage_Unit;
type Storage_Array is
array (Storage_Offset range <>) of aliased Storage_Element;
for Storage_Array'Component_Size use Storage_Unit;
-- Address arithmetic
function "+" (Left : Address; Right : Storage_Offset) return Address;
pragma Convention (Intrinsic, "+");
pragma Inline ("+");
pragma Inline_Always ("+");
function "+" (Left : Storage_Offset; Right : Address) return Address;
pragma Convention (Intrinsic, "+");
pragma Inline ("+");
pragma Inline_Always ("+");
function "-" (Left : Address; Right : Storage_Offset) return Address;
pragma Convention (Intrinsic, "-");
pragma Inline ("-");
pragma Inline_Always ("-");
function "-" (Left, Right : Address) return Storage_Offset;
pragma Convention (Intrinsic, "-");
pragma Inline ("-");
pragma Inline_Always ("-");
function "mod"
(Left : Address;
Right : Storage_Offset)
return Storage_Offset;
pragma Convention (Intrinsic, "mod");
pragma Inline ("mod");
pragma Inline_Always ("mod");
-- Conversion to/from integers
type Integer_Address is mod Memory_Size;
function To_Address (Value : Integer_Address) return Address;
pragma Convention (Intrinsic, To_Address);
pragma Inline (To_Address);
pragma Inline_Always (To_Address);
function To_Integer (Value : Address) return Integer_Address;
pragma Convention (Intrinsic, To_Integer);
pragma Inline (To_Integer);
pragma Inline_Always (To_Integer);
end System.Storage_Elements;