From 78bd9046a8dff27c8247a5c80bdec5f7122f77d2 Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Thu, 4 Jun 2009 05:50:34 +0000 Subject: 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 --- gcc/ChangeLog | 6 ++++++ gcc/dwarf2asm.c | 44 +++++++++++++++++++++++++------------------- 2 files changed, 31 insertions(+), 19 deletions(-) (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 997ec41..5cc21e4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-06-04 Alexandre Oliva + + * 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 PR target/10242 diff --git a/gcc/dwarf2asm.c b/gcc/dwarf2asm.c index 5ccbcf1..7e3fc82 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) -- cgit v1.1