On Tue, Feb 3, 2015 at 1:29 PM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Tue, Feb 3, 2015 at 1:20 PM, Sriraman Tallam <tmsri...@google.com> wrote: >> On Tue, Feb 3, 2015 at 11:36 AM, Jakub Jelinek <ja...@redhat.com> wrote: >>> On Tue, Feb 03, 2015 at 11:25:38AM -0800, Sriraman Tallam wrote: >>>> This was the original patch to i386.c to let global accesses take >>>> advantage of copy relocations and avoid the GOT. >>>> >>>> >>>> @@ -13113,7 +13113,11 @@ legitimate_pic_address_disp_p (rtx disp) >>>> return true; >>>> } >>>> else if (!SYMBOL_REF_FAR_ADDR_P (op0) >>>> - && SYMBOL_REF_LOCAL_P (op0) >>>> + && (SYMBOL_REF_LOCAL_P (op0) >>>> + || (HAVE_LD_PIE_COPYRELOC >>>> + && flag_pie >>>> + && !SYMBOL_REF_WEAK (op0) >>>> + && !SYMBOL_REF_FUNCTION_P (op0))) >>>> && ix86_cmodel != CM_LARGE_PIC) >>>> >>>> I do not understand here why weak global data access must go through >>>> the GOT and not use copy relocations. Ultimately, there is only going >>>> to be one copy of the global either defined in the executable or the >>>> shared object right? >>>> >>>> Can we remove the check for SYMBOL_REF_WEAK? >>> >>> So, what will then happen if the weak undef symbol isn't defined anywhere? >>> In non-PIE binaries that is fine, the linker will store 0. >>> But in PIE binaries, the 0 would be biased by the PIE load bias and thus >>> wouldn't be NULL. >> >> Thanks for clarifying. >> >>> You can only optimize weak vars if there is some weak definition in the >>> current TU. >> >> Would this be fine then? Replace !SYMBOL_REF_WEAK (op0) with >> >> !(SYMBOL_REF_WEAK (op0) && SYMBOL_REF_EXTERNAL_P (op0)) >> > > The full condition is: > > && (SYMBOL_REF_LOCAL_P (op0) > || (HAVE_LD_PIE_COPYRELOC > && flag_pie > && !SYMBOL_REF_WEAK (op0) > && !SYMBOL_REF_FUNCTION_P (op0))) > > If the weak op0 is defined in the current TU, shouldn't > SYMBOL_REF_LOCAL_P (op0) be true for PIE?
Thats not what I see for this: zap.cc --------- __attribute__((weak)) int glob; int main() { printf("%d\n", glob); } (gdb) p debug_rtx(op0) (symbol_ref/i:DI ("glob") <var_decl 0x7ffff74f51c8 glob>) (gdb) p SYMBOL_REF_LOCAL_P(op0) $4 = false (gdb) p SYMBOL_REF_WEAK (op0) $5 = 1 (gdb) p SYMBOL_REF_EXTERNAL_P (op0) $6 = false Thanks Sri > > -- > H.J.