This patch fixes an obscure bug that causes the secondary stack to be used before it is initialized in certain cases. This can only happen if (1) the -gnatE switch is used to disable the static elaboration mode, (2) the -p switch is passed to gnatbind to tell it to choose a pessimistic (worst-case) elaboration order, and (3) gnatbind happens to choose an order in which the body of System.Tasking.Protected_Objects is elaborated before the body of System.Secondary_Stack.
Tested on x86_64-pc-linux-gnu, committed on trunk 2014-06-13 Bob Duff <d...@adacore.com> * s-solita.adb (Get_Sec_Stack_Addr, Init_Tasking_Soft_Links): Add assertions requiring the secondary stack to be initialized. * s-solita.ads (Init_Tasking_Soft_Links): Comment. * s-taprob.adb, s-tarest.adb, s-tasini.adb (elab code): Make sure the secondary stack is initialized before calling Init_Tasking_Soft_Links, by adding pragmas Elaborate_Body.
Index: s-tasini.adb =================================================================== --- s-tasini.adb (revision 211609) +++ s-tasini.adb (working copy) @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1992-2013, Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2014, Free Software Foundation, Inc. -- -- -- -- GNARL is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -47,6 +47,11 @@ with System.Tasking.Debug; with System.Parameters; +with System.Secondary_Stack; pragma Elaborate_All (System.Secondary_Stack); +pragma Unreferenced (System.Secondary_Stack); +-- Make sure the body of Secondary_Stack is elaborated before calling +-- Init_Tasking_Soft_Links. + package body System.Tasking.Initialization is package STPO renames System.Task_Primitives.Operations; Index: s-tarest.adb =================================================================== --- s-tarest.adb (revision 211609) +++ s-tarest.adb (working copy) @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1999-2013, Free Software Foundation, Inc. -- +-- Copyright (C) 1999-2014, Free Software Foundation, Inc. -- -- -- -- GNARL is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -47,9 +47,12 @@ with System.Task_Primitives.Operations; with System.Soft_Links.Tasking; -with System.Secondary_Stack; with System.Storage_Elements; +with System.Secondary_Stack; pragma Elaborate_All (System.Secondary_Stack); +-- Make sure the body of Secondary_Stack is elaborated before calling +-- Init_Tasking_Soft_Links. + with System.Soft_Links; -- Used for the non-tasking routines (*_NT) that refer to global data. They -- are needed here before the tasking run time has been elaborated. used for Index: s-taprob.adb =================================================================== --- s-taprob.adb (revision 211609) +++ s-taprob.adb (working copy) @@ -7,7 +7,7 @@ -- B o d y -- -- -- -- Copyright (C) 1991-1994, Florida State University -- --- Copyright (C) 1995-2011, AdaCore -- +-- Copyright (C) 1995-2014, AdaCore -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -38,6 +38,10 @@ with System.Parameters; with System.Traces; with System.Soft_Links.Tasking; +with System.Secondary_Stack; pragma Elaborate_All (System.Secondary_Stack); +pragma Unreferenced (System.Secondary_Stack); +-- Make sure the body of Secondary_Stack is elaborated before calling +-- Init_Tasking_Soft_Links. package body System.Tasking.Protected_Objects is Index: s-solita.adb =================================================================== --- s-solita.adb (revision 211609) +++ s-solita.adb (working copy) @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 2004-2013, Free Software Foundation, Inc. -- +-- Copyright (C) 2004-2014, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -95,7 +95,11 @@ function Get_Sec_Stack_Addr return Address is begin - return STPO.Self.Common.Compiler_Data.Sec_Stack_Addr; + return Result : constant Address := + STPO.Self.Common.Compiler_Data.Sec_Stack_Addr + do + pragma Assert (Result /= Null_Address); + end return; end Get_Sec_Stack_Addr; function Get_Stack_Info return Stack_Checking.Stack_Access is @@ -222,6 +226,8 @@ SSL.Set_Sec_Stack_Addr (SSL.Get_Sec_Stack_Addr_NT); SSL.Set_Jmpbuf_Address (SSL.Get_Jmpbuf_Address_NT); end if; + + pragma Assert (Get_Sec_Stack_Addr /= Null_Address); end Init_Tasking_Soft_Links; end System.Soft_Links.Tasking; Index: s-solita.ads =================================================================== --- s-solita.ads (revision 211609) +++ s-solita.ads (working copy) @@ -6,7 +6,7 @@ -- -- -- S p e c -- -- -- --- Copyright (C) 2009, Free Software Foundation, Inc. -- +-- Copyright (C) 2009-2014, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -38,6 +38,7 @@ procedure Init_Tasking_Soft_Links; -- Set the tasking soft links that are common to the full and the - -- restricted run times. + -- restricted run times. Clients need to make sure the body of + -- System.Secondary_Stack is elaborated before calling this. end System.Soft_Links.Tasking;