I took Paulo's message to mean this void functionA(void) { ... functionB(); functionC(); functionD(); ... }
Where functions B, C, and D do not call one another. In this case, you would not allocate 96 bytes of stack without inline calls. -Preston "Stu Bell" wrote: > I don't understand your problem. If I understand your situation, you > have: > > int functionD( int d ) __attribute__ ((inline)); > int functionC( int c ) __attribute__ ((inline)); > int functionB( int b ) __attribute__ ((inline)); > > int functionD( int d ){ > uint8_t localD[32]; > ... > return result; > } > int functionC( int c ){ > uint8_t localC[32]; > ... > return (functionD(c)); > } > int functionB( int b ){ > uint8_t localB[32]; > ... > return (functionC(b)); > } > int functionA( int a ){ > uint8_t localA[32]; > ... > return (functionB(a)); > } > > And you're complaining that when you call functionA that 96 bytes are > allocated on the stack instead of 32? Isn't that what would happen > through the full execution of the set of functions (plus parameter and > return address pushes as well)? > > I must be missing something from your description. It seems to me that > you actually *save* the parameter and address pushes on the stack, > saving quite a bit. > > Best regards, > > Stu Bell > DataPlay (DPHI, Inc.) > > > -----Original Message----- > From: [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] On Behalf Of > Paulo Marques > Sent: Monday, September 08, 2008 5:43 AM > To: avr-gcc-list@nongnu.org > Subject: [avr-gcc-list] Stack usage under heavy inlining > > > Hi all, > > Yesterday I was tracking down a problem in a personal project of mine > whose symptoms looked like a stack overflow. > > As it turned out, it was the same problem with gcc that I had already > read about on LKML: when gcc inlines a function it increases the stack > usage of the caller by almost all the stack usage of the callee. > > So, for instance, if function A calls function B, then function C and > then function D, and functions B,C and D use 32 bytes of stack each, it > means function A now uses 96 bytes of stack, whereas the "not-inlined" > version only used 32 bytes. > > Since I was compiling my project with "-combine -fwhole-program", the > main function had almost the entire code and it started by pushing all > call-saved registers and subtracting 126 bytes to the stack pointer :P > > Marking the main function as __attribute__((noreturn)) took care of the > push'es, but only -fno-inline reduced the stack usage. > > This is not a avr specific problem. See, for instance, Linus complaining > of the same problem on i386 (stack size is a problem for the kernel > too): > > http://lkml.org/lkml/2008/8/26/197 > > I tested this with several versions of gcc, including a gcc-4.4.0 (not a > very recent one, though). > > I can try with more recent versions, if someone suspects that this > behavior is better in a more recent gcc, but I just wanted to warn other > developers who might hit the same problem. > > -- > Paulo Marques > Software Development Department - Grupo PIE, S.A. > Phone: +351 252 290600, Fax: +351 252 290601 > Web: www.grupopie.com > > "To know recursion, you must first know recursion." > > > _______________________________________________ > AVR-GCC-list mailing list > AVR-GCC-list@nongnu.org > http://lists.nongnu.org/mailman/listinfo/avr-gcc-list > > > _______________________________________________ > AVR-GCC-list mailing list > AVR-GCC-list@nongnu.org > http://lists.nongnu.org/mailman/listinfo/avr-gcc-list _______________________________________________ AVR-GCC-list mailing list AVR-GCC-list@nongnu.org http://lists.nongnu.org/mailman/listinfo/avr-gcc-list