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
This commit is contained in:
Eric Botcazou 2005-11-03 19:57:55 +00:00 committed by Eric Botcazou
parent a39041fae9
commit b03e9863c9
5 changed files with 43 additions and 19 deletions

View File

@ -1,3 +1,18 @@
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>
PR tree-optimization/24483

View File

@ -683,7 +683,7 @@ dw2_asm_output_delta_sleb128 (const char *lab1 ATTRIBUTE_UNUSED,
}
#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 GTY((param1_is (char *), param2_is (tree))) splay_tree indirect_pool;
@ -699,10 +699,11 @@ static GTY(()) int dw2_const_labelno;
/* 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
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
dw2_force_const_mem (rtx x)
dw2_force_const_mem (rtx x, bool public)
{
splay_tree_node node;
const char *str;
@ -721,7 +722,7 @@ dw2_force_const_mem (rtx x)
{
tree id;
if (USE_LINKONCE_INDIRECT)
if (public && USE_LINKONCE_INDIRECT)
{
char *ref_name = alloca (strlen (str) + sizeof "DW.ref.");
@ -768,12 +769,14 @@ dw2_output_indirect_constant_1 (splay_tree_node node,
{
const char *sym;
rtx sym_ref;
tree decl;
sym = (const char *) node->key;
decl = (tree) node->value;
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);
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);
return 0;
@ -788,10 +791,12 @@ dw2_output_indirect_constants (void)
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
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, ...)
{
int size;
@ -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
with the normal constant pool. However, we've already emitted
the constant pool for this function. Moreover, we'd like to
share these constants across the entire unit of translation,
or better, across the entire application (or DSO). */
addr = dw2_force_const_mem (addr);
share these constants across the entire unit of translation and
even, if possible, across the entire application (or DSO). */
addr = dw2_force_const_mem (addr, public);
encoding &= ~DW_EH_PE_indirect;
goto restart;
}

View File

@ -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 *, ...)
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 *, ...)
ATTRIBUTE_NULL_PRINTF_3;
ATTRIBUTE_NULL_PRINTF_4;
extern void dw2_asm_output_nstring (const char *, size_t,
const char *, ...)

View File

@ -2005,7 +2005,7 @@ output_cfi (dw_cfi_ref cfi, dw_fde_ref fde, int for_eh)
dw2_asm_output_encoded_addr_rtx (
ASM_PREFERRED_EH_DATA_FORMAT (/*code=*/1, /*global=*/0),
gen_rtx_SYMBOL_REF (Pmode, cfi->dw_cfi_oprnd1.dw_cfi_addr),
NULL);
false, NULL);
else
dw2_asm_output_addr (DWARF2_ADDR_SIZE,
cfi->dw_cfi_oprnd1.dw_cfi_addr, NULL);
@ -2261,7 +2261,8 @@ output_call_frame_info (int for_eh)
dw2_asm_output_data (1, per_encoding, "Personality (%s)",
eh_data_format_name (per_encoding));
dw2_asm_output_encoded_addr_rtx (per_encoding,
eh_personality_libfunc, NULL);
eh_personality_libfunc,
true, NULL);
}
if (any_lsda_needed)
@ -2313,6 +2314,7 @@ output_call_frame_info (int for_eh)
SYMBOL_REF_FLAGS (sym_ref) |= SYMBOL_FLAG_LOCAL;
dw2_asm_output_encoded_addr_rtx (fde_encoding,
sym_ref,
false,
"FDE initial location");
if (fde->dw_fde_switched_sections)
{
@ -2322,13 +2324,13 @@ output_call_frame_info (int for_eh)
fde->dw_fde_hot_section_label);
SYMBOL_REF_FLAGS (sym_ref2) |= 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");
dw2_asm_output_delta (size_of_encoded_value (fde_encoding),
fde->dw_fde_hot_section_end_label,
fde->dw_fde_hot_section_label,
"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");
dw2_asm_output_delta (size_of_encoded_value (fde_encoding),
fde->dw_fde_unlikely_section_end_label,
@ -2393,7 +2395,7 @@ output_call_frame_info (int for_eh)
fde->funcdef_number);
dw2_asm_output_encoded_addr_rtx (
lsda_encoding, gen_rtx_SYMBOL_REF (Pmode, l1),
"Language Specific Data Area");
false, "Language Specific Data Area");
}
else
{

View File

@ -3463,6 +3463,7 @@ static void
output_ttype (tree type, int tt_format, int tt_format_size)
{
rtx value;
bool public = true;
if (type == NULL_TREE)
value = const0_rtx;
@ -3485,6 +3486,7 @@ output_ttype (tree type, int tt_format, int tt_format_size)
node = cgraph_varpool_node (type);
if (node)
cgraph_varpool_mark_needed_node (node);
public = TREE_PUBLIC (type);
}
}
else if (TREE_CODE (type) != INTEGER_CST)
@ -3499,7 +3501,7 @@ output_ttype (tree type, int tt_format, int tt_format_size)
assemble_integer (value, tt_format_size,
tt_format_size * BITS_PER_UNIT, 1);
else
dw2_asm_output_encoded_addr_rtx (tt_format, value, NULL);
dw2_asm_output_encoded_addr_rtx (tt_format, value, public, NULL);
}
void