This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Silence merge warnings on artificial types
- From: Jan Hubicka <hubicka at ucw dot cz>
- To: Ilya Verbin <iverbin at gmail dot com>
- Cc: Jan Hubicka <hubicka at ucw dot cz>, Jason Merrill <jason at redhat dot com>, Jakub Jelinek <jakub at redhat dot com>, gcc-patches at gcc dot gnu dot org, rguenther at suse dot de
- Date: Thu, 2 Apr 2015 20:37:41 +0200
- Subject: Re: Silence merge warnings on artificial types
- Authentication-results: sourceware.org; auth=none
- References: <20150330030257 dot GA71352 at kam dot mff dot cuni dot cz> <20150330153641 dot GA64930 at msticlxl57 dot ims dot intel dot com> <20150330170639 dot GD93920 at kam dot mff dot cuni dot cz> <20150330172102 dot GI1746 at tucnak dot redhat dot com> <20150330172321 dot GE14471 at atrey dot karlin dot mff dot cuni dot cz> <55198D94 dot 5020707 at redhat dot com> <20150331075121 dot GB62830 at kam dot mff dot cuni dot cz> <20150402182303 dot GA52553 at msticlxl57 dot ims dot intel dot com>
> On Tue, Mar 31, 2015 at 09:51:21 +0200, Jan Hubicka wrote:
> > this patch adds the ARTIFICIAL flag check to avoid ODR merging to these.
> > I oriignally tested DECL_ARTIFICIAL (decl) (that is TYPE_NAME) that randomly
> > dropped type names on some classes but not all.
> >
> > Jason, please do you know what is meaning of DECL_ARTIFICIAL on class type
> > names? Perhaps we can drop them to 0 in free lang data?
> >
> > With this bug I triggered wrong devirtualization because we no longer insert
> > non-odr types into a type inheritance graph. This is fixed by the lto_read_decls
> > change and finally I triggered an ICE in ipa-devirt that due to the bug
> > output a warning late and ICEd on streamer cache being NULL. I guess it is
> > better to guard it even though all wanrings should be output early.
> >
> > Bootsrapped/regtested x86_64-linux, will commit it after chromium rebuild.
> >
> > Honza
> >
> > * tree.c (need_assembler_name_p): Artificial types have no ODR
> > names.
> > * ipa-devirt.c (warn_odr): Do not try to apply ODR cache when
> > no caching is done.
> >
> > * lto.c (lto_read_decls): Move code registering odr types out
> > of TYPE_CANONICAL conditional and also register polymorphic types.
> > Index: tree.c
> > ===================================================================
> > --- tree.c (revision 221777)
> > @@ -5139,6 +5145,7 @@ need_assembler_name_p (tree decl)
> > && decl == TYPE_NAME (TREE_TYPE (decl))
> > && !is_lang_specific (TREE_TYPE (decl))
> > && AGGREGATE_TYPE_P (TREE_TYPE (decl))
> > + && !TYPE_ARTIFICIAL (TREE_TYPE (decl))
> > && !variably_modified_type_p (TREE_TYPE (decl), NULL_TREE)
> > && !type_in_anonymous_namespace_p (TREE_TYPE (decl)))
> > return !DECL_ASSEMBLER_NAME_SET_P (decl);
>
> Hmm, libgomp.c++/target-3.C still fails.
> Here is what I see in need_assembler_name_p:
>
> <type_decl 0x2b5a8751aed8 .omp_data_s.3
> type <record_type 0x2b5a87536690 .omp_data_s.3 BLK
> size <integer_cst 0x2b5a873ce318 constant 192>
> unit size <integer_cst 0x2b5a873ce2e8 constant 24>
> align 64 symtab 0 alias set -1 canonical type 0x2b5a87536690
> fields <field_decl 0x2b5a87537000 b.0 type <pointer_type 0x2b5a87536150>
> unsigned DI file test.cpp line 8 col 13
> size <integer_cst 0x2b5a873ace58 constant 64>
> unit size <integer_cst 0x2b5a873ace70 constant 8>
> align 64 offset_align 128
> offset <integer_cst 0x2b5a873ace88 constant 0>
> bit offset <integer_cst 0x2b5a873aced0 constant 0> context <record_type 0x2b5a87536690 .omp_data_s.3> chain <field_decl 0x2b5a87537098 s>> reference_to_this <reference_type 0x2b5a87536738>>
> VOID file test.cpp line 11 col 13
> align 1>
> (TYPE_ARTIFICIAL = 0)
>
> <type_decl 0x2b5a8751a850 .omp_data_s.3
> type <record_type 0x2b5a8752cdc8 .omp_data_s.3 BLK
> size <integer_cst 0x2b5a873ce318 constant 192>
> unit size <integer_cst 0x2b5a873ce2e8 constant 24>
> align 64 symtab 0 alias set -1 canonical type 0x2b5a8752cdc8
> fields <field_decl 0x2b5a8751a980 b.0 type <pointer_type 0x2b5a8752c498>
> unsigned DI file test.cpp line 8 col 13
> size <integer_cst 0x2b5a873ace58 constant 64>
> unit size <integer_cst 0x2b5a873ace70 constant 8>
> align 64 offset_align 128
> offset <integer_cst 0x2b5a873ace88 constant 0>
> bit offset <integer_cst 0x2b5a873aced0 constant 0> context <record_type 0x2b5a8752cdc8 .omp_data_s.3> chain <field_decl 0x2b5a8751a8e8 s>>
> pointer_to_this <pointer_type 0x2b5a87536888>>
> VOID file test.cpp line 11 col 13
> align 1>
> (TYPE_ARTIFICIAL = 0)
I see, the DECL_ARTIFICIAL is set on TYPE_DECL but it is not set on type
itself. Jakub, this looks like an artificial type, so perhaps we want to set
it in omp-low.c?
Otherwise I can add extra test for DECL_NAMELESS, but marking type as artifical
looks like correct fix to me.
Honza
>
> -- Ilya