dwarf2asm.c (dw2_force_const_mem): Defer creation of declarations for constants until...

* dwarf2asm.c (dw2_force_const_mem): Defer creation of
declarations for constants until...
(dw2_output_indirect_constant_1): ... this point.

From-SVN: r148160
This commit is contained in:
Alexandre Oliva 2009-06-04 05:50:34 +00:00 committed by Alexandre Oliva
parent 4cbc7f7a21
commit 78bd9046a8
2 changed files with 31 additions and 19 deletions

View 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

View 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)