re PR pch/13361 (const wchar_t * strings not stored in pch)
authorGeoffrey Keating <geoffk@apple.com>
Sat, 18 Sep 2004 05:50:52 +0000 (05:50 +0000)
committerGeoffrey Keating <geoffk@gcc.gnu.org>
Sat, 18 Sep 2004 05:50:52 +0000 (05:50 +0000)
* tree-inline.c (copy_tree_r): Don't duplicate constants, they're
shared anyway.

PR pch/13361
* c-typeck.c (constructor_asmspec): Delete.
(struct initializer_stack): Delete field 'asmspec'.
(start_init): Delete saving of asmspec.
(finish_init): Don't update constructor_asmspec.
* dwarf2out.c (rtl_for_decl_location): Duplicate string from tree.
* stmt.c (expand_asm): Duplicate strings from tree.
(expand_asm_operands): Likewise.
* tree.c (tree_size): Update computation of size of STRING_CST.
(make_node): Don't make STRING_CST nodes.
(build_string): Allocate string with tree node.
(tree_code_size): Clean up assertions, don't allow requests
for "the size of a STRING_CST".
* tree.def (STRING_CST): Update comment.
* tree.h (TREE_STRING_POINTER): Adjust for change to STRING_CST.
(tree_string): Place contents of string in tree node.
* config/sh/sh.c (sh_handle_sp_switch_attribute): Duplicate string
from tree.

From-SVN: r87695

14 files changed:
gcc/ChangeLog
gcc/c-typeck.c
gcc/config/sh/sh.c
gcc/cp/ChangeLog
gcc/cp/lex.c
gcc/dwarf2out.c
gcc/stmt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pch/wchar-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/pch/wchar-1.Hs [new file with mode: 0644]
gcc/tree-inline.c
gcc/tree.c
gcc/tree.def
gcc/tree.h

index 65cc2e1a05a60d5619214d41be2c67ca64cbf37d..1e3efe309d1d2f2c2e860829ae8e144661526d53 100644 (file)
@@ -1,3 +1,27 @@
+2004-09-17  Geoffrey Keating  <geoffk@apple.com>
+
+       * tree-inline.c (copy_tree_r): Don't duplicate constants, they're
+       shared anyway.
+
+       PR pch/13361
+       * c-typeck.c (constructor_asmspec): Delete.
+       (struct initializer_stack): Delete field 'asmspec'.
+       (start_init): Delete saving of asmspec.
+       (finish_init): Don't update constructor_asmspec.
+       * dwarf2out.c (rtl_for_decl_location): Duplicate string from tree.
+       * stmt.c (expand_asm): Duplicate strings from tree.
+       (expand_asm_operands): Likewise.
+       * tree.c (tree_size): Update computation of size of STRING_CST.
+       (make_node): Don't make STRING_CST nodes.
+       (build_string): Allocate string with tree node.
+       (tree_code_size): Clean up assertions, don't allow requests
+       for "the size of a STRING_CST".
+       * tree.def (STRING_CST): Update comment.
+       * tree.h (TREE_STRING_POINTER): Adjust for change to STRING_CST.
+       (tree_string): Place contents of string in tree node.
+       * config/sh/sh.c (sh_handle_sp_switch_attribute): Duplicate string
+       from tree.
+
 2004-09-17  Zack Weinberg  <zack@codesourcery.com>
 
        * Makefile.in (c-parse.o): Depend on $(C_PRAGMA_H).
index 5ec00aa4250eca08c386afd619d0ec6d3fb87b1c..c00b9ec4a616b848395000beb9d594d52e427af7 100644 (file)
@@ -4319,9 +4319,6 @@ int constructor_no_implicit = 0; /* 0 for C; 1 for some other languages.  */
    such as (struct foo) {...}.  */
 static tree constructor_decl;
 
-/* start_init saves the ASMSPEC arg here for really_start_incremental_init.  */
-static const char *constructor_asmspec;
-
 /* Nonzero if this is an initializer for a top-level decl.  */
 static int constructor_top_level;
 
