diff options
-rw-r--r-- | config/ChangeLog | 4 | ||||
-rw-r--r-- | config/bootstrap-lto.mk | 3 | ||||
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ada/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/ada/gnatvsn.adb | 15 | ||||
-rw-r--r-- | gcc/tree-nested.c | 61 |
6 files changed, 62 insertions, 31 deletions
diff --git a/config/ChangeLog b/config/ChangeLog index 8e673f7..8e98f6d 100644 --- a/config/ChangeLog +++ b/config/ChangeLog @@ -1,3 +1,7 @@ +2010-11-27 Eric Botcazou <ebotcazou@adacore.com> + + * bootstrap-lto.mk (BOOT_ADAFLAGS): Delete. + 2010-11-19 Tobias Grosser <grosser@fim.uni-passau.de> * cloog.m4: Use AS_HELP_STRING and fix help formatting. diff --git a/config/bootstrap-lto.mk b/config/bootstrap-lto.mk index b30ac1a..59e5c98 100644 --- a/config/bootstrap-lto.mk +++ b/config/bootstrap-lto.mk @@ -3,6 +3,3 @@ STAGE2_CFLAGS += -flto=jobserver -fuse-linker-plugin -frandom-seed=1 STAGE3_CFLAGS += -flto=jobserver -fuse-linker-plugin -frandom-seed=1 - -# Ada fails to build with LTO, turn it off for now. -BOOT_ADAFLAGS += -fno-lto diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e82364f..faf40b1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-11-27 Eric Botcazou <ebotcazou@adacore.com> + + * tree-nested.c (remap_vla_decls): Fully expand value expressions of + VLA variables. + 2010-11-27 Richard Guenther <rguenther@suse.de> * gimple.c (gimple_assign_copy_p): Use gimple_assign_single_p. diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index b1a8da7c..24e3615 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2010-11-27 Eric Botcazou <ebotcazou@adacore.com> + + * gnatvsn.adb (Version_String): Change type to C-like array of chars. + (Gnat_Version_String): Adjust to above change. + 2010-11-18 Eric Botcazou <ebotcazou@adacore.com> * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Subprogram_Type>: Also diff --git a/gcc/ada/gnatvsn.adb b/gcc/ada/gnatvsn.adb index b0428a9..34f72e7 100644 --- a/gcc/ada/gnatvsn.adb +++ b/gcc/ada/gnatvsn.adb @@ -53,9 +53,10 @@ package body Gnatvsn is " FOR A PARTICULAR PURPOSE."; end Gnat_Free_Software; - Version_String : String (1 .. Ver_Len_Max); + type char_array is array (Natural range <>) of aliased Character; + Version_String : char_array (0 .. Ver_Len_Max - 1); -- Import the C string defined in the (language-independent) source file - -- version.c. + -- version.c using the zero-based convention of the C language. -- The size is not the real one, which does not matter since we will -- check for the nul character in Gnat_Version_String. pragma Import (C, Version_String, "version_string"); @@ -65,15 +66,17 @@ package body Gnatvsn is ------------------------- function Gnat_Version_String return String is - NUL_Pos : Positive := 1; + S : String (1 .. Ver_Len_Max); + Pos : Natural := 0; begin loop - exit when Version_String (NUL_Pos) = ASCII.NUL; + exit when Version_String (Pos) = ASCII.NUL; - NUL_Pos := NUL_Pos + 1; + S (Pos + 1) := Version_String (Pos); + Pos := Pos + 1; end loop; - return Version_String (1 .. NUL_Pos - 1); + return S (1 .. Pos); end Gnat_Version_String; end Gnatvsn; diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c index b7bf9ed..cebaf07 100644 --- a/gcc/tree-nested.c +++ b/gcc/tree-nested.c @@ -2192,18 +2192,21 @@ remap_vla_decls (tree block, struct nesting_info *root) remap_vla_decls (subblock, root); for (var = BLOCK_VARS (block); var; var = DECL_CHAIN (var)) - { - if (TREE_CODE (var) == VAR_DECL - && variably_modified_type_p (TREE_TYPE (var), NULL) - && DECL_HAS_VALUE_EXPR_P (var)) - { - type = TREE_TYPE (var); - val = DECL_VALUE_EXPR (var); - if (walk_tree (&type, contains_remapped_vars, root, NULL) != NULL - || walk_tree (&val, contains_remapped_vars, root, NULL) != NULL) - break; - } - } + if (TREE_CODE (var) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (var)) + { + val = DECL_VALUE_EXPR (var); + type = TREE_TYPE (var); + + if (!(TREE_CODE (val) == INDIRECT_REF + && TREE_CODE (TREE_OPERAND (val, 0)) == VAR_DECL + && variably_modified_type_p (type, NULL))) + continue; + + if (pointer_map_contains (root->var_map, TREE_OPERAND (val, 0)) + || walk_tree (&type, contains_remapped_vars, root, NULL)) + break; + } + if (var == NULL_TREE) return; @@ -2213,17 +2216,22 @@ remap_vla_decls (tree block, struct nesting_info *root) id.root = root; for (; var; var = DECL_CHAIN (var)) - if (TREE_CODE (var) == VAR_DECL - && variably_modified_type_p (TREE_TYPE (var), NULL) - && DECL_HAS_VALUE_EXPR_P (var)) + if (TREE_CODE (var) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (var)) { struct nesting_info *i; - tree newt, t, context; + tree newt, context; + void **slot; - t = type = TREE_TYPE (var); val = DECL_VALUE_EXPR (var); - if (walk_tree (&type, contains_remapped_vars, root, NULL) == NULL - && walk_tree (&val, contains_remapped_vars, root, NULL) == NULL) + type = TREE_TYPE (var); + + if (!(TREE_CODE (val) == INDIRECT_REF + && TREE_CODE (TREE_OPERAND (val, 0)) == VAR_DECL + && variably_modified_type_p (type, NULL))) + continue; + + slot = pointer_map_contains (root->var_map, TREE_OPERAND (val, 0)); + if (!slot && !walk_tree (&type, contains_remapped_vars, root, NULL)) continue; context = decl_function_context (var); @@ -2234,6 +2242,15 @@ remap_vla_decls (tree block, struct nesting_info *root) if (i == NULL) continue; + /* Fully expand value expressions. This avoids having debug variables + only referenced from them and that can be swept during GC. */ + if (slot) + { + tree t = (tree) *slot; + gcc_assert (DECL_P (t) && DECL_HAS_VALUE_EXPR_P (t)); + val = build1 (INDIRECT_REF, TREE_TYPE (val), DECL_VALUE_EXPR (t)); + } + id.cb.src_fn = i->context; id.cb.dst_fn = i->context; id.cb.src_cfun = DECL_STRUCT_FUNCTION (root->context); @@ -2242,13 +2259,13 @@ remap_vla_decls (tree block, struct nesting_info *root) while (POINTER_TYPE_P (newt) && !TYPE_NAME (newt)) { newt = TREE_TYPE (newt); - t = TREE_TYPE (t); + type = TREE_TYPE (type); } if (TYPE_NAME (newt) && TREE_CODE (TYPE_NAME (newt)) == TYPE_DECL && DECL_ORIGINAL_TYPE (TYPE_NAME (newt)) - && newt != t - && TYPE_NAME (newt) == TYPE_NAME (t)) + && newt != type + && TYPE_NAME (newt) == TYPE_NAME (type)) TYPE_NAME (newt) = remap_decl (TYPE_NAME (newt), &id.cb); walk_tree (&val, copy_tree_body_r, &id.cb, NULL); |