re PR lto/85078 (LTO ICE: tree check: expected tree that contains 'decl minimal'...
authorJan Hubicka <jh@suse.cz>
Tue, 10 Apr 2018 06:33:38 +0000 (08:33 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 10 Apr 2018 06:33:38 +0000 (06:33 +0000)
PR lto/85078
* ipa-devirt.c (rebuild_type_inheritance-hash): New.
* ipa-utils.h (rebuild_type_inheritance-hash): Declare.
* tree.c (free_lang_data_in_type): Fix handling of binfos;
walk basetypes.
(free_lang_data): Rebuild type inheritance graph.
* g++.dg/torture/pr85078.C: New.

From-SVN: r259264

gcc/ChangeLog
gcc/ipa-devirt.c
gcc/ipa-utils.h
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr85078.C [new file with mode: 0644]
gcc/tree.c

index 368db649e16805c17297df90545aa98b1fdf1d45..0f5a8b25c0d20f23e5cc3edf41cca7cddc116a20 100644 (file)
@@ -1,3 +1,12 @@
+2018-04-09  Jan Hubicka  <jh@suse.cz>
+
+       PR lto/85078
+       * ipa-devirt.c (rebuild_type_inheritance-hash): New.
+       * ipa-utils.h (rebuild_type_inheritance-hash): Declare.
+       * tree.c (free_lang_data_in_type): Fix handling of binfos;
+       walk basetypes.
+       (free_lang_data): Rebuild type inheritance graph.
+
 2018-04-09  Martin Sebor  <msebor@redhat.com>
 
        * invoke.texi (-finline-small-functions): Mention other optimization
index 30d37574bbec45bfc6accfb0ef3ed7c3d86a56b6..fa9380cce80ecdeb5a9f06fbe727cf6fe1031594 100644 (file)
@@ -2702,6 +2702,24 @@ free_polymorphic_call_targets_hash ()
     }
 }
 
+/* Force rebuilding type inheritance graph from scratch.
+   This is use to make sure that we do not keep references to types
+   which was not visible to free_lang_data.  */
+
+void
+rebuild_type_inheritance_graph ()
+{
+  if (!odr_hash)
+    return;
+  delete odr_hash;
+  if (in_lto_p)
+    delete odr_vtable_hash;
+  odr_hash = NULL;
+  odr_vtable_hash = NULL;
+  odr_types_ptr = NULL;
+  free_polymorphic_call_targets_hash ();
+}
+
 /* When virtual function is removed, we may need to flush the cache.  */
 
 static void
index 61761895c5ce30b3e8b42261f31265392a9d371d..1609ac14d7fbea5da73cc5f6806807d7fbe4ff91 100644 (file)
@@ -55,6 +55,7 @@ bool ipa_propagate_frequency (struct cgraph_node *node);
 struct odr_type_d;
 typedef odr_type_d *odr_type;
 void build_type_inheritance_graph (void);
+void rebuild_type_inheritance_graph (void);
 void update_type_inheritance_graph (void);
 vec <cgraph_node *>
 possible_polymorphic_call_targets (tree, HOST_WIDE_INT,
index 260150c3da2216322c6a79c3614a3b5dfd7bf306..85392f68f29a1459bd9280a087c751172d0ca383 100644 (file)
@@ -1,3 +1,8 @@
+2018-04-09  Jan Hubicka  <jh@suse.cz>
+
+       PR lto/85078
+       * g++.dg/torture/pr85078.C: New.
+
 2018-04-09  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/85227
diff --git a/gcc/testsuite/g++.dg/torture/pr85078.C b/gcc/testsuite/g++.dg/torture/pr85078.C
new file mode 100644 (file)
index 0000000..de512bd
--- /dev/null
@@ -0,0 +1,40 @@
+typedef __builtin_va_list a;
+
+class b
+{
+public:
+  virtual void c (int, const char *, a &);
+  char d;
+  void m_fn2 ()
+  {
+    a a;
+    c (2, &d, a);
+  }
+};
+
+class e:b
+{
+  virtual void f ()
+  {
+  }
+  void c (int, const char *, a &);
+};
+
+class g
+{
+protected:
+  b h;
+};
+
+class i:g
+{
+  int j ();
+};
+
+int
+i::j ()
+{
+  h.m_fn2 ();
+  return 0;
+}
+
index 8ae9ec800b8f34e2780f1bc029d65b802b4d1c51..e93f24dd4d30f24df6e25c398a9d063edee7f7fb 100644 (file)
@@ -5521,7 +5521,8 @@ find_decls_types_r (tree *tp, int *ws, void *data)
          tree tem;
          FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (TYPE_BINFO (t)), i, tem)
            fld_worklist_push (TREE_TYPE (tem), fld);
-         fld_worklist_push (BINFO_VIRTUALS (TYPE_BINFO (t)), fld);
+         fld_worklist_push (BINFO_TYPE (TYPE_BINFO (t)), fld);
+         fld_worklist_push (BINFO_VTABLE (TYPE_BINFO (t)), fld);
        }
       if (RECORD_OR_UNION_TYPE_P (t))
        {
@@ -5540,6 +5541,8 @@ find_decls_types_r (tree *tp, int *ws, void *data)
              tem = TREE_CHAIN (tem);
            }
        }
+      if (FUNC_OR_METHOD_TYPE_P (t))
+       fld_worklist_push (TYPE_METHOD_BASETYPE (t), fld);
 
       fld_worklist_push (TYPE_STUB_DECL (t), fld);
       *ws = 0;
@@ -5859,6 +5862,8 @@ free_lang_data (void)
   /* Reset diagnostic machinery.  */
   tree_diagnostics_defaults (global_dc);
 
+  rebuild_type_inheritance_graph ();
+
   return 0;
 }