[PATCH]use vnode->get_constructor () to get intial in lto[PR94822]

Richard Biener richard.guenther@gmail.com
Wed Apr 29 08:48:13 GMT 2020


On Wed, Apr 29, 2020 at 8:44 AM Richard Biener
<richard.guenther@gmail.com> wrote:
>
> On Wed, Apr 29, 2020 at 6:04 AM lizekun (A) <lizekun1@huawei.com> wrote:
> >
> > Hi,
> >
> > This ICE appears because gcc will stream it to the function_body section when processing the
> > variable with the initial value of the constructor type, and the error_mark_node to the
> > decls section. When recompiling, the value obtained with DECL_INITIAL will be error_mark.
> >
> > This patch use vnode->get_constructor () to get intial in lto.
> >
> > Bootstrap and tested on aarch64 Linux platform.
>
> You should use ctor_for_folding to get all the magic correct.  Note that this
> function returns error_mark_node if there is no usable initializer, NULL if
> there is zero-init and sth else for the actual initializer.  You can use
>
>   if (tree init = ctor_for_folding (base))
>     if (init && init != error_mark_node)
>       {
> ...
>       }
>
> Not to mention this whole function is a red herring ...:/

So I tested this and ctor_for_folding is too strict but we also do not
stream ctors not usable for folding but to the LTRANS unit that
is responsible for the variable output.

So instead I am simply testing an additional != error_mark_node check.
The size, if "important", should be resolved before LTO.

Richard.

> Thanks,
> Richard.
>
> >
> > Best regulars,
> > Zekun
> >
> >
> > gcc:
> > +2020-04-29  Li Zekun  <lizekun1@huawei.com>
> > +
> > +       PR  lto/94822
> > +       * tree.c: use vnode->get_constructor () to get intial in lto
> >
> > gcc/testsuite:
> > +2020-04-29  Li Zekun  <lizekun1@huawei.com>
> > +
> > +       PR  lto/94822
> > +       * gcc.dg/lto/pr94822.h: New test.
> > +       * gcc.dg/lto/pr94822_0.c: New test.
> > +       * gcc.dg/lto/pr94822_1.c: New test.


More information about the Gcc-patches mailing list