Commit f036807a by Eric Botcazou Committed by Eric Botcazou

decl.c (gnat_to_gnu_entity): Force all local variables with aggregate types in…

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
parent d67f5bbb
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> 2013-10-13 Hristian Kirtchev <kirtchev@adacore.com>
* sem_prag.adb (Check_Mode): Do * sem_prag.adb (Check_Mode): Do
......
...@@ -1497,7 +1497,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition) ...@@ -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, /* 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 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 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. */ debugger through the PARM_DECL. */
if (kind == E_Out_Parameter if (kind == E_Out_Parameter
&& definition && definition
...@@ -1520,7 +1520,7 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int 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 /* 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 register it if we are at the global level. Note that an external
constant is at the global level. */ 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); SET_DECL_RENAMED_OBJECT (gnu_decl, renamed_obj);
if ((!definition && kind == E_Constant) || global_bindings_p ()) 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) ...@@ -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))) && Has_Nested_Block_With_Handler (Scope (gnat_entity)))
TREE_ADDRESSABLE (gnu_decl) = 1; 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 /* 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 fixed size that will be dynamically allocated, and we are using the
setjmp/longjmp exception mechanism, update the setjmp buffer. */ setjmp/longjmp exception mechanism, update the setjmp buffer. */
......
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> 2013-10-13 Richard Biener <rguenther@suse.de>
* gcc.c-torture/execute/pr58662.c: New test. * gcc.c-torture/execute/pr58662.c: New test.
......
-- { 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;
package Uninit_Array is
function F2 return Integer;
end Uninit_Array;
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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment