http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54734



             Bug #: 54734

           Summary: Debug info for C++ and LTO misses types

    Classification: Unclassified

           Product: gcc

           Version: 4.8.0

            Status: UNCONFIRMED

          Keywords: lto

          Severity: normal

          Priority: P3

         Component: debug

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: rgue...@gcc.gnu.org





Consider the following reduced testcase (from standard library use):



template <class T> class basic_string;

typedef basic_string<char> sstring;



template <class T>

class basic_string

{

public:

  typedef T type;

};



extern template class basic_string<char>;



int main()

{

  sstring s;

  return sstring::type (0);

}



without LTO we have



 <1><130>: Abbrev Number: 2 (DW_TAG_typedef)

    <131>   DW_AT_name        : (indirect string, offset: 0x98): sstring        

    <135>   DW_AT_decl_file   : 1       

    <136>   DW_AT_decl_line   : 2       

    <137>   DW_AT_type        : <0x13b> 

 <1><13b>: Abbrev Number: 3 (DW_TAG_class_type)

    <13c>   DW_AT_name        : (indirect string, offset: 0xa0):

basic_string<char>     

    <140>   DW_AT_byte_size   : 1       

    <141>   DW_AT_decl_file   : 1       

    <142>   DW_AT_decl_line   : 5       

    <143>   DW_AT_sibling     : <0x15a> 

 <2><147>: Abbrev Number: 2 (DW_TAG_typedef)

    <148>   DW_AT_name        : (indirect string, offset: 0x8e): type   

    <14c>   DW_AT_decl_file   : 1       

    <14d>   DW_AT_decl_line   : 8       

    <14e>   DW_AT_type        : <0x15a> 



while with LTO we get only



 <1><137>: Abbrev Number: 3 (DW_TAG_typedef)

    <138>   DW_AT_name        : (indirect string, offset: 0xf8): sstring        

    <13c>   DW_AT_decl_file   : 1       

    <13d>   DW_AT_decl_line   : 11      

    <13e>   DW_AT_type        : <0x142> 

 <1><142>: Abbrev Number: 4 (DW_TAG_structure_type)

    <143>   DW_AT_name        : (indirect string, offset: 0xeb): basic_string   

    <147>   DW_AT_declaration : 1       



which results from gen_struct_or_union_type_die on the type seeing

a TYPE_STUB_DECL with TYPE_DECL_SUPPRESS_DEBUG set.



Somehow the C++ frontend "manually" outputs the desired info and then for

later processing directs dwarf2out.c to not output anything?



This probably all boils down to LTO "ignoring" debug-hook calls from the

frontend, but is there a way to recover from that?  For example by

clearing TYPE_DECL_SUPPRESS_DEBUG for LTO?  Or is that used in "meaningful"

ways as well?

Reply via email to