Looks good to me. Thank you very much. 2012/3/5 Gang Yu <yugang...@gmail.com>: > Thanks for Jian-xin's review. > > Below is the improved patch, with no absolute%%ebx in the asm_string. > > index e75ebdc..54aa950 100644 > --- a/osprey/be/cg/cgemit.cxx > +++ b/osprey/be/cg/cgemit.cxx > @@ -3350,8 +3350,20 @@ Modify_Asm_String (char* asm_string, UINT32 position, > bool memory, > > #endif > if( base_ofst == 0 ){ > #if defined(TARG_X8664) > - if( Is_Target_32bit() ) > - sprintf( buf, "%s", name ); > + // open64.net bug951. > + // Format IA32 GOT symbol in Asm_String. > + if( Is_Target_32bit() ) { > + switch (TN_relocs(tn)) { > + case TN_RELOC_IA32_GOT: > + sprintf( buf, > + "%s@GOT(%s)", > + name, > + int_reg_names[3][TN_register(Ebx_TN())- > REGISTER_MIN]); > > + break; > + default: > + sprintf( buf, "%s", name); > + } > + } > else > sprintf( buf, "%s(%%rip)", name ); > #else > @@ -3359,8 +3371,21 @@ Modify_Asm_String (char* asm_string, UINT32 position, > bool memory, > > #endif > } else > #if defined(TARG_X8664) > - if( Is_Target_32bit() ) > - sprintf( buf, "%s+%d", name, (int)base_ofst ); > + // open64.net bug951. > + // Format IA32 GOTOFF symbol in Asm_String. > + if( Is_Target_32bit() ) { > + switch (TN_relocs(tn)) { > + case TN_RELOC_IA32_GOTOFF: > + sprintf( buf, > + "%s@GOTOFF+%d(%s)", > + name, > + (int)base_ofst, > + int_reg_names[3][TN_register(Ebx_TN())- > REGISTER_MIN]); > + break; > + default: > > + sprintf( buf, "%s+%d", name, (int)base_ofst ); > + } > + } > else > sprintf( buf, "%s+%d(%%rip)", name, (int)base_ofst ); > #else > diff --git a/osprey/be/cg/x8664/cgtarget.cxx > b/osprey/be/cg/x8664/cgtarget.cxx > index 89f89d6..e78cbf9 100644 > --- a/osprey/be/cg/x8664/cgtarget.cxx > +++ b/osprey/be/cg/x8664/cgtarget.cxx > @@ -3908,7 +3908,15 @@ TN* CGTARG_Process_Asm_m_constraint( WN* load, void** > offset, OPS* ops ) > if( WN_operator(load) == OPR_LDA ){ > OP* lda_op = OPS_last( ops ); > - asm_opnd = OP_iadd(lda_op) ? OP_opnd( lda_op, 1 ) : OP_opnd( lda_op, 0 > ); > + // open64.net bug951. On finding the symbol TN, don't miss the cases > of: > + // TN :- ld32 GTN2(%rbx) (sym:base_sym +0) > + // TN :- lea32 GTN2(%rbx) (sym:base_sym+base_ofst) > + if (Is_Target_32bit() && Gen_PIC_Shared) { > + asm_opnd = OP_iadd(lda_op) ? OP_opnd( lda_op, 1 ) : > + (OP_code(lda_op) == TOP_ldc32) ? OP_opnd( lda_op, 0) : OP_opnd( > lda_op, 1); > + } else { > + asm_opnd = OP_iadd(lda_op) ? OP_opnd( lda_op, 1 ) : OP_opnd( lda_op, > 0 ); > + } > OPS_Remove_Op( ops, lda_op ); > } else if( WN_operator(load) == OPR_ADD ){ > diff --git a/osprey/be/cg/x8664/exp_loadstore.cxx > b/osprey/be/cg/x8664/exp_loadstore.cxx > index 99bde2c..58cb61e 100644 > --- a/osprey/be/cg/x8664/exp_loadstore.cxx > +++ b/osprey/be/cg/x8664/exp_loadstore.cxx > @@ -1267,17 +1267,29 @@ Exp_Ldst ( > STB_section(base_sym) /* bug 10097 */)) ){ > FmtAssert(!ST_is_thread_local(base_sym), > ("Exp_Ldst: thread-local storage NYI under PIC")); > - TN* tmp = base_ofst == 0 ? tn : Build_TN_Like(tn); > - Build_OP( TOP_ld32, tmp, Ebx_TN(), > - Gen_Symbol_TN( base_sym, 0, TN_RELOC_IA32_GOT ), > - &newops ); > + > + // open64.net bug951. > + // when base_ofst ! = 0, we generate > + // TN :- lea32 GTN2(%rbx) (sym:base_sym+base_ofst) > + // instead of > + // tmp_TN :- ld32 GT2(%bx) (sym:base_sym + 0) > + // TN :- lea32 tmp_TN base_ofst > + // this is for consideration of facilitate restoring the register > TN > + // to symbol TN in ASM m constraint. > + // And also this reduces a temp TN. > + > + if (base_ofst == 0) > + Build_OP( TOP_ld32, tn, Ebx_TN(), > + Gen_Symbol_TN( base_sym, base_ofst, TN_RELOC_IA32_GOT > ), > + &newops ); > + else > + Build_OP( TOP_lea32, tn, Ebx_TN(), > + Gen_Symbol_TN( base_sym, base_ofst, > TN_RELOC_IA32_GOTOFF ), > + &newops ); > // got address should not alias > Set_OP_no_alias(OPS_last(&newops)); > PU_References_GOT = TRUE; > - if( base_ofst != 0 ){ > - Build_OP( TOP_lea32, tn, tmp, Gen_Literal_TN(base_ofst, 4), > &newops ); > - } > } else { > Build_OP( TOP_ldc32, tn, > Gen_Symbol_TN( base_sym, base_ofst, TN_RELOC_NONE ), > > > Regards > Gang > > > On Fri, Feb 24, 2012 at 2:30 PM, Gang Yu <yugang...@gmail.com> wrote: >> >> Hi, >> >> Could a gatekeeper please help review the fix for >> bug951(http://bugs.open64.net/show_bug.cgi?id=951)? >> >> The cut-down bugcase: >> typedef union { >> } GenefxAccumulator; >> >> struct _GenefxState { >> int length; >> void *Aop[3]; >> int AopY; >> GenefxAccumulator *Dacc; >> GenefxAccumulator *Sacc; >> }; >> >> typedef struct _GenefxState GenefxState; >> int main(void) >> { >> GenefxState *gfxs; >> static const u32 preload[] = { 0xFF00FF00, 0x0000FF00 }; >> static const u32 mask[] = { 0x00FC00F8, 0x000000F8 }; >> static const u32 pm[] = { 0x01000004, 0x00000004 }; >> __asm__ __volatile__ ( >> "movq %3, %%mm7\n\t" >> : >> : "D" (gfxs->Aop[0]), "c" (gfxs->length), "S" (gfxs->Sacc), >> "m" (*preload), "m" (*mask), "m" (*pm) >> : "%eax", "%st", "memory"); >> return 0; >> } >> >> opencc -m32 -fpic -S bug951.c >> and opencc asserts: >> ### Assertion failure at line 3377 of >> /fc/proj/ctires/open64/o64guru/src/Thu/trunk/osprey/be/cg/cgemit.cxx: >> ### Compiler Error in file bug951.c during Assembly phase: >> ### ASM operand must be a register or a numeric constant >> >> Analysis: >> The CGIR after code expansion phase for the asm statement is below: >> >> [ 58, 0] TN150 :- ld32 TN4(%rsp) (sym:gfxs+0) ; WN id:17 gfxs+0x0 >> [ 58, 0] TN5(%rdi) :- ld32 TN150 (0x8) ; WN id:23 >> [ 58, 0] TN8(%rcx) :- ld32 TN150 (0x0) ; WN id:24 >> [ 58, 0] TN6(%rsi) :- ld32 TN150 (0x1c) ; WN id:25 >> [ 58, 0] TN153 :- ld32 TN2(%rbx) (sym:.data.rel.ro.local+0) ; noalias WN >> [ 58, 0] TN155 :- ld32 TN2(%rbx) (sym:.data.rel.ro.local+0) ; noalias WN >> [ 58, 0] :- asm TN5(%rdi) TN8(%rcx) TN6(%rsi) TN2(%rbx) (0x10) (0x20) ; >> volatile side_effects >> ----------------------------------------------------------------------- >> >> Obviously the asm stmt is unexpected, 0x10 as literal TN should not be "m" >> constraint. "m" constraint in the ASM statement which is a constant address >> should be symbol tn, not register tn, nor literal tn. >> >> The expected result should be >> [ 22, 0] TN149 :- ld32 TN4(%rsp) (sym:gfxs+0) ; WN id:9 gfxs+0x0 >> [ 22, 0] TN5(%rdi) :- ld32 TN149 (0x4) ; WN id:10 >> [ 22, 0] TN8(%rcx) :- ld32 TN149 (0x0) ; WN id:11 >> [ 22, 0] TN6(%rsi) :- ld32 TN149 (0x18) ; WN id:12 >> [ 22, 0] :- asm TN5(%rdi) TN8(%rcx) TN6(%rsi) (sym:.data.rel.ro.local+0) >> (sym:.data.rel.ro.local+16) (sym:.data.rel.ro.local+32) ; volatile >> side_effects >> >> Investigate shows we miss the -m32 LDA_handling cases in >> CGTARG_Asm_m_constraint. >> asm_opnd = OP_iadd(lda_op) ? OP_opnd( lda_op, 1 ) : OP_opnd( lda_op, 0 ); >> does not work for all cases. >> >> Suggested fix: >> >> use TN_RELOC_IA32_GOTOFF instead of TN_RELOC_IA32_GOT to load addresses >> for symbols with offset, so to match the handling in ASM_m_constraint. >> >> below is the patch: >> >> index e75ebdc..ba246fd 100644 >> --- a/osprey/be/cg/cgemit.cxx >> +++ b/osprey/be/cg/cgemit.cxx >> @@ -3350,8 +3350,17 @@ Modify_Asm_String (char* asm_string, UINT32 >> position, bool memory, >> #endif >> if( base_ofst == 0 ){ >> #if defined(TARG_X8664) >> - if( Is_Target_32bit() ) >> - sprintf( buf, "%s", name ); >> + // open64.net bug951. >> + // Format IA32 GOT symbol in Asm_String. >> + if( Is_Target_32bit() ) { >> + switch (TN_relocs(tn)) { >> + case TN_RELOC_IA32_GOT: >> + sprintf( buf, "%s@GOT(%%ebx)", name ); >> + break; >> + default: >> + sprintf( buf, "%s", name); >> + } >> + } >> else >> sprintf( buf, "%s(%%rip)", name ); >> #else >> @@ -3359,8 +3368,17 @@ Modify_Asm_String (char* asm_string, UINT32 >> position, bool memory, >> #endif >> } else >> #if defined(TARG_X8664) >> - if( Is_Target_32bit() ) >> - sprintf( buf, "%s+%d", name, (int)base_ofst ); >> + // open64.net bug951. >> + // Format IA32 GOTOFF symbol in Asm_String. >> + if( Is_Target_32bit() ) { >> + switch (TN_relocs(tn)) { >> + case TN_RELOC_IA32_GOTOFF: >> + sprintf( buf, "%s@GOTOFF+%d(%%ebx)", name, (int)base_ofst); >> + break; >> + default: >> + sprintf( buf, "%s+%d", name, (int)base_ofst ); >> + } >> + } >> else >> sprintf( buf, "%s+%d(%%rip)", name, (int)base_ofst ); >> #else >> diff --git a/osprey/be/cg/x8664/cgtarget.cxx >> b/osprey/be/cg/x8664/cgtarget.cxx >> index 89f89d6..e78cbf9 100644 >> --- a/osprey/be/cg/x8664/cgtarget.cxx >> +++ b/osprey/be/cg/x8664/cgtarget.cxx >> @@ -3908,7 +3908,15 @@ TN* CGTARG_Process_Asm_m_constraint( WN* load, >> void** offset, OPS* ops ) >> >> if( WN_operator(load) == OPR_LDA ){ >> OP* lda_op = OPS_last( ops ); >> - asm_opnd = OP_iadd(lda_op) ? OP_opnd( lda_op, 1 ) : OP_opnd( lda_op, >> 0 ); >> + // open64.net bug951. On finding the symbol TN, don't miss the cases >> of: >> + // TN :- ld32 GTN2(%rbx) (sym:base_sym +0) >> + // TN :- lea32 GTN2(%rbx) (sym:base_sym+base_ofst) >> + if (Is_Target_32bit() && Gen_PIC_Shared) { >> + asm_opnd = OP_iadd(lda_op) ? OP_opnd( lda_op, 1 ) : >> + (OP_code(lda_op) == TOP_ldc32) ? OP_opnd( lda_op, 0) : OP_opnd( >> lda_op, 1); >> + } else { >> + asm_opnd = OP_iadd(lda_op) ? OP_opnd( lda_op, 1 ) : OP_opnd( >> lda_op, 0 ); >> + } >> OPS_Remove_Op( ops, lda_op ); >> >> } else if( WN_operator(load) == OPR_ADD ){ >> diff --git a/osprey/be/cg/x8664/exp_loadstore.cxx >> b/osprey/be/cg/x8664/exp_loadstore.cxx >> index 99bde2c..58cb61e 100644 >> --- a/osprey/be/cg/x8664/exp_loadstore.cxx >> +++ b/osprey/be/cg/x8664/exp_loadstore.cxx >> @@ -1267,17 +1267,29 @@ Exp_Ldst ( >> STB_section(base_sym) /* bug 10097 */)) ){ >> FmtAssert(!ST_is_thread_local(base_sym), >> ("Exp_Ldst: thread-local storage NYI under PIC")); >> - TN* tmp = base_ofst == 0 ? tn : Build_TN_Like(tn); >> - Build_OP( TOP_ld32, tmp, Ebx_TN(), >> - Gen_Symbol_TN( base_sym, 0, TN_RELOC_IA32_GOT ), >> - &newops ); >> + >> + // open64.net bug951. >> + // when base_ofst ! = 0, we generate >> + // TN :- lea32 GTN2(%rbx) (sym:base_sym+base_ofst) >> + // instead of >> + // tmp_TN :- ld32 GT2(%bx) (sym:base_sym + 0) >> + // TN :- lea32 tmp_TN base_ofst >> + // this is for consideration of facilitate restoring the >> register TN >> + // to symbol TN in ASM m constraint. >> + // And also this reduces a temp TN. >> + >> + if (base_ofst == 0) >> + Build_OP( TOP_ld32, tn, Ebx_TN(), >> + Gen_Symbol_TN( base_sym, base_ofst, >> TN_RELOC_IA32_GOT ), >> + &newops ); >> + else >> + Build_OP( TOP_lea32, tn, Ebx_TN(), >> + Gen_Symbol_TN( base_sym, base_ofst, >> TN_RELOC_IA32_GOTOFF ), >> + &newops ); >> // got address should not alias >> Set_OP_no_alias(OPS_last(&newops)); >> PU_References_GOT = TRUE; >> >> - if( base_ofst != 0 ){ >> - Build_OP( TOP_lea32, tn, tmp, Gen_Literal_TN(base_ofst, 4), >> &newops ); >> - } >> } else { >> Build_OP( TOP_ldc32, tn, >> Gen_Symbol_TN( base_sym, base_ofst, TN_RELOC_NONE ), >> >> TIA for the review. >> >> Regards >> Gang > > > > ------------------------------------------------------------------------------ > Try before you buy = See our experts in action! > The most comprehensive online learning library for Microsoft developers > is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3, > Metro Style Apps, more. Free future releases when you subscribe now! > http://p.sf.net/sfu/learndevnow-dev2 > _______________________________________________ > Open64-devel mailing list > Open64-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/open64-devel >
-- Regards, Lai Jian-Xin ------------------------------------------------------------------------------ Try before you buy = See our experts in action! The most comprehensive online learning library for Microsoft developers is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3, Metro Style Apps, more. Free future releases when you subscribe now! http://p.sf.net/sfu/learndevnow-dev2 _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel