Hi, while comparing LTO and non-LTO builds I noticed that with LTO we produce a lot more vtables in datal.rel.ro rather than data.rel.ro.local This is because of partitioning promoting more symbols global. For RTL we make section decisions based on SYMBOL_REF_LOCAL_FLAG that is set based on decl_binds_local_p. For variables we use TREE_PUBLIC check that is overly conservative.
Bootstrapped/regtested x86_64-linux, OK? * varasm.c (compute_reloc_for_constant): Use targetm.binds_local_p instead of TREE_PUBLIC to determine if reference will be local within given DSO or not. Index: varasm.c =================================================================== --- varasm.c (revision 206684) +++ varasm.c (working copy) @@ -4060,7 +4060,7 @@ break; } - if (TREE_PUBLIC (tem)) + if (!targetm.binds_local_p (tem)) reloc |= 2; else reloc |= 1;