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)