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

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.

Reply via email to