PR c/43288 (ICE with __attribute__ ((common)))

Richard Guenther richard.guenther@gmail.com
Sat Mar 27 13:15:00 GMT 2010


On Thu, Mar 18, 2010 at 12:27 AM, Jan Hubicka <hubicka@ucw.cz> wrote:
>> On Wed, 2010-03-17 at 16:35 +0100, Jan Hubicka wrote:
>>
>> > Hmm, I rebuilt for this tripplet, but still no luck:
>> >
>> > jh@gcc14:~/trunk/build-hppa2/gcc$ cat a.C
>> > class t { virtual ~t(); };
>> > namespace  __cxxabiv1 {
>> > class __fundamental_type_info : public t {};
>> > }
>> >
>> > jh@gcc14:~/trunk/build-hppa2/gcc$ ./cc1plus a.C -quiet
>> > jh@gcc14:~/trunk/build-hppa2/gcc$
>> >
>> > There seems to be no changes today that would fix this.  If the testcase seems
>> > fine, could you try to get a backtrace for me?  I think we might only need to
>> > avoid make_decl_rtl from being called too early.
>> >
>> > Honza
>>
>
> Hi,
> looking at the corelation about notice_global_symbol and make_decl_rtl,
> I don't think I can easilly avoid the scenario.  In longer term we probably
> should make this kind of mangling late in cgraph code but until then it seems
> best to simply make make_decl_rtl behave (semi) sanily here as it used to.
>
> Does the attached patch fix the bootstrap problem? (it does fix the testcase)

The patch is ok if it passes bootstrap & regtest, given it restores bootstrap
for the affected folks.

Thanks,
Richard.

> Honza
>
> Index: varasm.c
> ===================================================================
> --- varasm.c    (revision 157518)
> +++ varasm.c    (working copy)
> @@ -1435,16 +1435,19 @@ make_decl_rtl (tree decl)
>
>   /* Specifying a section attribute on a variable forces it into a
>      non-.bss section, and thus it cannot be common.  */
> -  gcc_assert (!(TREE_CODE (decl) == VAR_DECL
> -             && DECL_SECTION_NAME (decl) != NULL_TREE
> -             && DECL_INITIAL (decl) == NULL_TREE
> -             && DECL_COMMON (decl))
> -             || !DECL_COMMON (decl));
> +  /* FIXME: In general this code should not be necessary because
> +     visibility pass is doing the same work.  But notice_global_symbol
> +     is called early and it needs to make DECL_RTL to get the name.
> +     we take care of recomputing the DECL_RTL after visibility is changed.  */
> +  if (TREE_CODE (decl) == VAR_DECL
> +      && DECL_SECTION_NAME (decl) != NULL_TREE
> +      && DECL_INITIAL (decl) == NULL_TREE
> +      && DECL_COMMON (decl))
> +    DECL_COMMON (decl) = 0;
>
>   /* Variables can't be both common and weak.  */
> -  gcc_assert (TREE_CODE (decl) != VAR_DECL
> -             || !DECL_WEAK (decl)
> -             || !DECL_COMMON (decl));
> +  if (TREE_CODE (decl) == VAR_DECL && DECL_WEAK (decl))
> +    DECL_COMMON (decl) = 0;
>
>   if (use_object_blocks_p () && use_blocks_for_decl_p (decl))
>     x = create_block_symbol (name, get_block_for_decl (decl), -1);
>



More information about the Gcc-patches mailing list