diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2013-10-13 17:20:58 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2013-10-13 17:20:58 +0000 |
commit | f036807af8c8ac6a558066b16b697c2a475770e9 (patch) | |
tree | c45a8f551c60e4fa10a2ccc89a5b0e8a78710df6 /gcc/ada/gcc-interface/decl.c | |
parent | d67f5bbb91c2919672cf9dade30312fc331ffbb3 (diff) | |
download | gcc-f036807af8c8ac6a558066b16b697c2a475770e9.zip gcc-f036807af8c8ac6a558066b16b697c2a475770e9.tar.gz gcc-f036807af8c8ac6a558066b16b697c2a475770e9.tar.bz2 |
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
Diffstat (limited to 'gcc/ada/gcc-interface/decl.c')
-rw-r--r-- | gcc/ada/gcc-interface/decl.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c index 6b1e2a5..57dfff1 100644 --- a/gcc/ada/gcc-interface/decl.c +++ b/gcc/ada/gcc-interface/decl.c @@ -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. */ |