@@ -4393,7 +4390,6 @@ struct initializer_stack
 {
   struct initializer_stack *next;
   tree decl;
-  const char *asmspec;
   struct constructor_stack *constructor_stack;
   struct constructor_range_stack *constructor_range_stack;
   tree elements;
@@ -4410,17 +4406,12 @@ struct initializer_stack *initializer_stack;
 /* Prepare to parse and output the initializer for variable DECL.  */
 
 void
-start_init (tree decl, tree asmspec_tree, int top_level)
+start_init (tree decl, tree asmspec_tree ATTRIBUTE_UNUSED, int top_level)
 {
   const char *locus;
-  struct initializer_stack *p = XNEW (struct initializer_stack);
-  const char *asmspec = 0;
-
-  if (asmspec_tree)
-    asmspec = TREE_STRING_POINTER (asmspec_tree);
+  struct initializer_stack *p = xmalloc (sizeof (struct initializer_stack));
 
   p->decl = constructor_decl;
-  p->asmspec = constructor_asmspec;
   p->require_constant_value = require_constant_value;
   p->require_constant_elements = require_constant_elements;
   p->constructor_stack = constructor_stack;
@@ -4434,7 +4425,6 @@ start_init (tree decl, tree asmspec_tree, int top_level)
   initializer_stack = p;
 
   constructor_decl = decl;
-  constructor_asmspec = asmspec;
   constructor_designated = 0;
   constructor_top_level = top_level;
 
@@ -4490,7 +4480,6 @@ finish_init (void)
   free (spelling_base);
 
   constructor_decl = p->decl;
-  constructor_asmspec = p->asmspec;
   require_constant_value = p->require_constant_value;
   require_constant_elements = p->require_constant_elements;
   constructor_stack = p->constructor_stack;
index ce4ee857a89a2f49d298a45c337926be94cebc6b..c7d158cfeb65aad084d0e0587375815d3eb3703f 100644 (file)
@@ -7161,8 +7161,8 @@ sh_handle_sp_switch_attribute (tree *node, tree name, tree args,
     }
   else
     {
-      sp_switch = gen_rtx_SYMBOL_REF (VOIDmode,
-                                     TREE_STRING_POINTER (TREE_VALUE (args)));
+      char *s = ggc_strdup (TREE_STRING_POINTER (TREE_VALUE (args)));
+      sp_switch = gen_rtx_SYMBOL_REF (VOIDmode, s);
     }
 
   return NULL_TREE;
index be9b0d33688bad90eb89058ea9d0d534362b76f1..2cf1f74db8708ea186b5670957b1e827a6c05877 100644 (file)
@@ -1,3 +1,9 @@
+2004-09-16  Geoffrey Keating  <geoffk@apple.com>
+
+       PR pch/13361
+       * cp/lex.c (handle_pragma_interface): Duplicate string from tree.
+       (handle_pragma_implementation): Likewise.
+
 2004-09-17  Jeffrey D. Oldham  <oldham@codesourcery.com>
            Zack Weinberg  <zack@codesourcery.com>
 
index 4fa1645d6a2ed8d69ffc9d47428fa326d9b6dc79..c7b1cf6e12f4945fd1b798ddb6e0120dbafe7aa0 100644 (file)
@@ -471,7 +471,7 @@ handle_pragma_interface (cpp_reader* dfile ATTRIBUTE_UNUSED )
   else if (fname == 0)
     main_filename = lbasename (input_filename);
   else
-    main_filename = TREE_STRING_POINTER (fname);
+    main_filename = ggc_strdup (TREE_STRING_POINTER (fname));
 
   finfo = get_fileinfo (input_filename);
 
@@ -519,7 +519,7 @@ handle_pragma_implementation (cpp_reader* dfile ATTRIBUTE_UNUSED )
     }
   else
     {
-      main_filename = TREE_STRING_POINTER (fname);
+      main_filename = ggc_strdup (TREE_STRING_POINTER (fname));
       if (cpp_included (parse_in, main_filename))
        warning ("#pragma implementation for %s appears after file is included",
                 main_filename);
index 51b3681a0bf4b1aed312757c5b2547aff137c2f3..e269629d9d2a94f8f1e1eba69accc526fe1ebcd9 100644 (file)
@@ -9889,7 +9889,8 @@ rtl_for_decl_location (tree decl)
                                   TREE_STRING_LENGTH (init) - 1) == 0
              && ((size_t) TREE_STRING_LENGTH (init)
                  == strlen (TREE_STRING_POINTER (init)) + 1))
