This code reorganization reduces the amount of code duplication in the GNAT runtime library.
No behaviour change, no test. Tested on x86_64-pc-linux-gnu, committed on trunk 2011-08-01 Thomas Quinot <qui...@adacore.com> * s-parame-ae653.ads, s-parame-vms-alpha.ads, s-parame-hpux.ads, i-cpoint.adb, i-cstrin.adb, i-cpoint.ads, i-cstrin.ads, s-parame-vms-ia64.ads, s-parame.ads, i-c.ads, s-parame-vxworks.ads, s-parame-vms-restrict.ads: Remove duplicated Interfaces.C.* packages for VMS, instead parametrize the common implementation with System.Parameters declarations.
Index: s-parame-ae653.ads =================================================================== --- s-parame-ae653.ads (revision 176998) +++ s-parame-ae653.ads (working copy) @@ -112,6 +112,15 @@ -- is that this is the same as type Long_Integer, but this is not true -- of all targets. For example, in OpenVMS long /= Long_Integer. + ptr_bits : constant := Standard'Address_Size; + subtype C_Address is System.Address; + -- Number of bits in Interaces.C pointers, normally a standard address, + -- except on 64-bit VMS where they are 32-bit addresses, for compatibility + -- with legacy code. + + C_Malloc_Linkname : constant String := "__gnat_malloc"; + -- Name of runtime function used to allocate such a pointer + ---------------------------------------------- -- Behavior of Pragma Finalize_Storage_Only -- ---------------------------------------------- Index: s-parame-vms-alpha.ads =================================================================== --- s-parame-vms-alpha.ads (revision 176998) +++ s-parame-vms-alpha.ads (working copy) @@ -46,6 +46,8 @@ -- Note: do not introduce any pragma Inline statements into this unit, since -- otherwise the relinking and rebinding capability would be deactivated. +with System.Aux_DEC; + package System.Parameters is pragma Pure; @@ -110,6 +112,15 @@ -- is that this is the same as type Long_Integer, but this is not true -- of all targets. For example, in OpenVMS long /= Long_Integer. + ptr_bits : constant := 32; + subtype C_Address is System.Short_Address; + -- Number of bits in Interaces.C pointers, normally a standard address, + -- except on 64-bit VMS where they are 32-bit addresses, for compatibility + -- with legacy code. + + C_Malloc_Linkname : constant String := "__gnat_malloc32"; + -- Name of runtime function used to allocate such a pointer + ---------------------------------------------- -- Behavior of Pragma Finalize_Storage_Only -- ---------------------------------------------- Index: s-parame-hpux.ads =================================================================== --- s-parame-hpux.ads (revision 176998) +++ s-parame-hpux.ads (working copy) @@ -110,6 +110,15 @@ -- is that this is the same as type Long_Integer, but this is not true -- of all targets. For example, in OpenVMS long /= Long_Integer. + ptr_bits : constant := Standard'Address_Size; + subtype C_Address is System.Address; + -- Number of bits in Interaces.C pointers, normally a standard address, + -- except on 64-bit VMS where they are 32-bit addresses, for compatibility + -- with legacy code. + + C_Malloc_Linkname : constant String := "__gnat_malloc"; + -- Name of runtime function used to allocate such a pointer + ---------------------------------------------- -- Behavior of Pragma Finalize_Storage_Only -- ---------------------------------------------- Index: i-cpoint.adb =================================================================== --- i-cpoint.adb (revision 176998) +++ i-cpoint.adb (working copy) @@ -36,7 +36,7 @@ package body Interfaces.C.Pointers is - type Addr is mod Memory_Size; + type Addr is mod 2 ** System.Parameters.ptr_bits; function To_Pointer is new Ada.Unchecked_Conversion (Addr, Pointer); function To_Addr is new Ada.Unchecked_Conversion (Pointer, Addr); @@ -195,6 +195,7 @@ subtype A is Element_Array (L .. H); type PA is access A; + for PA'Size use System.Parameters.ptr_bits; function To_PA is new Ada.Unchecked_Conversion (Pointer, PA); begin @@ -238,6 +239,7 @@ subtype A is Element_Array (L .. H); type PA is access A; + for PA'Size use System.Parameters.ptr_bits; function To_PA is new Ada.Unchecked_Conversion (Pointer, PA); begin Index: i-cstrin.adb =================================================================== --- i-cstrin.adb (revision 177030) +++ i-cstrin.adb (working copy) @@ -42,10 +42,10 @@ -- this type will in fact be used for aliasing values of other types. function To_chars_ptr is - new Ada.Unchecked_Conversion (Address, chars_ptr); + new Ada.Unchecked_Conversion (System.Parameters.C_Address, chars_ptr); function To_Address is - new Ada.Unchecked_Conversion (chars_ptr, Address); + new Ada.Unchecked_Conversion (chars_ptr, System.Parameters.C_Address); ----------------------- -- Local Subprograms -- @@ -70,7 +70,7 @@ -- compatible, so we directly import here the malloc and free routines. function Memory_Alloc (Size : size_t) return chars_ptr; - pragma Import (C, Memory_Alloc, "__gnat_malloc"); + pragma Import (C, Memory_Alloc, System.Parameters.C_Malloc_Linkname); procedure Memory_Free (Address : chars_ptr); pragma Import (C, Memory_Free, "__gnat_free"); Index: i-cpoint.ads =================================================================== --- i-cpoint.ads (revision 176998) +++ i-cpoint.ads (working copy) @@ -33,6 +33,8 @@ -- -- ------------------------------------------------------------------------------ +with System.Parameters; + generic type Index is (<>); type Element is private; @@ -43,6 +45,7 @@ pragma Preelaborate; type Pointer is access all Element; + for Pointer'Size use System.Parameters.ptr_bits; pragma No_Strict_Aliasing (Pointer); -- We turn off any strict aliasing assumptions for the pointer type, Index: i-cstrin.ads =================================================================== --- i-cstrin.ads (revision 176998) +++ i-cstrin.ads (working copy) @@ -37,6 +37,7 @@ pragma Preelaborate; type char_array_access is access all char_array; + for char_array_access'Size use System.Parameters.ptr_bits; pragma No_Strict_Aliasing (char_array_access); -- Since this type is used for external interfacing, with the pointer @@ -91,7 +92,7 @@ private type chars_ptr is access all Character; - pragma Convention (C, chars_ptr); + for chars_ptr'Size use System.Parameters.ptr_bits; pragma No_Strict_Aliasing (chars_ptr); -- Since this type is used for external interfacing, with the pointer Index: s-parame-vms-ia64.ads =================================================================== --- s-parame-vms-ia64.ads (revision 176998) +++ s-parame-vms-ia64.ads (working copy) @@ -46,6 +46,8 @@ -- Note: do not introduce any pragma Inline statements into this unit, since -- otherwise the relinking and rebinding capability would be deactivated. +with System.Aux_DEC; + package System.Parameters is pragma Pure; @@ -110,6 +112,15 @@ -- is that this is the same as type Long_Integer, but this is not true -- of all targets. For example, in OpenVMS long /= Long_Integer. + ptr_bits : constant := 32; + subtype C_Address is System.Short_Address; + -- Number of bits in Interaces.C pointers, normally a standard address, + -- except on 64-bit VMS where they are 32-bit addresses, for compatibility + -- with legacy code. + + C_Malloc_Linkname : constant String := "__gnat_malloc32"; + -- Name of runtime function used to allocate such a pointer + ---------------------------------------------- -- Behavior of Pragma Finalize_Storage_Only -- ---------------------------------------------- Index: s-parame.ads =================================================================== --- s-parame.ads (revision 176998) +++ s-parame.ads (working copy) @@ -112,6 +112,15 @@ -- is that this is the same as type Long_Integer, but this is not true -- of all targets. For example, in OpenVMS long /= Long_Integer. + ptr_bits : constant := Standard'Address_Size; + subtype C_Address is System.Address; + -- Number of bits in Interaces.C pointers, normally a standard address, + -- except on 64-bit VMS where they are 32-bit addresses, for compatibility + -- with legacy code. + + C_Malloc_Linkname : constant String := "__gnat_malloc"; + -- Name of runtime function used to allocate such a pointer + ---------------------------------------------- -- Behavior of Pragma Finalize_Storage_Only -- ---------------------------------------------- Index: i-c.ads =================================================================== --- i-c.ads (revision 176998) +++ i-c.ads (working copy) @@ -54,10 +54,10 @@ -- a non-private system.address type. type ptrdiff_t is - range -(2 ** (Standard'Address_Size - Integer'(1))) .. - +(2 ** (Standard'Address_Size - Integer'(1)) - 1); + range -(2 ** (System.Parameters.ptr_bits - Integer'(1))) .. + +(2 ** (System.Parameters.ptr_bits - Integer'(1)) - 1); - type size_t is mod 2 ** Standard'Address_Size; + type size_t is mod 2 ** System.Parameters.ptr_bits; -- Floating-Point Index: s-parame-vxworks.ads =================================================================== --- s-parame-vxworks.ads (revision 176998) +++ s-parame-vxworks.ads (working copy) @@ -112,6 +112,15 @@ -- is that this is the same as type Long_Integer, but this is not true -- of all targets. For example, in OpenVMS long /= Long_Integer. + ptr_bits : constant := Standard'Address_Size; + subtype C_Address is System.Address; + -- Number of bits in Interaces.C pointers, normally a standard address, + -- except on 64-bit VMS where they are 32-bit addresses, for compatibility + -- with legacy code. + + C_Malloc_Linkname : constant String := "__gnat_malloc"; + -- Name of runtime function used to allocate such a pointer + ---------------------------------------------- -- Behavior of Pragma Finalize_Storage_Only -- ---------------------------------------------- Index: s-parame-vms-restrict.ads =================================================================== --- s-parame-vms-restrict.ads (revision 176998) +++ s-parame-vms-restrict.ads (working copy) @@ -46,6 +46,8 @@ -- Note: do not introduce any pragma Inline statements into this unit, since -- otherwise the relinking and rebinding capability would be deactivated. +with System.Aux_DEC; + package System.Parameters is pragma Pure; @@ -110,6 +112,15 @@ -- is that this is the same as type Long_Integer, but this is not true -- of all targets. For example, in OpenVMS long /= Long_Integer. + ptr_bits : constant := 32; + subtype C_Address is System.Short_Address; + -- Number of bits in Interaces.C pointers, normally a standard address, + -- except on 64-bit VMS where they are 32-bit addresses, for compatibility + -- with legacy code. + + C_Malloc_Linkname : constant String := "__gnat_malloc32"; + -- Name of runtime function used to allocate such a pointer + ---------------------------------------------- -- Behavior of Pragma Finalize_Storage_Only -- ----------------------------------------------