From ce2f49b3bf9fa7ca16ab1162b1ad231287e0067c Mon Sep 17 00:00:00 2001
From: Richard Biener <rguenther@suse.de>
Date: Wed, 19 Mar 2014 15:37:28 +0000
Subject: [PATCH] re PR c++/60553 (segfault in gt_ggc_mx_lang_tree_node in
 Chromium with LTO)

2014-03-19  Richard Biener  <rguenther@suse.de>

	PR middle-end/60553
	* tree-core.h (tree_type_common): Re-order pointer members
	to reduce recursion depth during GC walks.

	lto/
	* lto-tree.h (lang_tree_node): For types use TYPE_NEXT_VARIANT
	instead of TREE_CHAIN as chain_next.

From-SVN: r208682
---
 gcc/ChangeLog      | 6 ++++++
 gcc/lto/ChangeLog  | 6 ++++++
 gcc/lto/lto-tree.h | 2 +-
 gcc/tree-core.h    | 4 ++--
 4 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3ab789a42a14..23d60ec23c58 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2014-03-19  Richard Biener  <rguenther@suse.de>
+
+	PR middle-end/60553
+	* tree-core.h (tree_type_common): Re-order pointer members
+	to reduce recursion depth during GC walks.
+
 2014-03-19  Marek Polacek  <polacek@redhat.com>
 
 	PR sanitizer/60569
diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog
index 101fbfb7b259..ad806db7d761 100644
--- a/gcc/lto/ChangeLog
+++ b/gcc/lto/ChangeLog
@@ -1,3 +1,9 @@
+2014-03-19  Richard Biener  <rguenther@suse.de>
+
+	PR middle-end/60553
+	* lto-tree.h (lang_tree_node): For types use TYPE_NEXT_VARIANT 
+	instead of TREE_CHAIN as chain_next.
+
 2014-03-19  Richard Biener  <rguenther@suse.de>
 
 	* lto.c (lto_wpa_write_files): Move call to
diff --git a/gcc/lto/lto-tree.h b/gcc/lto/lto-tree.h
index d8d22333d41d..b1c3d2a848a2 100644
--- a/gcc/lto/lto-tree.h
+++ b/gcc/lto/lto-tree.h
@@ -48,7 +48,7 @@ enum lto_tree_node_structure_enum {
 };
 
 union GTY((desc ("lto_tree_node_structure (&%h)"),
-	  chain_next ("CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_COMMON) ? ((union lang_tree_node *) TREE_CHAIN (&%h.generic)) : NULL")))
+	  chain_next ("CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_TYPE_COMMON) ? ((union lang_tree_node *) %h.generic.type_common.next_variant) : CODE_CONTAINS_STRUCT (TREE_CODE (&%h.generic), TS_COMMON) ? ((union lang_tree_node *) %h.generic.common.chain) : NULL")))
     lang_tree_node
 {
   union tree_node GTY ((tag ("TS_LTO_GENERIC"),
diff --git a/gcc/tree-core.h b/gcc/tree-core.h
index e548a0dd37d1..a2dc387d647c 100644
--- a/gcc/tree-core.h
+++ b/gcc/tree-core.h
@@ -1265,11 +1265,11 @@ struct GTY(()) tree_type_common {
     const char * GTY ((tag ("TYPE_SYMTAB_IS_POINTER"))) pointer;
     struct die_struct * GTY ((tag ("TYPE_SYMTAB_IS_DIE"))) die;
   } GTY ((desc ("debug_hooks->tree_type_symtab_field"))) symtab;
-  tree name;
+  tree canonical;
   tree next_variant;
   tree main_variant;
   tree context;
-  tree canonical;
+  tree name;
 };
 
 struct GTY(()) tree_type_with_lang_specific {
-- 
GitLab