yug@jupiter:~/work/codesize> cat a.c
static int anon=5;
int main(int argc, char* argv[]) {
printf("%d",anon);
}
yug@jupiter:~/work/codesize> opencc -c a.c
a.c: In function 'main':
a.c:3: warning: incompatible implicit declaration of built-in function
'printf'
yug@jupiter:~/work/codesize> readelf -s a.o | grep anon
5: 0000000000000000 4 OBJECT LOCAL DEFAULT 3 anon
yug@jupiter:~/work/codesize> cat anon.c
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;
}
yug@jupiter:~/work/codesize> opencc -c anon.c
yug@jupiter:~/work/codesize> readelf -s anon.o | grep anon
Regards
Gang
On Fri, Apr 20, 2012 at 3:09 PM, Sun Chan <sun.c...@gmail.com> wrote:
> 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