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 --
    ----------------------------------------------

Reply via email to