OSDN Git Service

* dwarf2asm.c (dw2_force_const_mem): Defer creation of
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 Jun 2009 05:50:34 +0000 (05:50 +0000)
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 Jun 2009 05:50:34 +0000 (05:50 +0000)
declarations for constants until...
(dw2_output_indirect_constant_1): ... this point.

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

gcc/ChangeLog
gcc/dwarf2asm.c

index 997ec41..5cc21e4 100644 (file)
@@ -1,3 +1,9 @@
+2009-06-04  Alexandre Oliva  <aoliva@redhat.com>
+
+       * dwarf2asm.c (dw2_force_const_mem): Defer creation of
+       declarations for constants until...
+       (dw2_output_indirect_constant_1): ... this point.
+
 2009-06-04  Richard Earnshaw  <rearnsha@arm.com>
 
        PR target/10242
index 5ccbcf1..7e3fc82 100644 (file)
@@ -809,7 +809,7 @@ dw2_force_const_mem (rtx x, bool is_public)
 {
   splay_tree_node node;
   const char *key;
-  tree decl;
+  tree decl_id;
 
   if (! indirect_pool)
     /* We use strcmp, rather than just comparing pointers, so that the
@@ -821,7 +821,7 @@ dw2_force_const_mem (rtx x, bool is_public)
   key = XSTR (x, 0);
   node = splay_tree_lookup (indirect_pool, (splay_tree_key) key);
   if (node)
-    decl = (tree) node->value;
+    decl_id = (tree) node->value;
   else
     {
       tree id;
@@ -832,13 +832,9 @@ dw2_force_const_mem (rtx x, bool is_public)
          char *ref_name = XALLOCAVEC (char, strlen (str) + sizeof "DW.ref.");
 
          sprintf (ref_name, "DW.ref.%s", str);
-         id = get_identifier (ref_name);
-         decl = build_decl (VAR_DECL, id, ptr_type_node);
-         DECL_ARTIFICIAL (decl) = 1;
-         DECL_IGNORED_P (decl) = 1;
-         TREE_PUBLIC (decl) = 1;
-         DECL_INITIAL (decl) = decl;
-         make_decl_one_only (decl);
+         gcc_assert (!maybe_get_identifier (ref_name));
+         decl_id = get_identifier (ref_name);
+         TREE_PUBLIC (decl_id) = 1;
        }
       else
        {
@@ -846,12 +842,8 @@ dw2_force_const_mem (rtx x, bool is_public)
 
          ASM_GENERATE_INTERNAL_LABEL (label, "LDFCM", dw2_const_labelno);
          ++dw2_const_labelno;
-         id = get_identifier (label);
-         decl = build_decl (VAR_DECL, id, ptr_type_node);
-         DECL_ARTIFICIAL (decl) = 1;
-         DECL_IGNORED_P (decl) = 1;
-         TREE_STATIC (decl) = 1;
-         DECL_INITIAL (decl) = decl;
+         gcc_assert (!maybe_get_identifier (label));
+         decl_id = get_identifier (label);
        }
 
       id = maybe_get_identifier (str);
@@ -859,10 +851,10 @@ dw2_force_const_mem (rtx x, bool is_public)
        TREE_SYMBOL_REFERENCED (id) = 1;
 
       splay_tree_insert (indirect_pool, (splay_tree_key) key,
-                        (splay_tree_value) decl);
+                        (splay_tree_value) decl_id);
     }
 
-  return XEXP (DECL_RTL (decl), 0);
+  return gen_rtx_SYMBOL_REF (Pmode, IDENTIFIER_POINTER (decl_id));
 }
 
 /* A helper function for dw2_output_indirect_constants called through
@@ -874,10 +866,24 @@ dw2_output_indirect_constant_1 (splay_tree_node node,
 {
   const char *sym;
   rtx sym_ref;
-  tree decl;
+  tree id, decl;
 
   sym = (const char *) node->key;
-  decl = (tree) node->value;
+  id = (tree) node->value;
+
+  decl = build_decl (VAR_DECL, id, ptr_type_node);
+  DECL_ARTIFICIAL (decl) = 1;
+  DECL_IGNORED_P (decl) = 1;
+  DECL_INITIAL (decl) = decl;
+
+  if (TREE_PUBLIC (id))
+    {
+      TREE_PUBLIC (decl) = 1;
+      make_decl_one_only (decl);
+    }
+  else
+    TREE_STATIC (decl) = 1;
+
   sym_ref = gen_rtx_SYMBOL_REF (Pmode, sym);
   sym = targetm.strip_name_encoding (sym);
   if (TREE_PUBLIC (decl) && USE_LINKONCE_INDIRECT)