http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50494
--- Comment #24 from Richard Biener <rguenth at gcc dot gnu.org> 2013-03-05
10:18:01 UTC ---
(In reply to comment #23)
> > How can the patch cause a name collision when all the patch does is
> > avoid creating a new decl...? They are static and thus should be
> > mangled.
>
> They clearly aren't.
>
> > Well, and if we want a new decl just to re-assign a unique name here
> > then we want to copy over alignment information. That is, LTO should
> > handle constant-pool entries by _not_ streaming the decl then. Honza,
> > how are those supposed to make the symtab -> WPA -> LTRANS transition
> > anyway?
>
> The irony being that the initial implementation didn't stream the DECL but was
> changed because the varpool was just starting to being streamed as well. :-)
Yes, we do refer to the in the IL so we need to stream them (in some way).
The question is why we don't hit lto-lang.c:lto_set_decl_assembler_name
mangling of !TREE_PUBLIC decls when streaming in the decl for the constant
pool entries (or when computing the assembler name at some point).
I suppose we never compute decl-assembler-name for the constant pool entries
but emit them in a special way? At least build_constant_desc seems to
create a raw SYMBOL_RER using the raw created label? But then, as we
don't stream the constant-descs, the RTL should refer to unique labels
(but DECL_NAME and the SYMBOL_REF symbol do not agree).
Which means that eventually the following would fix it:
Index: gcc/varasm.c
===================================================================
--- gcc/varasm.c (revision 196451)
+++ gcc/varasm.c (working copy)
@@ -3124,6 +3124,11 @@ build_constant_desc (tree exp, tree decl
else
align_variable (decl, 0);
}
+ /* If we already had a decl for this constant pool entry adjust its
+ label to be unique within this translation unit and to make it
+ consistent with the symbol-ref symbol we use below. */
+ else
+ DECL_NAME (decl) = get_identifier (label);
/* Now construct the SYMBOL_REF and the MEM. */
if (use_object_blocks_p ())
can you check that?
Thanks.