Silence merge warnings on artificial types
Jan Hubicka
hubicka@ucw.cz
Thu Apr 2 18:37:00 GMT 2015
> 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
More information about the Gcc-patches
mailing list