From: Borut R. <bor...@si...> - 2010-01-23 17:22:07
|
Hi Pavel, thank you for noticing it, I somehow overlooked it. Now I committed also the FOR patch. About the test: function g() is never called while f() is called twice from mail(). Is this intentionally or should one call fo f() be replaced with g()? Thank you for your great contribution. I hope that you'll continue to contribute to sdcc development. Borut Pavel Pisa wrote: > Hello Borut and others, > > thanks much for integration of the inline patches into SDCC mainline. > I have run some tests and result are positive except missing FOR statement support > 0005-Added-code-to-update-for-statement-during-inline-fun.patch > > The SDCC version string > > SDCC : mcs51/gbz80/z80/ds390/pic16/pic14/TININative/ds400/hc08 2.9.7 # (Jan 23 2010) (UNIX) > > Tested build of full uLan stuff with uLUt > - all code compiles without errors > > Tested build and run in simulator of uLUt GAVL and GSA tests > - compiles and generated expected results > The GAVl and GSA algorithms use deep inlines with local variables > initiated by inline functions. But the inlined functions complexity > is not so huge. > > I have found by comparison of sources imported to GIT, that > FOR statement expansion is not included. If I include it > then even my FOR statement test can be compiled. If the omission > reason is that you see possible problem with it, then OK. > If it is by mystake, then give it a try, please. > > ----------------------------------------------------------------- > diff --git a/sdcc/src/SDCCast.c b/sdcc/src/SDCCast.c > index e3cdd59..1ccf33f 100644 > --- a/sdcc/src/SDCCast.c > +++ b/sdcc/src/SDCCast.c > @@ -6212,8 +6212,28 @@ fixupInline (ast * tree, int level) > char name[SDCC_NAME_MAX + 1]; > const char *oldsuff = tree->values.switchVals.swSuffix; > > SNPRINTF (name, sizeof(name), "%s_%d", oldsuff? oldsuff: "", inlineState.count); > tree->values.switchVals.swSuffix = strdup (name); > + } > + > + /* Update FOR expression */ > + if (tree->type == EX_OP && tree->opval.op == FOR) > + { > + if (AST_FOR( tree, initExpr)) > + fixupInline (AST_FOR( tree, initExpr), level); > + if (AST_FOR( tree, condExpr)) > + fixupInline (AST_FOR( tree, condExpr), level); > + if (AST_FOR( tree, loopExpr)) > + fixupInline (AST_FOR( tree, loopExpr), level); > + > + if (AST_FOR(tree, trueLabel)) > + fixupInlineLabel(AST_FOR(tree, trueLabel)); > + if (AST_FOR(tree, continueLabel)) > + fixupInlineLabel(AST_FOR(tree, continueLabel)); > + if (AST_FOR(tree, falseLabel)) > + fixupInlineLabel(AST_FOR(tree, falseLabel)); > + if (AST_FOR(tree, condLabel)) > + fixupInlineLabel(AST_FOR(tree, condLabel)); > } > ----------------------------------------------------------------- > > The FOR statement test code > ----------------------------------------------------------------- > static inline int g(int b) > { > int a=10; > for(a+=b*2; b>0; b--) { > if(a>1000) > return a; > } > return a; > } > > static inline int f(int c) > { > int i; > for(i=c;i>0;i--) > c+=i; > return c; > } > > int g_a; > int g_y; > > int main(void) > { > > g_y=f(g_a); > g_y=f(g_y); > > return 0; > } > ----------------------------------------------------------------- > > |