I am not familiar with x86, my understanding of the generic SVR4 ABI is that cpic is a subset of PIC. IOWs, even if cpic code goes through GOT, it is just a performance issue. CPIC assumes that whatever is being accessed do not have to go through GOT. The side effect of which is that for symbols that are not pre-emptible, one does not have to have got entry. This is the only case that could cause problem. But a string in printf is not necessarily non-preemptible (I don't believe language says so, but i could be outdated now). Sun
On Thu, Jan 27, 2011 at 6:45 AM, Feng Zhou <fengzho...@gmail.com> wrote: > Hello, > > Attached is my fix to bug #721 > (https://bugs.open64.net/show_bug.cgi?id=721), can gatekeeper review this > fix for me please? Thank you very much. > > ============ > Bug Analysis > ============ > This bug happens with -Ofast -pie -fpie option on. However, it does not > happen at other optimization levels, say -O3. Further investigation shows > that even a very simple printf("hello world\n"); program shows the same > symptoms. This is caused by compiler generating wrong code for loading > string constant ("hello world"). When -pie option is on, the compiler should > not generate > the loading code using indirect load from GOT table (e.g. movq > $(.rodata),%rdi vs. leaq .rodata(%rip),%rdi). > > However, this difference is caused by the ipa. The problem is that with IPA > and -pie specified, ipa_link passes both -TENV:CPIC (-pic1) and -TENV:PIC to > subsequent compilation phases. However, these two options can not work > together, at least on X86-64. At first, the effect of -TNEV:PIC option is > nullified by -TENV:CPIC in common/com/config.cxx:1457 (if > (Gen_PIC_Call_Shared && Gen_PIC_Shared) Gen_PIC_Shared = FALSE). Then, the > effect of -TENV:CPIC is reset by common//com/x8664/config_targ.cxx:822: > > // TMP: ignore cpic until we figure out what to do with it > if (Gen_PIC_Call_Shared) > Gen_PIC_Call_Shared = FALSE; > > > Fix to this problem is to change IPA so that it does not pass -pic1 option > to subsequent phases when the target is X8664. It seems to me that > -TENV:CPIC is unsupported on X8664 in the compiler. > > -- Feng Zhou > > ------------------------------------------------------------------------------ > Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)! > Finally, a world-class log management solution at an even better price-free! > Download using promo code Free_Logger_4_Dev2Dev. Offer expires > February 28th, so secure your free ArcSight Logger TODAY! > http://p.sf.net/sfu/arcsight-sfd2d > _______________________________________________ > Open64-devel mailing list > Open64-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/open64-devel > > ------------------------------------------------------------------------------ Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)! Finally, a world-class log management solution at an even better price-free! Download using promo code Free_Logger_4_Dev2Dev. Offer expires February 28th, so secure your free ArcSight Logger TODAY! http://p.sf.net/sfu/arcsight-sfd2d _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel