[Ada] Remove 2GB secondary stack limit for 64-bit processors
authorPatrick Bernardi <bernardi@adacore.com>
Fri, 25 May 2018 09:05:28 +0000 (09:05 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Fri, 25 May 2018 09:05:28 +0000 (09:05 +0000)
This patch removes the restriction introduced recently that limited the size
of the secondary stack to 2GB. The size of the secondary stack is now limited
to half of the size of the memory address space for the target.

2018-05-25  Patrick Bernardi  <bernardi@adacore.com>

gcc/ada/

* libgnat/s-parame.ads, libgnat/s-parame__vxworks.ads,
libgnat/s-parame__ae653.ads, libgnat/s-parame__hpux.ads (Size_Type):
Expand range of type to match the address space of the target.
(Task_Storage_Size): Remove unused type.

gcc/testsuite/

* gnat.dg/sec_stack1.adb: New testcase.

From-SVN: r260742

gcc/ada/ChangeLog
gcc/ada/libgnat/s-parame.ads
gcc/ada/libgnat/s-parame__ae653.ads
gcc/ada/libgnat/s-parame__hpux.ads
gcc/ada/libgnat/s-parame__vxworks.ads
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/sec_stack1.adb [new file with mode: 0644]

index 66b84916ed97000f85f240b6bd79e8a8b6a2a69e..4c6dd1fa1ecb2f36982ccff005bd35425164ba3a 100644 (file)
@@ -1,3 +1,10 @@
+2018-05-25  Patrick Bernardi  <bernardi@adacore.com>
+
+       * libgnat/s-parame.ads, libgnat/s-parame__vxworks.ads,
+       libgnat/s-parame__ae653.ads, libgnat/s-parame__hpux.ads (Size_Type):
+       Expand range of type to match the address space of the target.
+       (Task_Storage_Size): Remove unused type.
+
 2018-05-25  Ed Schonberg  <schonberg@adacore.com>
 
        * sem_res.adb (Set_Mixed_Mode_Operand): If the operand is an expression
index ead178a74805aa477b45f506037028edc628a69a..4e9e81fb45dc38c7578283ef5fa7b720d6609679 100644 (file)
@@ -55,11 +55,14 @@ package System.Parameters is
    -- Task And Stack Allocation Control --
    ---------------------------------------
 
-   type Task_Storage_Size is new Integer;
-   --  Type used in tasking units for task storage size
-
-   type Size_Type is new Task_Storage_Size;
-   --  Type used to provide task storage size to runtime
+   type Size_Type is range
+     -(2 ** (Integer'(Standard'Address_Size) - 1)) ..
+     +(2 ** (Integer'(Standard'Address_Size) - 1)) - 1;
+   --  Type used to provide task stack sizes to the runtime. Sized to permit
+   --  stack sizes of up to half the total addressable memory space. This may
+   --  seem excessively large (even for 32-bit systems), however there are many
+   --  instances of users requiring large stack sizes (for example string
+   --  processing).
 
    Unspecified_Size : constant Size_Type := Size_Type'First;
    --  Value used to indicate that no size type is set
index c15f0ebfda4b77939ed6ad616096bff6bc2d2539..e3acbad48c380d8bee06684483a11172ba49755d 100644 (file)
@@ -53,11 +53,14 @@ package System.Parameters is
    -- Task And Stack Allocation Control --
    ---------------------------------------
 
-   type Task_Storage_Size is new Integer;
-   --  Type used in tasking units for task storage size
-
-   type Size_Type is new Task_Storage_Size;
-   --  Type used to provide task storage size to runtime
+   type Size_Type is range
+     -(2 ** (Integer'(Standard'Address_Size) - 1)) ..
+     +(2 ** (Integer'(Standard'Address_Size) - 1)) - 1;
+   --  Type used to provide task stack sizes to the runtime. Sized to permit
+   --  stack sizes of up to half the total addressable memory space. This may
+   --  seem excessively large (even for 32-bit systems), however there are many
+   --  instances of users requiring large stack sizes (for example string
+   --  processing).
 
    Unspecified_Size : constant Size_Type := Size_Type'First;
    --  Value used to indicate that no size type is set
