This patch fixed google bug entry 6124850.

The usage of varpool_node has some restrictions on the corresponding var decl.
In LIPO mode function notice_global_symbol may call varpool_node with a decl
that doesn't satisfy these restrictions since the function notice_global_symbol
can be directly or indirectly called from anywhere. So we need to check if
a decl can be safely passed into varpoo_node before calling it.

Tested by ./buildit with targets x86-64 and power64 without regression.

OK for google branches?

thanks
Carrot


2013-05-09  Guozhi Wei  <car...@google.com>

        varasm.c (notice_global_symbol): Check conditions before calling
        varpool_node.


Index: varasm.c
===================================================================
--- varasm.c (revision 198726)
+++ varasm.c (working copy)
@@ -1515,13 +1515,29 @@
       || !MEM_P (DECL_RTL (decl)))
     return;

-  if (L_IPO_COMP_MODE
-      && ((TREE_CODE (decl) == FUNCTION_DECL
-           && cgraph_is_auxiliary (decl))
-          || (TREE_CODE (decl) == VAR_DECL
-              && varpool_is_auxiliary (varpool_node (decl)))))
-    return;
+  if (L_IPO_COMP_MODE)
+    {
+      if (TREE_CODE (decl) == FUNCTION_DECL && cgraph_is_auxiliary (decl))
+ return;

+      if (TREE_CODE (decl) == VAR_DECL)
+ {
+  /* Varpool_node can only accept var decl with flags
+     (TREE_STATIC (decl) || DECL_EXTERNAL (decl))
+     For decl without these flags, we need to
+     check if it is auxiliary manually.  */
+  if (!(TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
+    {
+      /* If a new varpool_node can be created,
+         the module id is current_module_id.  */
+      if (current_module_id != primary_module_id)
+ return;
+    }
+  else if (varpool_is_auxiliary (varpool_node (decl)))
+    return;
+ }
+    }
+
   /* We win when global object is found, but it is useful to know about weak
      symbol as well so we can produce nicer unique names.  */
   if (DECL_WEAK (decl) || DECL_ONE_ONLY (decl) || flag_shlib)

Reply via email to