OSDN Git Service

PR 18067
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 19 Dec 2004 21:08:33 +0000 (21:08 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 19 Dec 2004 21:08:33 +0000 (21:08 +0000)
        * stor-layout.c (variable_size): Force creation of a SAVE_EXPR.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@92389 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/stor-layout.c
gcc/testsuite/gcc.dg/debug/20041219-1.c [new file with mode: 0644]

index c3ee48f..cf2c8f5 100644 (file)
@@ -1,3 +1,8 @@
+2004-12-19  Richard Henderson  <rth@redhat.com>
+
+       PR 18067
+       * stor-layout.c (variable_size): Force creation of a SAVE_EXPR.
+
 2003-12-19  Steven Bosscher  <stevenb@suse.de>
 
        * config/i386/i386.c (ix86_split_to_parts): Use an array with
index 6b78fa6..7069ad9 100644 (file)
@@ -125,11 +125,19 @@ variable_size (tree size)
      just return SIZE unchanged.  Likewise for self-referential sizes and
      constant sizes.  */
   if (TREE_CONSTANT (size)
+      || TREE_CODE (size) == SAVE_EXPR
       || lang_hooks.decls.global_bindings_p () < 0
       || CONTAINS_PLACEHOLDER_P (size))
     return size;
 
-  size = save_expr (size);
+  /* Force creation of a SAVE_EXPR.  This solves (1) code duplication 
+     problems between parent and nested functions that occasionally can't
+     be cleaned up because of portions of the expression escaping the
+     parent function via the FRAME object, and (2) tree sharing problems
+     between the type system and the gimple code, which can leak SSA_NAME
+     objects into e.g. TYPE_SIZE, which cause heartburn when emitting
+     debug information.  */
+  size = build1 (SAVE_EXPR, TREE_TYPE (size), size);
 
   /* If an array with a variable number of elements is declared, and
      the elements require destruction, we will emit a cleanup for the
diff --git a/gcc/testsuite/gcc.dg/debug/20041219-1.c b/gcc/testsuite/gcc.dg/debug/20041219-1.c
new file mode 100644 (file)
index 0000000..6a62bb9
--- /dev/null
@@ -0,0 +1,8 @@
+/* PR 18067 */
+/* { dg-do compile } */
+
+void foo(int i)
+{
+    const int j=i+1;
+    int a[1][j*j];
+}