# HG changeset patch # User Shinji KONO # Date 1396779658 -32400 # Node ID d712ee10feb7663a34de54133cab04a4c2e28cd7 # Parent e9ba80b0827df9d83caa0cd03fad5777e430d65f local_nptr for locally defined struct diff -r e9ba80b0827d -r d712ee10feb7 mc-parse.c --- a/mc-parse.c Sun Apr 06 17:11:44 2014 +0900 +++ b/mc-parse.c Sun Apr 06 19:20:58 2014 +0900 @@ -967,6 +967,7 @@ v = list3n(n->sc,n->dsp,n); if (sym==ASS && n!=&null_nptr) { conv->op_(sym); + local_nptr = n; local_struct_offset = 0; init = decl_data(type,v,0,0); data_closing(v); } if (inmode && (mode==LDECL||mode==LLDECL||mode==STADECL)) { @@ -989,6 +990,7 @@ v = list3n(n->sc,n->dsp,n); if (sym==ASS && n!=&null_nptr) { conv->op_(sym); + local_nptr = n; local_struct_offset = 0; init = decl_data(type,v,0,0);data_closing(v); } if (inmode && mode==LDECL) { @@ -4135,13 +4137,12 @@ // initializer // q->lock = (spinlock_t) { }; conv->lc_(); - nptr0 = get_nptr(); // should be freed in a scope? - // in case of inline, we cannot + nptr0 = get_nptr(); nptr0->nm = ""; nptr0->sc = EMPTY; nptr0->attr = 0; type = nptr0->ty = t; - def(nptr0,0); + int local_offset; if (mode==GDECL||inmode) { int e2,e3; e1 = size(type); @@ -4155,14 +4156,27 @@ e1 = list4(CAST,e1,t,t); // only for cast syntax } } else { - e1 = list3n(nptr0->sc,nptr0->dsp,nptr0); + if (!local_nptr) { + local_nptr = nptr0; + int smode = mode; mode = LDECL; + def(nptr0,0); + mode = smode; + local_struct_offset = 0; + } + e1 = list3n(local_nptr->sc,local_nptr->dsp,local_nptr); #if LOCAL_STRUCT_INIT_STATIC local_struct_static(e1); #else - decl_data_field(type,e1,0); + local_offset = local_struct_offset; + int offset = decl_data_field(type,e1,local_struct_offset); + if (offset==local_struct_offset) { + int sz = size(type); + zfill(e1,offset,sz); + local_struct_offset = offset + sz; + } #endif } - if (mode==STAT && decl_str_init) gen_delayed_decl_data(e1,0); + if (mode==STAT && decl_str_init) gen_delayed_decl_data(e1,local_offset); if (init_vars && mode!=LDECL) { emit_init_vars(); } diff -r e9ba80b0827d -r d712ee10feb7 test/cext.c --- a/test/cext.c Sun Apr 06 17:11:44 2014 +0900 +++ b/test/cext.c Sun Apr 06 19:20:58 2014 +0900 @@ -8,7 +8,7 @@ { char *s = name; char *q = current_file_dir; - printf("%s and %s\n",s,q); + printf("#0010:%s and %s\n",s,q); } main() @@ -16,19 +16,19 @@ int i,k; unsigned uk; char c = -3; - printf("char is %ssigned\n", c==256-3? "un":""); + printf("#0018:char is %ssigned\n", c==256-3? "un":""); for(i=-3;i<4;i++) { k = (char) i; uk = (unsigned char) i; - printf("#0011:%d %u\n",k,uk); + printf("#0023:%d %u\n",k,uk); k = (short) i; uk = (unsigned short) i; - printf("#0014:%d %u\n",k,uk); + printf("#0026:%d %u\n",k,uk); } u = (unsigned) -23432; - printf("#0018:%d\n",u/(8048+5)); + printf("#0030:%d\n",u/(8048+5)); current_file_dir[0] = 'k'; current_file_dir[1] = 'a'; diff -r e9ba80b0827d -r d712ee10feb7 test/cloop.c --- a/test/cloop.c Sun Apr 06 17:11:44 2014 +0900 +++ b/test/cloop.c Sun Apr 06 19:20:58 2014 +0900 @@ -10,18 +10,18 @@ { int i; for( i = 0;i<10;i++) { - printf("%d ",c[i]); + printf("#0012:%d ",c[i]); } for( i = 0;i<10;i++) { - printf("%d ",s[i]); + printf("#0015:%d ",s[i]); } for( i = 0;i<10;i++) { - printf("%d ",j[i]); + printf("#0018:%d ",j[i]); } for( i = 0;i<10;i++) { - printf("%lld ",l[i]); + printf("#0021:%lld ",l[i]); } - printf("\n"); + printf("#0023:\n"); } void @@ -30,19 +30,19 @@ int i; for( i = 0;i<10;i++) { c[i] = i; - printf("\n"); + printf("#0032:\n"); } for( i = 0;i<10;i++) { s[i] = i; - printf("\n"); + printf("#0036:\n"); } for( i = 0;i<10;i++) { j[i] = i; - printf("\n"); + printf("#0040:\n"); } for( i = 0;i<10;i++) { l[i] = i; - printf("\n"); + printf("#0044:\n"); } } diff -r e9ba80b0827d -r d712ee10feb7 test/obsf.c --- a/test/obsf.c Sun Apr 06 17:11:44 2014 +0900 +++ b/test/obsf.c Sun Apr 06 19:20:58 2014 +0900 @@ -4,7 +4,7 @@ char **_a; char **aa; { long _ = (long)_a; char *a = (char *)aa; -// printf("#0005:%d %d %d\n",t,_,a); +// printf("#0006:%d %d %d\n",t,_,a); return!0a,p->b,p->c); + printf("#0302:p %d %d %d\n",p->a,p->b,p->c); q = (struct test3) {1,2,3}; - printf("#0289:q %d %d %d\n",q.a,q.b,q.c); + printf("#0304:q %d %d %d\n",q.a,q.b,q.c); struct test4 { struct test5 { @@ -311,14 +311,14 @@ } u = { .d = {1,2,3} }; struct test4 v = { .d = (struct test5){1,2,3} }; - printf("#0298:u %d %d %d\n",u.d.a,u.d.b,u.d.c); + printf("#0313:u %d %d %d\n",u.d.a,u.d.b,u.d.c); - printf("#0300:v %d %d %d\n",v.d.a,v.d.b,v.d.c); + printf("#0315:v %d %d %d\n",v.d.a,v.d.b,v.d.c); - printf("#0300:v %ld\n",temp10.a); - printf("#0300:v %ld\n",temp10.m.k); - printf("#0300:v %ld\n",temp10.m.j); - printf("#0300:v %ld\n",temp10.e); + printf("#0317:v %ld\n",temp10.a); + printf("#0318:v %ld\n",temp10.m.k); + printf("#0319:v %ld\n",temp10.m.j); + printf("#0320:v %ld\n",temp10.e); return 0; diff -r e9ba80b0827d -r d712ee10feb7 test/tmp11.c --- a/test/tmp11.c Sun Apr 06 17:11:44 2014 +0900 +++ b/test/tmp11.c Sun Apr 06 19:20:58 2014 +0900 @@ -8,13 +8,13 @@ NMTBL * test2(char *n) { - printf("#0009:s %s\n",n); + printf("#0010:s %s\n",n); return a; } int test0(int a,int b,int c) { - printf("#0015:a %d b %d c %d\n",a,b,c); + printf("#0016:a %d b %d c %d\n",a,b,c); return 0; } @@ -38,16 +38,16 @@ a = &f; b = test2("test"); d = test1(1,2,3); - printf("#0033:return %d\n",d); + printf("#0040:return %d\n",d); NMTBL **p = (NMTBL**)&heap[2]; *p = &f; b = &f; int e = 0; - printf("f.nm %s\n",f.nm); - printf("b->nm %s\n",b->nm); - printf("(*p)->nm %s\n",(*p)->nm); - printf("ncaddr(e)->nm %s\n",ncaddr(e)->nm); + printf("#0046:f.nm %s\n",f.nm); + printf("#0047:b->nm %s\n",b->nm); + printf("#0048:(*p)->nm %s\n",(*p)->nm); + printf("#0049:ncaddr(e)->nm %s\n",ncaddr(e)->nm); return d; } diff -r e9ba80b0827d -r d712ee10feb7 test/tmp7.c --- a/test/tmp7.c Sun Apr 06 17:11:44 2014 +0900 +++ b/test/tmp7.c Sun Apr 06 19:20:58 2014 +0900 @@ -146,7 +146,7 @@ static void l(s p, s q){ - printf("%d %d\n", p.x, p.y); + printf("#0148:%d %d\n", p.x, p.y); } INLINE void @@ -171,6 +171,6 @@ main7(struct aa a1) { struct aa b = main0(0xff); - printf("#0065:main7 b.a[55] %d\n",b.a[55]); + printf("#0173:main7 b.a[55] %d\n",b.a[55]); } diff -r e9ba80b0827d -r d712ee10feb7 test/tstdarg.c --- a/test/tstdarg.c Sun Apr 06 17:11:44 2014 +0900 +++ b/test/tstdarg.c Sun Apr 06 19:20:58 2014 +0900 @@ -43,29 +43,29 @@ while((t= *numtypes++)) { if (t=='i') { i = va_arg(ap,int); - printf("#0020:int arg: %d\n",i); + printf("#0045:int arg: %d\n",i); print(&ap); #if 0 /* ‘float’ is promoted to ‘double’ when passed through ‘...’ */ } else if (t=='f') { f = va_arg(ap,float); - printf("#0025:float arg: %g\n",f); + printf("#0051:float arg: %g\n",f); #endif } else if (t=='d') { d = va_arg(ap,double); - printf("#0029:double arg: %g\n",d); + printf("#0055:double arg: %g\n",d); print(&ap); } else if (t=='l') { l = va_arg(ap,long long); - printf("#0032:long long arg: %lld\n",l); + printf("#0059:long long arg: %lld\n",l); print(&ap); } else if (t=='s') { s = va_arg(ap,char *); - printf("#0035:char *arg: %s\n",s); + printf("#0063:char *arg: %s\n",s); print(&ap); } else { s = va_arg(ap,char *); - printf("#0038:arg: error\n"); + printf("#0067:arg: error\n"); print(&ap); } }