diff mbox series

[Ada] Remove 2GB secondary stack limit for 64-bit processors

Message ID 20180525090821.GA34895@adacore.com
State New
Headers show
Series [Ada] Remove 2GB secondary stack limit for 64-bit processors | expand

Commit Message

Pierre-Marie de Rodat May 25, 2018, 9:08 a.m. UTC
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.

Tested on x86_64-pc-linux-gnu, committed on trunk

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.
diff mbox series

Patch

--- gcc/ada/libgnat/s-parame.ads
+++ gcc/ada/libgnat/s-parame.ads
@@ -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

--- gcc/ada/libgnat/s-parame__ae653.ads
+++ gcc/ada/libgnat/s-parame__ae653.ads
@@ -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

--- gcc/ada/libgnat/s-parame__hpux.ads
+++ gcc/ada/libgnat/s-parame__hpux.ads
@@ -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

--- gcc/ada/libgnat/s-parame__vxworks.ads
+++ gcc/ada/libgnat/s-parame__vxworks.ads
@@ -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

--- /dev/null
new file mode 100644
+++ gcc/testsuite/gnat.dg/sec_stack1.adb
@@ -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;