summaryrefslogtreecommitdiff
path: root/gcc/dwarf2asm.c
diff options
context:
space:
mode:
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>2009-06-04 05:50:34 +0000
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>2009-06-04 05:50:34 +0000
commit1e03a59bc9d1424ede4774c8a45f601d4226ac31 (patch)
tree844ff9fd433e82ace9821b2780185794c64fc319 /gcc/dwarf2asm.c
parent6ae46731e795664179424a4778014d006b94dcb2 (diff)
downloadgcc-1e03a59bc9d1424ede4774c8a45f601d4226ac31.tar.gz
* dwarf2asm.c (dw2_force_const_mem): Defer creation of
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
Diffstat (limited to 'gcc/dwarf2asm.c')
-rw-r--r--gcc/dwarf2asm.c44
1 files changed, 25 insertions, 19 deletions
diff --git a/gcc/dwarf2asm.c b/gcc/dwarf2asm.c
index 5ccbcf1a81a..7e3fc82c9de 100644
--- a/gcc/dwarf2asm.c
+++ b/gcc/dwarf2asm.c
@@ -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)