re PR c/12818 (-fwritable strings triggers bad code generation)
authorEric Botcazou <ebotcazou@libertysurf.fr>
Fri, 30 Jan 2004 14:16:43 +0000 (15:16 +0100)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 30 Jan 2004 14:16:43 +0000 (14:16 +0000)
PR c/12818
* varasm.c (const_hash_1) <STRING_CST>: Use the
address to compute the hash value if flag_writable_strings.
(compare_constant) <STRING_CST>: Compare the addresses
if flag_writable_strings.
(build_constant_desc): Do not copy the expression for a
STRING_CST if flag_writable_strings.

From-SVN: r76958

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/fwritable-strings-1.c [new file with mode: 0644]
gcc/varasm.c

index 55bc44157e125262eaef5e55250d56ed28f1d924..834142a7f64b8ab037a47be459b82fcf5b3b51ac 100644 (file)
@@ -1,3 +1,13 @@
+2004-01-30  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       PR c/12818
+       * varasm.c (const_hash_1) <STRING_CST>: Use the
+       address to compute the hash value if flag_writable_strings.
+       (compare_constant) <STRING_CST>: Compare the addresses
+       if flag_writable_strings.
+       (build_constant_desc): Do not copy the expression for a
+       STRING_CST if flag_writable_strings.
+
 2004-01-30  Jan Hubicka  <jh@suse.cz>
 
        * alloc-pool.c: Include hashtab.h
index e00e0742e7f72193faf0889dae2e60e39d0cd1ad..4f95129b9e99fbce0b716ef0b00660dc48246759 100644 (file)
@@ -1,3 +1,7 @@
+2004-01-30  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       * gcc.dg/fwritable-strings-1.c: New test.
+
 2004-01-30  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        * gcc.c-torture/compile/20040130-1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/fwritable-strings-1.c b/gcc/testsuite/gcc.dg/fwritable-strings-1.c
new file mode 100644 (file)
index 0000000..e519231
--- /dev/null
@@ -0,0 +1,17 @@
+/* PR c/12818 */
+/* Origin: <fnf@ninemoons.com> */
+
+/* { dg-do run } */
+/* { dg-options "-fwritable-strings" } */
+
+extern void abort(void);
+
+char *names[] = {"alice", "bob", "john"};
+
+int main (void)
+{
+  if (names[1][0] != 'b')
+    abort();
+
+  return 0;
+}
index e44d288dbc882b15f228fe33e32b2228026fc26d..7af71bf196f37e80b9379d4512b9f4bb229e503f 100644 (file)
@@ -2057,7 +2057,7 @@ struct rtx_const GTY(())
 
 /* Uniquize all constants that appear in memory.
    Each constant in memory thus far output is recorded
-   in `const_hash_table'.  */
+   in `const_desc_table'.  */
 
 struct constant_descriptor_tree GTY(())
 {
@@ -2104,9 +2104,18 @@ const_hash_1 (const tree exp)
       return real_hash (TREE_REAL_CST_PTR (exp));
 
     case STRING_CST:
-      p = TREE_STRING_POINTER (exp);
-      len = TREE_STRING_LENGTH (exp);
+      if (flag_writable_strings)
+       {
+         p = (char *) &exp;
+         len = sizeof exp;
+       }
+      else
+       {
+         p = TREE_STRING_POINTER (exp);
+         len = TREE_STRING_LENGTH (exp);
+       }
       break;
+
     case COMPLEX_CST:
       return (const_hash_1 (TREE_REALPART (exp)) * 5
              + const_hash_1 (TREE_IMAGPART (exp)));
@@ -2221,7 +2230,7 @@ compare_constant (const tree t1, const tree t2)
 
     case STRING_CST:
       if (flag_writable_strings)
-       return 0;
+       return t1 == t2;
 
       if (TYPE_MODE (TREE_TYPE (t1)) != TYPE_MODE (TREE_TYPE (t2)))
        return 0;
@@ -2425,7 +2434,10 @@ build_constant_desc (tree exp)
   struct constant_descriptor_tree *desc;
 
   desc = ggc_alloc (sizeof (*desc));
-  desc->value = copy_constant (exp);
+  if (flag_writable_strings && TREE_CODE (exp) == STRING_CST)
+    desc->value = exp;
+  else
+    desc->value = copy_constant (exp);
 
   /* Create a string containing the label name, in LABEL.  */
   labelno = const_labelno++;
@@ -2466,7 +2478,7 @@ build_constant_desc (tree exp)
    If DEFER is nonzero, this constant can be deferred and output only
    if referenced in the function after all optimizations.
 
-   The const_hash_table records which constants already have label strings.  */
+   `const_desc_table' records which constants already have label strings.  */
 
 rtx
 output_constant_def (tree exp, int defer)