[Bug debug/78835] [7 regression] ICE with -fdebug-types-section and member function
rguenther at suse dot de
gcc-bugzilla@gcc.gnu.org
Tue Jan 17 09:11:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78835
--- Comment #12 from rguenther at suse dot de <rguenther at suse dot de> ---
On Tue, 17 Jan 2017, jakub at gcc dot gnu.org wrote:
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78835
>
> --- Comment #11 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
> (In reply to Richard Biener from comment #10)
> > (In reply to Jakub Jelinek from comment #9)
> > > Created attachment 40524 [details]
> > > gcc7-pr78835.patch
> > >
> > > Untested patch that fixes the ICE on this testcase by marking directly
> > > called functions as needed. Will see what will it do with the size of the
> > > debug info.
> > > Of course, it is not sufficient, with -fdebug-types-section we can still ICE
> > > unless the earlier patch is also applied 9or some more sophisticated one to
> > > construct skeleton DIEs if type inside of type unit is detected).
> >
> > I think this is a reasonable approach (plus the hunk from comment#1 of
> > course).
>
> For the above patch (sans #c1) I've bootstrapped/regtested it last night, and
> compared to gcc without the patch the growth of the debug info is small and
> IMHO acceptable. On cc1plus on x86_64 comparing build without the patch and
> with the patch (in the former I've applied the patch and did make in stage3
> dir, so that it is the same source) .debug_info size grew by 0.009% and in
> libstdc++.so.6 by 0.29%.
>
> > But we can't really create new skeleton DIEs after early-finish because with
> > LTO we do not have access to enough information to build type DIEs.
>
> I think it is possible, e.g. considering
> namespace A { inline namespace B { namespace C { struct D { struct Bar { void
> Baz (); int i; }; };
> } } int vvv = 17; }
> A::C::D::Bar b;
> void Foo (A::C::D::Bar &t) { t.Baz (); }
> to create
> .uleb128 0x2 # (DIE (0x25) DW_TAG_namespace)
> .ascii "A\0" # DW_AT_name
> # DW_AT_declaration
> .uleb128 0x3 # (DIE (0x2c) DW_TAG_namespace)
> .ascii "B\0" # DW_AT_name
> # DW_AT_declaration
> .uleb128 0x3 # (DIE (0x2f) DW_TAG_namespace)
> .ascii "C\0" # DW_AT_name
> # DW_AT_declaration
> .uleb128 0xa # (DIE (0x32) DW_TAG_structure_type)
> .ascii "D\0" # DW_AT_name
> # DW_AT_declaration
> .uleb128 0x4 # (DIE (0x35) DW_TAG_structure_type)
> .ascii "Bar\0" # DW_AT_name
> # DW_AT_declaration
> .byte 0xf0 # DW_AT_signature
> .byte 0x8
> .byte 0x56
> .byte 0xd4
> .byte 0x2d
> .byte 0xa7
> .byte 0x74
> .byte 0x7c
> .uleb128 0x8 # (DIE (0x5c) DW_TAG_subprogram)
> # DW_AT_external
> # DW_AT_declaration
> .ascii "Baz\0" # DW_AT_name
In the end the great plan(TM) is to no longer have the TREE_TYPEs/DECLs of
the contexts around during GIMPLE optimizations ... I think
-fdebug-types-section always creates the skeletons so we may choose to
just never remove those as unused?
> Where the DW_AT_signature would actually point to the .debug_types signature
> and therefore the full declaration. But I'm not going to work on that right
> now, so would prefer for now just #c9 + #c1 + testcase.
Yes, that's reasonable.
More information about the Gcc-bugs
mailing list