aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config/ChangeLog4
-rw-r--r--config/bootstrap-lto.mk3
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/ada/ChangeLog5
-rw-r--r--gcc/ada/gnatvsn.adb15
-rw-r--r--gcc/tree-nested.c61
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);