http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54709



Richard Guenther <rguenth at gcc dot gnu.org> changed:



           What    |Removed                     |Added

----------------------------------------------------------------------------

                 CC|                            |hubicka at gcc dot gnu.org



--- Comment #7 from Richard Guenther <rguenth at gcc dot gnu.org> 2012-09-26 
13:33:07 UTC ---

For non-LTO binds_local_p says no to memcpy, for LTO it says yes.



  else if (TREE_CODE (exp) == FUNCTION_DECL && TREE_PUBLIC (exp))

    {

      struct cgraph_node *node = cgraph_get_node (exp);

      if (node

          && resolution_local_p (node->symbol.resolution))

        resolved_locally = true;



makes the difference because we have a resolution recorded (resoved_ir) and

that makes us skip





  /* Variables defined outside this object might not be local.  */

  else if (DECL_EXTERNAL (exp) && !resolved_locally)

    local_p = false;



and fall into



  /* If defined in this object and visibility is not default, must be

     local.  */

  else if (DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT)

    local_p = true;



which says "defined in this object" but doesn't check that (well,

the resolution is wrong).



The resolutions from the linker are just



2

t1.o 1

165 beb4fef7e77e8790 PREVAILING_DEF_IRONLY foo

t2.o 1

165 6eae315f149cc09b PREVAILING_DEF_IRONLY bar



but lto_symtab_resolve_symbols assigns LDPR_RESOLVED_IR :(

Reply via email to