Hi,
extra sanity checking I added while debugging PR 65316 noticed that the
type inheritance graph builder gets confused when one merges unit compiled
with -g -fno-devirtualize and unit compiled with -fdevirtualize.
In the first case there may be a base type lost.

Bootstrapped/regtested x86_64-linux, comitted.
        PR ipa/65316
        * tree.c (free_lang_data_in_type): Be sure to keep BINFO_VTABLE
        when outputting debug.

Index: tree.c
===================================================================
--- tree.c      (revision 221223)
+++ tree.c      (working copy)
@@ -5081,9 +5081,15 @@ free_lang_data_in_type (tree type)
       if (TYPE_BINFO (type))
        {
          free_lang_data_in_binfo (TYPE_BINFO (type));
+         /* We need to preserve link to bases and virtual table for all
+            polymorphic types to make devirtualization machinery working.
+            Debug output cares only about bases, but output also
+            virtual table pointers so merging of -fdevirtualize and
+            -fno-devirtualize units is easier.  */
          if ((!BINFO_VTABLE (TYPE_BINFO (type))
               || !flag_devirtualize)
-             && (!BINFO_N_BASE_BINFOS (TYPE_BINFO (type))
+             && ((!BINFO_N_BASE_BINFOS (TYPE_BINFO (type))
+                  && !BINFO_VTABLE (TYPE_BINFO (type)))
                  || debug_info_level != DINFO_LEVEL_NONE))
            TYPE_BINFO (type) = NULL;
        }

Reply via email to