1 ------------------------------------------------------------------------------
3 -- GNAT COMPILER COMPONENTS --
5 -- S Y S T E M . S T O R A G E _ E L E M E N T S --
11 -- This specification is adapted from the Ada Reference Manual for use with --
12 -- GNAT. In accordance with the copyright of that document, you can freely --
13 -- copy and modify this specification, provided that if you redistribute a --
14 -- modified version, any changes that you have made are clearly indicated. --
16 ------------------------------------------------------------------------------
18 -- Warning: declarations in this package are ambiguous with respect to the
19 -- extra declarations that can be introduced into System using Extend_System.
20 -- It is a good idea to avoid use clauses for this package!
22 pragma Warnings
(Off
);
23 -- This is to stop bootstrap problems with the use of Inline_Always
24 -- To be removed (along with redundant Inline pragmas) in 3.13.
26 package System
.Storage_Elements
is
27 pragma Pure
(Storage_Elements
);
28 -- Note that we take advantage of the implementation permission to make
29 -- this unit Pure instead of Preelaborable; see RM 13.7.1(15).
31 type Storage_Offset
is range
32 -(2 ** (Standard
."-" (Standard
'Address_Size, 1))) ..
33 +(2 ** (Standard
."-" (Standard
'Address_Size, 1))) - 1;
34 -- Note: the reason for the qualification of "-" here by Standard is
35 -- that we have a current bug in GNAT that otherwise causes a bogus
36 -- ambiguity when this unit is analyzed in an Rtsfind context.
38 subtype Storage_Count
is Storage_Offset
range 0 .. Storage_Offset
'Last;
40 type Storage_Element
is mod 2 ** Storage_Unit
;
41 for Storage_Element
'Size use Storage_Unit
;
44 array (Storage_Offset
range <>) of aliased Storage_Element
;
45 for Storage_Array
'Component_Size use Storage_Unit
;
49 function "+" (Left
: Address
; Right
: Storage_Offset
) return Address
;
50 pragma Convention
(Intrinsic
, "+");
52 pragma Inline_Always
("+");
54 function "+" (Left
: Storage_Offset
; Right
: Address
) return Address
;
55 pragma Convention
(Intrinsic
, "+");
57 pragma Inline_Always
("+");
59 function "-" (Left
: Address
; Right
: Storage_Offset
) return Address
;
60 pragma Convention
(Intrinsic
, "-");
62 pragma Inline_Always
("-");
64 function "-" (Left
, Right
: Address
) return Storage_Offset
;
65 pragma Convention
(Intrinsic
, "-");
67 pragma Inline_Always
("-");
71 Right
: Storage_Offset
)
72 return Storage_Offset
;
73 pragma Convention
(Intrinsic
, "mod");
74 pragma Inline
("mod");
75 pragma Inline_Always
("mod");
77 -- Conversion to/from integers
79 type Integer_Address
is mod Memory_Size
;
81 function To_Address
(Value
: Integer_Address
) return Address
;
82 pragma Convention
(Intrinsic
, To_Address
);
83 pragma Inline
(To_Address
);
84 pragma Inline_Always
(To_Address
);
86 function To_Integer
(Value
: Address
) return Integer_Address
;
87 pragma Convention
(Intrinsic
, To_Integer
);
88 pragma Inline
(To_Integer
);
89 pragma Inline_Always
(To_Integer
);
91 end System
.Storage_Elements
;