index df16d0be627709fe2e858f22eee2632aed54f3e5..dfd0e086e6701c05815a1574435e1d4768023fa8 100644 (file)
@@ -53,11 +53,14 @@ package System.Parameters is
    -- Task And Stack Allocation Control --
    ---------------------------------------
 
-   type Task_Storage_Size is new Integer;
-   --  Type used in tasking units for task storage size
-
-   type Size_Type is new Task_Storage_Size;
-   --  Type used to provide task storage size to runtime
+   type Size_Type is range
+     -(2 ** (Integer'(Standard'Address_Size) - 1)) ..
+     +(2 ** (Integer'(Standard'Address_Size) - 1)) - 1;
+   --  Type used to provide task stack sizes to the runtime. Sized to permit
+   --  stack sizes of up to half the total addressable memory space. This may
+   --  seem excessively large (even for 32-bit systems), however there are many
+   --  instances of users requiring large stack sizes (for example string
+   --  processing).
 
    Unspecified_Size : constant Size_Type := Size_Type'First;
    --  Value used to indicate that no size type is set
index 9bdca23ec344bb5ccc6cad2e5130125aa8b7587a..cfab9f7772871c6f1452aa63f5df2f537de40a0c 100644 (file)
@@ -53,11 +53,14 @@ package System.Parameters is
    -- Task And Stack Allocation Control --
    ---------------------------------------
 
-   type Task_Storage_Size is new Integer;
-   --  Type used in tasking units for task storage size
-
-   type Size_Type is new Task_Storage_Size;
-   --  Type used to provide task storage size to runtime
+   type Size_Type is range
+     -(2 ** (Integer'(Standard'Address_Size) - 1)) ..
+     +(2 ** (Integer'(Standard'Address_Size) - 1)) - 1;
+   --  Type used to provide task stack sizes to the runtime. Sized to permit
+   --  stack sizes of up to half the total addressable memory space. This may
+   --  seem excessively large (even for 32-bit systems), however there are many
+   --  instances of users requiring large stack sizes (for example string
+   --  processing).
 
    Unspecified_Size : constant Size_Type := Size_Type'First;
    --  Value used to indicate that no size type is set
index 2b2695e8c75e429ad3db2e5db9619c5e3ca42961..bcf7b51cee60c0e131d9189eb64ec290a5c4cc54 100644 (file)
@@ -1,3 +1,7 @@
+2018-05-25  Patrick Bernardi  <bernardi@adacore.com>
+
+       * gnat.dg/sec_stack1.adb: New testcase.
+
 2018-05-25  Ed Schonberg  <schonberg@adacore.com>
 
        * gnat.dg/fixedpnt4.adb: New testcase.
diff --git a/gcc/testsuite/gnat.dg/sec_stack1.adb b/gcc/testsuite/gnat.dg/sec_stack1.adb
new file mode 100644 (file)
index 0000000..4caeafe
--- /dev/null
@@ -0,0 +1,26 @@
+--  { dg-do run }
+--
+--  This test checks that we can allocate more than 2GB on systems with word
+--  sizes larger than 32-bits
+
+with Ada.Strings.Fixed; use Ada.Strings.Fixed;
+
+procedure Sec_Stack1 is
+   function Get_A_Big_String return String;
+   --  Return a very close to 2GB string on the secondary stack that would
+   --  overflow the secondary stack if we still had a 2GB limit.
+
+   function Get_A_Big_String return String is
+      String_Size : constant Natural := Natural'Last;
+   begin
+      return String_Size * 'a';
+   end Get_A_Big_String;
+
+begin
+   --  This test only works on systems with more than 32-bits
+   if Standard'Address_Size > 32 then
+      declare
+         R : String := Get_A_Big_String;
+      begin null; end;
+   end if;
+end Sec_Stack1;