Commit b03e9863 by Eric Botcazou Committed by Eric Botcazou

dwarf2asm.c (dw2_force_const_mem): Add new parameter 'public'.

	* dwarf2asm.c (dw2_force_const_mem): Add new parameter 'public'.
	On USE_LINKONCE_INDIRECT platforms, build a DECL_ONE_ONLY indirect
	reference only if 'public' is true.
	(dw2_output_indirect_constant_1): On USE_LINKONCE_INDIRECT platforms,
	emit the .hidden directive only if the indirect reference is public.
	(dw2_asm_output_encoded_addr_rtx): Add new parameter 'public'.
	Pass it to dw2_force_const_mem.
	* dwarf2asm.h (dw2_asm_output_encoded_addr_rtx): New param 'public'.
	* dwarf2out.c (output_cfi): Adjust calls to above function.
	(output_call_frame_info): Likewise.
	* except.c (output_ttype): Pass TREE_PUBLIC of the type_info object
	as 'public' argument to dw2_asm_output_encoded_addr_rtx.

From-SVN: r106445
parent a39041fa
2005-11-03 Eric Botcazou <ebotcazou@adacore.com>
* dwarf2asm.c (dw2_force_const_mem): Add new parameter 'public'.
On USE_LINKONCE_INDIRECT platforms, build a DECL_ONE_ONLY indirect
reference only if 'public' is true.
(dw2_output_indirect_constant_1): On USE_LINKONCE_INDIRECT platforms,
emit the .hidden directive only if the indirect reference is public.
(dw2_asm_output_encoded_addr_rtx): Add new parameter 'public'.
Pass it to dw2_force_const_mem.
* dwarf2asm.h (dw2_asm_output_encoded_addr_rtx): New param 'public'.
* dwarf2out.c (output_cfi): Adjust calls to above function.
(output_call_frame_info): Likewise.
* except.c (output_ttype): Pass TREE_PUBLIC of the type_info object
as 'public' argument to dw2_asm_output_encoded_addr_rtx.
2005-11-03 Zdenek Dvorak <dvorakz@suse.cz> 2005-11-03 Zdenek Dvorak <dvorakz@suse.cz>
PR tree-optimization/24483 PR tree-optimization/24483
......
...@@ -683,7 +683,7 @@ dw2_asm_output_delta_sleb128 (const char *lab1 ATTRIBUTE_UNUSED, ...@@ -683,7 +683,7 @@ dw2_asm_output_delta_sleb128 (const char *lab1 ATTRIBUTE_UNUSED,
} }
#endif /* 0 */ #endif /* 0 */
static rtx dw2_force_const_mem (rtx); static rtx dw2_force_const_mem (rtx, bool);
static int dw2_output_indirect_constant_1 (splay_tree_node, void *); static int dw2_output_indirect_constant_1 (splay_tree_node, void *);
static GTY((param1_is (char *), param2_is (tree))) splay_tree indirect_pool; static GTY((param1_is (char *), param2_is (tree))) splay_tree indirect_pool;
...@@ -699,10 +699,11 @@ static GTY(()) int dw2_const_labelno; ...@@ -699,10 +699,11 @@ static GTY(()) int dw2_const_labelno;
/* Put X, a SYMBOL_REF, in memory. Return a SYMBOL_REF to the allocated /* Put X, a SYMBOL_REF, in memory. Return a SYMBOL_REF to the allocated
memory. Differs from force_const_mem in that a single pool is used for memory. Differs from force_const_mem in that a single pool is used for
the entire unit of translation, and the memory is not guaranteed to be the entire unit of translation, and the memory is not guaranteed to be
"near" the function in any interesting sense. */ "near" the function in any interesting sense. PUBLIC controls whether
the symbol can be shared across the entire application (or DSO). */
static rtx static rtx
dw2_force_const_mem (rtx x) dw2_force_const_mem (rtx x, bool public)
{ {
splay_tree_node node; splay_tree_node node;
const char *str; const char *str;
...@@ -721,7 +722,7 @@ dw2_force_const_mem (rtx x) ...@@ -721,7 +722,7 @@ dw2_force_const_mem (rtx x)
{ {
tree id; tree id;
if (USE_LINKONCE_INDIRECT) if (public && USE_LINKONCE_INDIRECT)
{ {
char *ref_name = alloca (strlen (str) + sizeof "DW.ref."); char *ref_name = alloca (strlen (str) + sizeof "DW.ref.");
...@@ -768,12 +769,14 @@ dw2_output_indirect_constant_1 (splay_tree_node node, ...@@ -768,12 +769,14 @@ dw2_output_indirect_constant_1 (splay_tree_node node,
{ {
const char *sym; const char *sym;
rtx sym_ref; rtx sym_ref;
tree decl;
sym = (const char *) node->key; sym = (const char *) node->key;
decl = (tree) node->value;
sym_ref = gen_rtx_SYMBOL_REF (Pmode, sym); sym_ref = gen_rtx_SYMBOL_REF (Pmode, sym);
if (USE_LINKONCE_INDIRECT) if (TREE_PUBLIC (decl) && USE_LINKONCE_INDIRECT)
fprintf (asm_out_file, "\t.hidden %sDW.ref.%s\n", user_label_prefix, sym); fprintf (asm_out_file, "\t.hidden %sDW.ref.%s\n", user_label_prefix, sym);
assemble_variable ((tree) node->value, 1, 1, 1); assemble_variable (decl, 1, 1, 1);
assemble_integer (sym_ref, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1); assemble_integer (sym_ref, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
return 0; return 0;
...@@ -788,10 +791,12 @@ dw2_output_indirect_constants (void) ...@@ -788,10 +791,12 @@ dw2_output_indirect_constants (void)
splay_tree_foreach (indirect_pool, dw2_output_indirect_constant_1, NULL); splay_tree_foreach (indirect_pool, dw2_output_indirect_constant_1, NULL);
} }
/* Like dw2_asm_output_addr_rtx, but encode the pointer as directed. */ /* Like dw2_asm_output_addr_rtx, but encode the pointer as directed.
If PUBLIC is set and the encoding is DW_EH_PE_indirect, the indirect
reference is shared across the entire application (or DSO). */
void void
dw2_asm_output_encoded_addr_rtx (int encoding, rtx addr, dw2_asm_output_encoded_addr_rtx (int encoding, rtx addr, bool public,
const char *comment, ...) const char *comment, ...)
{ {
int size; int size;
...@@ -830,9 +835,9 @@ dw2_asm_output_encoded_addr_rtx (int encoding, rtx addr, ...@@ -830,9 +835,9 @@ dw2_asm_output_encoded_addr_rtx (int encoding, rtx addr,
/* It is very tempting to use force_const_mem so that we share data /* It is very tempting to use force_const_mem so that we share data
with the normal constant pool. However, we've already emitted with the normal constant pool. However, we've already emitted
the constant pool for this function. Moreover, we'd like to the constant pool for this function. Moreover, we'd like to
share these constants across the entire unit of translation, share these constants across the entire unit of translation and
or better, across the entire application (or DSO). */ even, if possible, across the entire application (or DSO). */
addr = dw2_force_const_mem (addr); addr = dw2_force_const_mem (addr, public);
encoding &= ~DW_EH_PE_indirect; encoding &= ~DW_EH_PE_indirect;
goto restart; goto restart;
} }
......
...@@ -38,9 +38,9 @@ extern void dw2_asm_output_addr (int, const char *, const char *, ...) ...@@ -38,9 +38,9 @@ extern void dw2_asm_output_addr (int, const char *, const char *, ...)
extern void dw2_asm_output_addr_rtx (int, rtx, const char *, ...) extern void dw2_asm_output_addr_rtx (int, rtx, const char *, ...)
ATTRIBUTE_NULL_PRINTF_3; ATTRIBUTE_NULL_PRINTF_3;
extern void dw2_asm_output_encoded_addr_rtx (int, rtx, extern void dw2_asm_output_encoded_addr_rtx (int, rtx, bool,
const char *, ...) const char *, ...)
ATTRIBUTE_NULL_PRINTF_3; ATTRIBUTE_NULL_PRINTF_4;
extern void dw2_asm_output_nstring (const char *, size_t, extern void dw2_asm_output_nstring (const char *, size_t,
const char *, ...) const char *, ...)
......
...@@ -2005,7 +2005,7 @@ output_cfi (dw_cfi_ref cfi, dw_fde_ref fde, int for_eh) ...@@ -2005,7 +2005,7 @@ output_cfi (dw_cfi_ref cfi, dw_fde_ref fde, int for_eh)
dw2_asm_output_encoded_addr_rtx ( dw2_asm_output_encoded_addr_rtx (
ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/1, /*global=*/0), ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/1, /*global=*/0),
gen_rtx_SYMBOL_REF (Pmode, cfi->dw_cfi_oprnd1.dw_cfi_addr), gen_rtx_SYMBOL_REF (Pmode, cfi->dw_cfi_oprnd1.dw_cfi_addr),
NULL); false, NULL);
else else
dw2_asm_output_addr (DWARF2_ADDR_SIZE, dw2_asm_output_addr (DWARF2_ADDR_SIZE,
cfi->dw_cfi_oprnd1.dw_cfi_addr, NULL); cfi->dw_cfi_oprnd1.dw_cfi_addr, NULL);
...@@ -2261,7 +2261,8 @@ output_call_frame_info (int for_eh) ...@@ -2261,7 +2261,8 @@ output_call_frame_info (int for_eh)
dw2_asm_output_data (1, per_encoding, "Personality (%s)", dw2_asm_output_data (1, per_encoding, "Personality (%s)",
eh_data_format_name (per_encoding)); eh_data_format_name (per_encoding));
dw2_asm_output_encoded_addr_rtx (per_encoding, dw2_asm_output_encoded_addr_rtx (per_encoding,
eh_personality_libfunc, NULL); eh_personality_libfunc,
true, NULL);
} }
if (any_lsda_needed) if (any_lsda_needed)
...@@ -2313,6 +2314,7 @@ output_call_frame_info (int for_eh) ...@@ -2313,6 +2314,7 @@ output_call_frame_info (int for_eh)
SYMBOL_REF_FLAGS (sym_ref) |= SYMBOL_FLAG_LOCAL; SYMBOL_REF_FLAGS (sym_ref) |= SYMBOL_FLAG_LOCAL;
dw2_asm_output_encoded_addr_rtx (fde_encoding, dw2_asm_output_encoded_addr_rtx (fde_encoding,
sym_ref, sym_ref,
false,
"FDE initial location"); "FDE initial location");
if (fde->dw_fde_switched_sections) if (fde->dw_fde_switched_sections)
{ {
...@@ -2322,13 +2324,13 @@ output_call_frame_info (int for_eh) ...@@ -2322,13 +2324,13 @@ output_call_frame_info (int for_eh)
fde->dw_fde_hot_section_label); fde->dw_fde_hot_section_label);
SYMBOL_REF_FLAGS (sym_ref2) |= SYMBOL_FLAG_LOCAL; SYMBOL_REF_FLAGS (sym_ref2) |= SYMBOL_FLAG_LOCAL;
SYMBOL_REF_FLAGS (sym_ref3) |= SYMBOL_FLAG_LOCAL; SYMBOL_REF_FLAGS (sym_ref3) |= SYMBOL_FLAG_LOCAL;
dw2_asm_output_encoded_addr_rtx (fde_encoding, sym_ref3, dw2_asm_output_encoded_addr_rtx (fde_encoding, sym_ref3, false,
"FDE initial location"); "FDE initial location");
dw2_asm_output_delta (size_of_encoded_value (fde_encoding), dw2_asm_output_delta (size_of_encoded_value (fde_encoding),
fde->dw_fde_hot_section_end_label, fde->dw_fde_hot_section_end_label,
fde->dw_fde_hot_section_label, fde->dw_fde_hot_section_label,
"FDE address range"); "FDE address range");
dw2_asm_output_encoded_addr_rtx (fde_encoding, sym_ref2, dw2_asm_output_encoded_addr_rtx (fde_encoding, sym_ref2, false,
"FDE initial location"); "FDE initial location");
dw2_asm_output_delta (size_of_encoded_value (fde_encoding), dw2_asm_output_delta (size_of_encoded_value (fde_encoding),
fde->dw_fde_unlikely_section_end_label, fde->dw_fde_unlikely_section_end_label,
...@@ -2393,7 +2395,7 @@ output_call_frame_info (int for_eh) ...@@ -2393,7 +2395,7 @@ output_call_frame_info (int for_eh)
fde->funcdef_number); fde->funcdef_number);
dw2_asm_output_encoded_addr_rtx ( dw2_asm_output_encoded_addr_rtx (
lsda_encoding, gen_rtx_SYMBOL_REF (Pmode, l1), lsda_encoding, gen_rtx_SYMBOL_REF (Pmode, l1),
"Language Specific Data Area"); false, "Language Specific Data Area");
} }
else else
{ {
......
...@@ -3463,6 +3463,7 @@ static void ...@@ -3463,6 +3463,7 @@ static void
output_ttype (tree type, int tt_format, int tt_format_size) output_ttype (tree type, int tt_format, int tt_format_size)
{ {
rtx value; rtx value;
bool public = true;
if (type == NULL_TREE) if (type == NULL_TREE)
value = const0_rtx; value = const0_rtx;
...@@ -3485,6 +3486,7 @@ output_ttype (tree type, int tt_format, int tt_format_size) ...@@ -3485,6 +3486,7 @@ output_ttype (tree type, int tt_format, int tt_format_size)
node = cgraph_varpool_node (type); node = cgraph_varpool_node (type);
if (node) if (node)
cgraph_varpool_mark_needed_node (node); cgraph_varpool_mark_needed_node (node);
public = TREE_PUBLIC (type);
} }
} }
else if (TREE_CODE (type) != INTEGER_CST) else if (TREE_CODE (type) != INTEGER_CST)
...@@ -3499,7 +3501,7 @@ output_ttype (tree type, int tt_format, int tt_format_size) ...@@ -3499,7 +3501,7 @@ output_ttype (tree type, int tt_format, int tt_format_size)
assemble_integer (value, tt_format_size, assemble_integer (value, tt_format_size,
tt_format_size * BITS_PER_UNIT, 1); tt_format_size * BITS_PER_UNIT, 1);
else else
dw2_asm_output_encoded_addr_rtx (tt_format, value, NULL); dw2_asm_output_encoded_addr_rtx (tt_format, value, public, NULL);
} }
void void
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment