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.

Reply via email to