-           rtl = gen_rtx_CONST_STRING (VOIDmode, TREE_STRING_POINTER (init));
+           rtl = gen_rtx_CONST_STRING (VOIDmode,
+                                       ggc_strdup (TREE_STRING_POINTER (init)));
        }
       /* If the initializer is something that we know will expand into an
         immediate RTL constant, expand it now.  Expanding anything else
index e5d094d5ae968014a48fa029717bd05cfbd9cf38..099c5e76f603c27554191846fe782d573b4d08f5 100644 (file)
@@ -267,7 +267,8 @@ expand_asm (tree string, int vol)
   if (TREE_CODE (string) == ADDR_EXPR)
     string = TREE_OPERAND (string, 0);
 
-  body = gen_rtx_ASM_INPUT (VOIDmode, TREE_STRING_POINTER (string));
+  body = gen_rtx_ASM_INPUT (VOIDmode,
+                           ggc_strdup (TREE_STRING_POINTER (string)));
 
   MEM_VOLATILE_P (body) = vol;
 
@@ -851,7 +852,7 @@ expand_asm_operands (tree string, tree outputs, tree inputs,
 
   body = gen_rtx_ASM_OPERANDS ((noutputs == 0 ? VOIDmode
                                : GET_MODE (output_rtx[0])),
-                              TREE_STRING_POINTER (string),
+                              ggc_strdup (TREE_STRING_POINTER (string)),
                               empty_string, 0, argvec, constraintvec,
                               locus);
 
@@ -932,7 +933,8 @@ expand_asm_operands (tree string, tree outputs, tree inputs,
       ASM_OPERANDS_INPUT (body, i) = op;
 
       ASM_OPERANDS_INPUT_CONSTRAINT_EXP (body, i)
-       = gen_rtx_ASM_INPUT (TYPE_MODE (type), constraints[i + noutputs]);
+       = gen_rtx_ASM_INPUT (TYPE_MODE (type), 
+                            ggc_strdup (constraints[i + noutputs]));
 
       if (decl_conflicts_with_clobbers_p (val, clobbered_regs))
        clobber_conflict_found = 1;
@@ -966,7 +968,7 @@ expand_asm_operands (tree string, tree outputs, tree inputs,
 
   if (noutputs == 1 && nclobbers == 0)
     {
-      ASM_OPERANDS_OUTPUT_CONSTRAINT (body) = constraints[0];
+      ASM_OPERANDS_OUTPUT_CONSTRAINT (body) = ggc_strdup (constraints[0]);
       emit_insn (gen_rtx_SET (VOIDmode, output_rtx[0], body));
     }
 
@@ -994,9 +996,9 @@ expand_asm_operands (tree string, tree outputs, tree inputs,
                           output_rtx[i],
                           gen_rtx_ASM_OPERANDS
                           (GET_MODE (output_rtx[i]),
-                           TREE_STRING_POINTER (string),
-                           constraints[i], i, argvec, constraintvec,
-                           locus));
+                           ggc_strdup (TREE_STRING_POINTER (string)),
+                           ggc_strdup (constraints[i]),
+                           i, argvec, constraintvec, locus));
 
          MEM_VOLATILE_P (SET_SRC (XVECEXP (body, 0, i))) = vol;
        }
index c9d44bbc529fbaff305eaccf0709fef07259d712..ddc44e64cdfb08aa48d516fc5f86b42e334f51c2 100644 (file)
@@ -1,3 +1,9 @@
+2004-09-16  Geoffrey Keating  <geoffk@apple.com>
+
+       PR pch/13361
+       * testsuite/g++.dg/pch/wchar-1.C: New.
+       * testsuite/g++.dg/pch/wchar-1.Hs: New.
+
 2004-09-17  Kenneth Zadeck  <Kenneth.Zadeck@NaturalBridge.com>
 
        * gcc.c-torture/execute/20040917-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/pch/wchar-1.C b/gcc/testsuite/g++.dg/pch/wchar-1.C
new file mode 100644 (file)
index 0000000..6cb5fe1
--- /dev/null
@@ -0,0 +1 @@
+#include "wchar-1.H"
diff --git a/gcc/testsuite/g++.dg/pch/wchar-1.Hs b/gcc/testsuite/g++.dg/pch/wchar-1.Hs
new file mode 100644 (file)
index 0000000..431908b
--- /dev/null
@@ -0,0 +1,2 @@
+#include <stddef.h>
+const wchar_t test_var[] = L"wide string";
index 707faaf75a3720ea491ba5d6e5120f8418160ff7..243b870cf7026b33cd1d6440f3d5f47c527daced 100644 (file)
@@ -2257,7 +2257,6 @@ copy_tree_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
 
   /* We make copies of most nodes.  */
   if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
-      || TREE_CODE_CLASS (code) == tcc_constant
       || code == TREE_LIST
       || code == TREE_VEC
       || code == TYPE_DECL)
@@ -2291,6 +2290,8 @@ copy_tree_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
     *walk_subtrees = 0;
   else if (TREE_CODE_CLASS (code) == tcc_declaration)
     *walk_subtrees = 0;
+  else if (TREE_CODE_CLASS (code) == tcc_constant)
+    *walk_subtrees = 0;
   else
     gcc_assert (code != STATEMENT_LIST);
   return NULL_TREE;
index 02d2ee9b0adda455ada96825ddddc9a08189b846..98ab92411f51e82c7f3eab0292d7651126b0c88a 100644 (file)
@@ -159,17 +159,12 @@ decl_assembler_name (tree decl)
   return DECL_CHECK (decl)->decl.assembler_name;
 }
 
