write a program with file scope var and part of the name is "anon" and see what class you will get with your change Sun
On Fri, Apr 20, 2012 at 3:05 PM, Gang Yu <yugang...@gmail.com> wrote: > On Fri, Apr 20, 2012 at 2:38 PM, Sun Chan <sun.c...@gmail.com> wrote: >> >> It is one thing to allow FE to generate temps with special substring. >> It it another to assume that special substring always mean compiler >> generated temps. They are not logically equivalent. >> Sun > > > Maybe I do not make things clear in my last post. Now, I will put more > details. > > The source code in wgen_spin_symbol.cxx > > 1569ST* > 1570Create_ST_For_Tree (gs_t decl_node) > 1571{ > 1572 TY_IDX ty_idx; > 1573 ST* st = NULL; > 1574 char *name; > 1575 char tempname[32]; > 1595 if (gs_tree_code(decl_node) == GS_RESULT_DECL) { > 1596 sprintf(tempname, ".result_decl_%d", gs_decl_uid(decl_node)); > 1597 name = tempname; > 1598 } > 1599 else if ((gs_tree_code(decl_node) == GS_FUNCTION_DECL || > 1600 gs_tree_code(decl_node) == GS_PARM_DECL || > 1601 (gs_tree_code(decl_node) == GS_VAR_DECL && > 1602 gs_decl_asmreg(decl_node) >= 0)) && > 1603 gs_decl_name(decl_node) != 0) > 1604 name = (char *) gs_identifier_pointer (gs_decl_name (decl_node)); > 1605 else if (gs_decl_assembler_name (decl_node) && gs_decl_name > (decl_node)) > 1606 name = (char *) gs_identifier_pointer (gs_decl_assembler_name > (decl_node)); > 1607 else if (gs_decl_name (decl_node)) > 1608 name = (char *) gs_identifier_pointer (gs_decl_name (decl_node)); > > 1609 else { > 1610 sprintf(tempname, "anon%d", ++anon_count); > 1611 name = tempname; > 1612 } > ... > > when control goes here, we could say the compiler generate temp var in two > cases. line 1595-1598 and line 1609-1612, i.e, the green part. common part > "name = tempname" can be used as the indicate. > > We just only want to set the temp var to SCLASS_AUTO for those generated in > "else" part, i.e, 1609-1612, these names contains "anon", without other flag > to indicate, we just use this name prefix. So, we can have the following > change: > > 1777 if (name != tempname || strncmp(tempname,"anon",4)) { // > Not a temp var, or temp var for result_decl, no change > 1778 sclass = SCLASS_FSTATIC; > 1779 eclass = EXPORT_LOCAL; > 1780 } else { // Yes, these are temp vars we want to change > 1781 sclass = SCLASS_AUTO; > 1782 eclass = EXPORT_LOCAL; > 1783 } > 1784 } > 1785 if (name != tempname || strncmp(tempname,"anon",4)) > 1786 level = GLOBAL_SYMTAB; > 1787 else > 1788 level = CURRENT_SYMTAB; > > Regards > Gang > >> >> On Fri, Apr 20, 2012 at 2:01 PM, Gang Yu <yugang...@gmail.com> wrote: >> > Hi, Gautam >> > >> > Thanks for the review. >> > >> > You post a good questtion. In my patch, you may note >> > >> > + if (name != tempname || strncmp(tempname,"anon",4)) { >> > >> > "name != tempname" address your care. >> > >> > Walk though the wgen_spin_symbol.cxx:1611, you may note that >> > >> > 1609 else { >> > 1610 sprintf(tempname, "anon%d", ++anon_count); >> > 1611 name = tempname; >> > 1612 } >> > name == tempname indicate that this is FE generated temp var rather >> > than var >> > in user program. >> > Regards >> > Gang >> > >> > >> > On Fri, Apr 20, 2012 at 1:54 PM, Gautam Chakrabarti >> > <gautam.c...@yahoo.com> >> > wrote: >> >> >> >> Hi, >> >> >> >> Thanks for working on this issue. But this change is not clean. The >> >> change >> >> is essentially assuming special semantics based on a variable name. >> >> What if >> >> a user variable is named anon? >> >> >> >> -Gautam >> >> >> >> From: Gang Yu <yugang...@gmail.com> >> >> To: open64-devel <open64-devel@lists.sourceforge.net> >> >> Sent: Thursday, April 19, 2012 2:01 AM >> >> Subject: [Open64-devel] review request for fix bug965[WGEN] >> >> >> >> Hi, >> >> >> >> Could a gatekeeper please help review the fix for >> >> bug965?(http://bugs.open64.net/show_bug.cgi?id=965) >> >> >> >> This is a code-size issue for open64, i.e, the compiler generate >> >> garbage >> >> code although it still make it right. >> >> >> >> a cut-down case below: >> >> >> >> static inline __attribute__((always_inline)) int >> >> x86_this_cpu_constant_test_bit(unsigned int nr, >> >> const unsigned long *addr) >> >> { >> >> unsigned long *a = (unsigned long *)addr + nr / 64; >> >> >> >> return ((1UL << (nr % 64)) & ({ typeof(*a) pfo_ret__; switch >> >> (sizeof(*a)) >> >> { >> >> case 1: asm("mov" "b ""%%""gs"":" "%P" "1"",%0" : "=q" (pfo_ret_\ >> >> _) : "m" (*a)); break; case 2: asm("mov" "w ""%%""gs"":" "%P" "1"",%0" >> >> : >> >> "=r" >> >> (pfo_ret__) : "m" (*a)); break; case 4: asm("mov" "l ""%%""gs""\ >> >> :" "%P" "1"",%0" : "=r" (pfo_ret__) : "m" (*a)); break; case 8: >> >> asm("mov" >> >> "q >> >> ""%%""gs"":" "%P" "1"",%0" : "=r" (pfo_ret__) : "m" (*a)); break\ >> >> ; default: __bad_percpu_size(); } pfo_ret__; })) != 0; >> >> } >> >> opencc -c anon.c -keep >> >> yug@jupiter:~/work/codesize> readelf -s anon.o >> >> >> >> >> >> Symbol table '.symtab' contains 8 entries: >> >> Num: Value Size Type Bind Vis Ndx Name >> >> 4: 0000000000000000 8 OBJECT LOCAL DEFAULT 3 anon1 >> >> x86_this_cpu_constant_test_bit is non-called inline keyword function, >> >> so >> >> there should generate nothing symbols in this object file, however, >> >> anon1 appears unexpected. >> >> Analysis: >> >> >> >> When we examine the WGEN code, we found that the code snipper like >> >> these: >> >> >> >> 1569ST* >> >> 1570Create_ST_For_Tree (gs_t decl_node) >> >> 1571{ >> >> ... >> >> 1609 else { >> >> 1610 sprintf(tempname, "anon%d", ++anon_count); >> >> 1611 name = tempname; >> >> 1612 } >> >> ... >> >> 1750 if (gs_tree_public (decl_node)) { >> >> ... >> >> 1776 else { >> >> 1777 sclass = SCLASS_FSTATIC; >> >> 1778 eclass = EXPORT_LOCAL; >> >> 1779 } >> >> 1780 level = GLOBAL_SYMTAB; >> >> 1781 } >> >> >> >> this is to say, when current gs_tree is not public, we generate such a >> >> variable as File-Scope(static) global variable. >> >> However, anon1 appears as the temporary variable in a computation. >> >> >> >> U8U8LDID 0 <2,4,pfo_ret__> T<9,.predef_U8,8> >> >> U8STID 0 <1,51,anon1> T<9,.predef_U8,8> {line: 1/7} >> >> U8INTCONST 1 (0x1) >> >> I4I4LDID 0 <2,1,nr> T<4,.predef_I4,4> >> >> I4INTCONST 63 (0x3f) >> >> I4BAND >> >> U8SHL >> >> U8U8LDID 0 <1,51,anon1> T<9,.predef_U8,8> >> >> U8BAND >> >> U8INTCONST 0 (0x0) >> >> I4U8NE >> >> I4RETURN_VAL {line: 0/0} >> >> and we do find the producer for anon >> >> 1609 else { >> >> 1610 sprintf(tempname, "anon%d", ++anon_count); >> >> 1611 name = tempname; >> >> 1612 } >> >> we should make it SCLASS_AUTO in LOCAL_SYMTAB. >> >> >> >> Suggested patch: >> >> osprey/wgen/wgen_spin_symbol.cxx -- ff56fe0..b24a800 100644 >> >> --- a/osprey/wgen/wgen_spin_symbol.cxx >> >> +++ b/osprey/wgen/wgen_spin_symbol.cxx >> >> @@ -1774,10 +1774,18 @@ Create_ST_For_Tree (gs_t decl_node) >> >> eclass = EXPORT_PREEMPTIBLE; >> >> } >> >> else { >> >> + if (name != tempname || strncmp(tempname,"anon",4)) { >> >> sclass = SCLASS_FSTATIC; >> >> eclass = EXPORT_LOCAL; >> >> + } else { >> >> + sclass = SCLASS_AUTO; >> >> + eclass = EXPORT_LOCAL; >> >> + } >> >> } >> >> - level = GLOBAL_SYMTAB; >> >> + if (name != tempname || strncmp(tempname,"anon",4)) >> >> + level = GLOBAL_SYMTAB; >> >> + else >> >> + level = CURRENT_SYMTAB; >> >> } >> >> else { >> >> #ifdef KEY >> >> >> >> As an example, I show the codesize comparison to gcc generation and the >> >> source code in the attach, we can see this is really bad for code-size. >> >> Could a gatekeeper please help a review? thanks in advance. >> >> >> >> >> >> Regards >> >> Gang >> >> >> >> >> >> >> >> ------------------------------------------------------------------------------ >> >> For Developers, A Lot Can Happen In A Second. >> >> Boundary is the first to Know...and Tell You. >> >> Monitor Your Applications in Ultra-Fine Resolution. Try it FREE! >> >> http://p.sf.net/sfu/Boundary-d2dvs2 >> >> _______________________________________________ >> >> Open64-devel mailing list >> >> Open64-devel@lists.sourceforge.net >> >> https://lists.sourceforge.net/lists/listinfo/open64-devel >> >> >> >> >> > >> > >> > >> > ------------------------------------------------------------------------------ >> > For Developers, A Lot Can Happen In A Second. >> > Boundary is the first to Know...and Tell You. >> > Monitor Your Applications in Ultra-Fine Resolution. Try it FREE! >> > http://p.sf.net/sfu/Boundary-d2dvs2 >> > _______________________________________________ >> > Open64-devel mailing list >> > Open64-devel@lists.sourceforge.net >> > https://lists.sourceforge.net/lists/listinfo/open64-devel >> > > > ------------------------------------------------------------------------------ For Developers, A Lot Can Happen In A Second. Boundary is the first to Know...and Tell You. Monitor Your Applications in Ultra-Fine Resolution. Try it FREE! http://p.sf.net/sfu/Boundary-d2dvs2 _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel