https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80596
Bug ID: 80596 Summary: g++ generates incomplete DWARF debug information for array-typedefs Product: gcc Version: 6.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: paul.kaletta at intel dot com Target Milestone: --- The following observations apply to g++ 6.1.0 and earlier. Consider the following program: typedef int T_ACCESS_TECHNOLOGY; typedef T_ACCESS_TECHNOLOGY T_AT; typedef T_AT T_AT_ARRAY[5]; T_AT_ARRAY t_at_array; When compiled with gcc 6.1.0 (gcc -g -c sample.c -o sample_gcc.o), the generated DWARF looks as follows: < 1><0x0000001d GOFF=0x0000001d> DW_TAG_typedef DW_AT_name T_ACCESS_TECHNOLOGY DW_AT_decl_file 0x00000001 /home/pkaletta/gcc_bug/sample.c DW_AT_decl_line 0x00000001 DW_AT_type <0x00000028 GOFF=0x00000028> < 1><0x00000028 GOFF=0x00000028> DW_TAG_base_type DW_AT_byte_size 0x00000004 DW_AT_encoding DW_ATE_signed DW_AT_name int < 1><0x0000002f GOFF=0x0000002f> DW_TAG_typedef DW_AT_name T_AT DW_AT_decl_file 0x00000001 /home/pkaletta/gcc_bug/sample.c DW_AT_decl_line 0x00000002 DW_AT_type <0x0000001d GOFF=0x0000001d> < 1><0x0000003a GOFF=0x0000003a> DW_TAG_typedef DW_AT_name T_AT_ARRAY DW_AT_decl_file 0x00000001 /home/pkaletta/gcc_bug/sample.c DW_AT_decl_line 0x00000003 DW_AT_type <0x00000045 GOFF=0x00000045> < 1><0x00000045 GOFF=0x00000045> DW_TAG_array_type DW_AT_type <0x0000002f GOFF=0x0000002f> DW_AT_sibling <0x00000055 GOFF=0x00000055> < 2><0x0000004e GOFF=0x0000004e> DW_TAG_subrange_type DW_AT_type <0x00000055 GOFF=0x00000055> DW_AT_upper_bound 4 < 1><0x00000055 GOFF=0x00000055> DW_TAG_base_type DW_AT_byte_size 0x00000008 DW_AT_encoding DW_ATE_unsigned DW_AT_name sizetype < 1><0x0000005c GOFF=0x0000005c> DW_TAG_variable DW_AT_name t_at_array DW_AT_decl_file 0x00000001 /home/pkaletta/gcc_bug/sample.c DW_AT_decl_line 0x00000004 DW_AT_type <0x0000003a GOFF=0x0000003a> DW_AT_external yes(1) DW_AT_location len 0x0009: 031000000000000000: DW_OP_addr 0x00000010 When compiled with g++ (g++ -g -c sample.c -o sample_g++.o): < 1><0x0000001d GOFF=0x0000001d> DW_TAG_base_type DW_AT_byte_size 0x00000004 DW_AT_encoding DW_ATE_signed DW_AT_name int < 1><0x00000024 GOFF=0x00000024> DW_TAG_typedef DW_AT_name T_AT_ARRAY DW_AT_decl_file 0x00000001 /home/pkaletta/gcc_bug/sample.c DW_AT_decl_line 0x00000003 < 1><0x0000002b GOFF=0x0000002b> DW_TAG_base_type DW_AT_byte_size 0x00000008 DW_AT_encoding DW_ATE_unsigned DW_AT_name sizetype < 1><0x00000032 GOFF=0x00000032> DW_TAG_variable DW_AT_name t_at_array DW_AT_decl_file 0x00000001 /home/pkaletta/gcc_bug/sample.c DW_AT_decl_line 0x00000004 DW_AT_type <0x00000024 GOFF=0x00000024> DW_AT_external yes(1) DW_AT_location len 0x0009: 030000000000000000: DW_OP_addr 0x00000000 The debug info for C++ contains no trace of T_AT or T_ACCESS_TECHNOLOGY. The typedef DIE generated for T_AT_ARRAY looks bogus (typedef to void?). For earlier versions of g++ T_AT_ARRAY at least shows up as an array of 5 ints, but that does not seem right either. In my opinion g++ (for C++) should behave just like gcc (for C) does, and emit the entire chain of typedefs. In my specific scenario, I would like to run some scripts on all instances of T_ACCESS_TECHNOLOGY which is only possible if the type information is preserved in the debug info. Currently I can do this for C programs, but not for C++ programs. -fno-eliminate-unused-debug-types doesn't help, as g++ will emit the extra types, but fails to interconnect them.