diff options
author | aoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-06-04 05:50:34 +0000 |
---|---|---|
committer | aoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-06-04 05:50:34 +0000 |
commit | 1e03a59bc9d1424ede4774c8a45f601d4226ac31 (patch) | |
tree | 844ff9fd433e82ace9821b2780185794c64fc319 /gcc/dwarf2asm.c | |
parent | 6ae46731e795664179424a4778014d006b94dcb2 (diff) | |
download | gcc-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.c | 44 |
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) |