decl.c (gnat_to_gnu_entity): Force all local variables with aggregate types in memory if not optimizing.

* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Force all local
	variables with aggregate types in memory if not optimizing.

From-SVN: r203507
This commit is contained in:
Eric Botcazou 2013-10-13 17:20:58 +00:00 committed by Eric Botcazou
parent d67f5bbb91
commit f036807af8
6 changed files with 63 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2013-10-13 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <object>: Force all local
variables with aggregate types in memory if not optimizing.
2013-10-13 Hristian Kirtchev <kirtchev@adacore.com>
* sem_prag.adb (Check_Mode): Do

View File

@ -1497,7 +1497,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
/* If we are defining an Out parameter and optimization isn't enabled,
create a fake PARM_DECL for debugging purposes and make it point to
the VAR_DECL. Suppress debug info for the latter but make sure it
will live on the stack so that it can be accessed from within the
will live in memory so that it can be accessed from within the
debugger through the PARM_DECL. */
if (kind == E_Out_Parameter
&& definition
@ -1520,7 +1520,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
/* If this is a renaming pointer, attach the renamed object to it and
register it if we are at the global level. Note that an external
constant is at the global level. */
else if (TREE_CODE (gnu_decl) == VAR_DECL && renamed_obj)
if (TREE_CODE (gnu_decl) == VAR_DECL && renamed_obj)
{
SET_DECL_RENAMED_OBJECT (gnu_decl, renamed_obj);
if ((!definition && kind == E_Constant) || global_bindings_p ())
@ -1579,6 +1579,19 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
&& Has_Nested_Block_With_Handler (Scope (gnat_entity)))
TREE_ADDRESSABLE (gnu_decl) = 1;
/* If this is a local variable with non-BLKmode and aggregate type,
and optimization isn't enabled, then force it in memory so that
a register won't be allocated to it with possible subparts left
uninitialized and reaching the register allocator. */
else if (TREE_CODE (gnu_decl) == VAR_DECL
&& !DECL_EXTERNAL (gnu_decl)
&& !TREE_STATIC (gnu_decl)
&& DECL_MODE (gnu_decl) != BLKmode
&& AGGREGATE_TYPE_P (TREE_TYPE (gnu_decl))
&& !TYPE_IS_FAT_POINTER_P (TREE_TYPE (gnu_decl))
&& !optimize)
TREE_ADDRESSABLE (gnu_decl) = 1;
/* If we are defining an object with variable size or an object with
fixed size that will be dynamically allocated, and we are using the
setjmp/longjmp exception mechanism, update the setjmp buffer. */

View File

@ -1,3 +1,8 @@
2013-10-13 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/uninit_array.ad[sn]: New test.
* gnat.dg/uninit_array_pkg.ads: New helper.
2013-10-13 Richard Biener <rguenther@suse.de>
* gcc.c-torture/execute/pr58662.c: New test.

View File

@ -0,0 +1,22 @@
-- { dg-do compile }
-- { dg-options "-gnatws" }
with Uninit_Array_Pkg; use Uninit_Array_Pkg;
package body Uninit_Array is
function F1 return Integer;
pragma Inline_Always (F1);
function F1 return Integer is
Var : Arr;
begin
return F (Var(Var'First(1)));
end;
function F2 return Integer is
begin
return F1;
end;
end Uninit_Array;

View File

@ -0,0 +1,5 @@
package Uninit_Array is
function F2 return Integer;
end Uninit_Array;

View File

@ -0,0 +1,11 @@
package Uninit_Array_Pkg Is
type Rec is record
B1, B2, B3, B4: Boolean;
end record;
type Arr is array (Boolean) of Rec;
function F (R : Rec) return Integer;
end Uninit_Array_Pkg;