https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87362

--- Comment #11 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #10)
> (In reply to Richard Biener from comment #9)
> > Created attachment 44729 [details]
> > patch
> > 
> > This avoids most of the forwarders (slightly hackish) and adds linkage 
> > names.
> > 
> > gdb startup is faster, more testing is in progress.
> 
> Hm.  Looks like we hit
> 
> Reading symbols from ../../obj3/gcc/lto1...done.
> ../../gdb/dictionary.c:690: internal-error: void
> insert_symbol_hashed(dictionary*, symbol*): Assertion `SYMBOL_LANGUAGE (sym)
> == DICT_LANGUAGE (dict)->la_language' failed.
> A problem internal to GDB has been detected,
> further debugging may prove unreliable.
> Quit this debugging session? (y or n) 
> 
> with the patch which somehow feels familiar ...
> 
> The performance testing was on an earlier patch w/o the abstract-origin fixes
> (just on-demand DIE creation).
> 
> The above also reproduces with gengtype (but not with a simple test).

OK, also genchecksum.  We see that for example on

  Compilation Unit @ offset 0x20a2:
   Length:        0x3b4 (32-bit)
   Version:       4
   Abbrev Offset: 0x83c
   Pointer Size:  8
 <0><20ad>: Abbrev Number: 1 (DW_TAG_compile_unit)
    <20ae>   DW_AT_producer    : (indirect string, offset: 0xe27): GNU C17
9.0.0
 20180919 (experimental) [trunk revision 259470] -mtune=generic -march=x86-64
-g -O2 -flto=jobserver -frandom-seed=1
    <20b2>   DW_AT_language    : 12     (ANSI C99)
    <20b3>   DW_AT_name        : (indirect string, offset: 0x1020):
/tmp/trunk/libiberty/xstrerror.c
...
 <2><244c>: Abbrev Number: 18 (DW_TAG_variable)
    <244d>   DW_AT_name        : (indirect string, offset: 0x1019): errstr
    <2451>   DW_AT_decl_file   : 7
    <2452>   DW_AT_decl_line   : 56
    <2453>   DW_AT_decl_column : 9
    <2454>   DW_AT_type        : <0x2122>

  Compilation Unit @ offset 0x245a:
   Length:        0x8df (32-bit)
   Version:       4
   Abbrev Offset: 0x93f
   Pointer Size:  8
 <0><2465>: Abbrev Number: 1 (DW_TAG_compile_unit)
    <2466>   DW_AT_producer    : (indirect string, offset: 0x1090): GNU GIMPLE
9
.0.0 20180919 (experimental) [trunk revision 259470] -mtune=generic
-march=x86-6
4 -mtune=generic -march=x86-64 -g -O2 -O2 -fno-openmp -fno-openacc
-frandom-seed
=1 -fno-exceptions -fasynchronous-unwind-tables -fno-common -fno-PIE -fltrans
    <246a>   DW_AT_language    : 4      (C++)
    <246b>   DW_AT_name        : (indirect string, offset: 0x106e):
<artificial>
...
 <1><2589>: Abbrev Number: 2 (DW_TAG_subprogram)
    <258a>   DW_AT_abstract_origin: <0x2434>
    <258e>   DW_AT_linkage_name: (indirect string, offset: 0x1041): xstrerror
    <2592>   DW_AT_low_pc      : 0x401300
    <259a>   DW_AT_high_pc     : 0x28
    <25a2>   DW_AT_frame_base  : 1 byte block: 9c       (DW_OP_call_frame_cfa)
    <25a4>   DW_AT_GNU_all_call_sites: 1
    <25a4>   DW_AT_sibling     : <0x264b>
...
 <2><25b5>: Abbrev Number: 4 (DW_TAG_variable)
    <25b6>   DW_AT_abstract_origin: <0x244c>
    <25ba>   DW_AT_location    : 0xfae (location list)
    <25be>   DW_AT_GNU_locviews: 0xfaa
 <1><2c4f>: Abbrev Number: 22 (DW_TAG_imported_unit)
    <2c50>   DW_AT_import      : <0x20ad>       [Abbrev Number: 1]

maybe because we "merge" languages in gen_compile_unit_die:

  /* If our producer is LTO try to figure out a common language to use
     from the global list of translation units.  */
  if (strcmp (language_string, "GNU GIMPLE") == 0)
    {
      unsigned i;
      tree t;
      const char *common_lang = NULL;

      FOR_EACH_VEC_SAFE_ELT (all_translation_units, i, t)
        {
          if (!TRANSLATION_UNIT_LANGUAGE (t))
            continue;
          if (!common_lang)
            common_lang = TRANSLATION_UNIT_LANGUAGE (t);
          else if (strcmp (common_lang, TRANSLATION_UNIT_LANGUAGE (t)) == 0)
            ;
          else if (strncmp (common_lang, "GNU C", 5) == 0
                    && strncmp (TRANSLATION_UNIT_LANGUAGE (t), "GNU C", 5) ==
0)
            /* Mixing C and C++ is ok, use C++ in that case.  */
            common_lang = highest_c_language (common_lang,
                                              TRANSLATION_UNIT_LANGUAGE (t));
          else
            {
              /* Fall back to C.  */
              common_lang = NULL;
              break;
            }
        }

or maybe because the DW_TAG_imported_unit is too late?  (I also see we have
duplicate imports at least with the patch).

Not sure what the correct representation is for abstract instances in a
C CU but the concrete instance being "inlined" out-of-line into a C++ CU.

Reply via email to