Hi,
I updated my firefox tree and now I get ICE at:

/aux/hubicka/firefox2/firefox/intl/icu/source/i18n/ucol_bld.cpp:1274:51: note: 
in statement
                         el.prefix = el.prefixChars;
                                                   ^
# .MEM_339 = VDEF <.MEM_338>
el.prefix = &el.prefixChars;
lto1: error: address taken, but ADDRESSABLE bit not set

The variable have correctly set TREE_ADDRESSABLE bit in the LTO stream, but the 
bit is cleared
when doing TODO after inlining into completely different function.  This is 
becuase the
variable appears incorreclty in local_decls in that function. It is added there 
by inliner
by:
static tree
remap_decls (tree decls, vec<tree, va_gc> **nonlocalized_list,
             copy_body_data *id)
{
  tree old_var;
  tree new_decls = NULL_TREE;

  /* Remap its variables.  */
  for (old_var = decls; old_var; old_var = DECL_CHAIN (old_var))
    {
      tree new_var;

      if (can_be_nonlocal (old_var, id))
        {
          /* We need to add this variable to the local decls as otherwise
             nothing else will do so.  */
          if (TREE_CODE (old_var) == VAR_DECL
              && ! DECL_EXTERNAL (old_var))
            add_local_decl (cfun, old_var);

(while remapping BLOCK of the function being inlined that is yet another 
function).
This reason is that old_var appears incorrectly in the BLOCK_VARS list because 
that
list starts by IMPORT_DECL that is streamed into global stream and then inserted
into multiple lists resulting in a bad soup.

The following patch seems to fix it. I think we can safely duplicate this beast 
into
each function that use it.

Bootstrap/regtested in progress, tested with firefox.

Honza

        * lto-streamer-out.c (tree_is_indexable): Imported_decl is not 
indexable.
Index: lto-streamer-out.c
===================================================================
--- lto-streamer-out.c  (revision 212479)
+++ lto-streamer-out.c  (working copy)
@@ -139,6 +139,9 @@ tree_is_indexable (tree t)
      definition.  */
   if (TREE_CODE (t) == PARM_DECL || TREE_CODE (t) == RESULT_DECL)
     return variably_modified_type_p (TREE_TYPE (DECL_CONTEXT (t)), NULL_TREE);
+  /* IMPORTED_DECL is put into BLOCK and thus it never can be shared.  */
+  else if (TREE_CODE (t) == IMPORTED_DECL)
+    return false;
   else if (((TREE_CODE (t) == VAR_DECL && !TREE_STATIC (t))
            || TREE_CODE (t) == TYPE_DECL
            || TREE_CODE (t) == CONST_DECL

Reply via email to