-/* Compute the number of bytes occupied by a tree with code CODE.  This
-   function cannot be used for TREE_VEC or PHI_NODE codes, which are of
-   variable length.  */
+/* Compute the number of bytes occupied by a tree with code CODE.
+   This function cannot be used for TREE_VEC, PHI_NODE, or STRING_CST
+   codes, which are of variable length.  */
 size_t
 tree_code_size (enum tree_code code)
 {
-  /* We can't state the size of a TREE_VEC or PHI_NODE
-     without knowing how many elements it will have.  */
-  gcc_assert (code != TREE_VEC);
-  gcc_assert (code != PHI_NODE);
-
   switch (TREE_CODE_CLASS (code))
     {
     case tcc_declaration:  /* A decl node */
@@ -194,7 +189,7 @@ tree_code_size (enum tree_code code)
        case REAL_CST:          return sizeof (struct tree_real_cst);
        case COMPLEX_CST:       return sizeof (struct tree_complex);
        case VECTOR_CST:        return sizeof (struct tree_vector);
-       case STRING_CST:        return sizeof (struct tree_string);
+       case STRING_CST:        gcc_unreachable ();
        default:
          return lang_hooks.tree_size (code);
        }
@@ -208,7 +203,8 @@ tree_code_size (enum tree_code code)
        case ERROR_MARK:
        case PLACEHOLDER_EXPR:  return sizeof (struct tree_common);
 
-       case PHI_NODE:          
+       case TREE_VEC:
+       case PHI_NODE:          gcc_unreachable ();
 
        case SSA_NAME:          return sizeof (struct tree_ssa_name);
 
@@ -241,6 +237,9 @@ tree_size (tree node)
       return (sizeof (struct tree_vec)
              + (TREE_VEC_LENGTH (node) - 1) * sizeof(char *));
 
+    case STRING_CST:
+      return sizeof (struct tree_string) + TREE_STRING_LENGTH (node) - 1;
+
     default:
       return tree_code_size (code);
     }
@@ -719,10 +718,23 @@ build_real_from_int_cst (tree type, tree i)
 tree
 build_string (int len, const char *str)
 {
-  tree s = make_node (STRING_CST);
+  tree s;
+  size_t length;
+  
+  length = len + sizeof (struct tree_string);
+
+#ifdef GATHER_STATISTICS
+  tree_node_counts[(int) c_kind]++;
+  tree_node_sizes[(int) c_kind] += length;
+#endif  
+
+  s = ggc_alloc_tree (length);
 
+  memset (s, 0, sizeof (struct tree_common));
+  TREE_SET_CODE (s, STRING_CST);
   TREE_STRING_LENGTH (s) = len;
-  TREE_STRING_POINTER (s) = ggc_alloc_string (str, len);
+  memcpy ((char *) TREE_STRING_POINTER (s), str, len);
+  ((char *) TREE_STRING_POINTER (s))[len] = '\0';
 
   return s;
 }
index c0507423671ad5fd0e8ea0f16e8285073f3dfe7d..922c75f3232c58a754b3caefe982d884df4a2f41 100644 (file)
@@ -266,7 +266,7 @@ DEFTREECODE (COMPLEX_CST, "complex_cst", tcc_constant, 0)
 /* Contents are in TREE_VECTOR_CST_ELTS field.  */
 DEFTREECODE (VECTOR_CST, "vector_cst", tcc_constant, 0)
 
-/* Contents are TREE_STRING_LENGTH and TREE_STRING_POINTER fields.  */
+/* Contents are TREE_STRING_LENGTH and the actual contents of the string.  */
 DEFTREECODE (STRING_CST, "string_cst", tcc_constant, 0)
 
 /* Declarations.  All references to names are represented as ..._DECL
index 289d275d23fa51a9db7d4ac6abe07eedc9ff43af..17f04759a5305f136db3c1ad577f44b611572624 100644 (file)
@@ -1053,13 +1053,13 @@ struct tree_real_cst GTY(())
 
 /* In a STRING_CST */
 #define TREE_STRING_LENGTH(NODE) (STRING_CST_CHECK (NODE)->string.length)
-#define TREE_STRING_POINTER(NODE) (STRING_CST_CHECK (NODE)->string.pointer)
+#define TREE_STRING_POINTER(NODE) (STRING_CST_CHECK (NODE)->string.str)
 
 struct tree_string GTY(())
 {
   struct tree_common common;
   int length;
-  const char *pointer;
+  const char str[1];
 };
 
 /* In a COMPLEX_CST node.  */