> -----Original Message----- > From: > [EMAIL PROTECTED] > [mailto:[EMAIL PROTECTED] > org] On Behalf Of Anatoly Sokolov > Sent: Tuesday, February 13, 2007 4:23 PM > To: Joerg Wunsch; [email protected] > Subject: Re: [avr-libc-dev] Re: [bug #19050] gcrt1.S should > call mainratherthan jumping to it > > ----- Original Message ----- > From: "Joerg Wunsch" <[EMAIL PROTECTED]> > > > > As Anatoly Sokolov wrote: > > > >> These changes should be reverted: > >> > >> - if (main_p) > >> - { > >> - fprintf (file, ("\t" > >> - AS1 (ldi,r28) ",lo8(%s - " HOST_WIDE_INT_PRINT_DEC > ")" CR_TAB > >> - AS1 (ldi,r29) ",hi8(%s - " HOST_WIDE_INT_PRINT_DEC > ")" CR_TAB > >> - AS2 (out,__SP_H__,r29) CR_TAB > >> - AS2 (out,__SP_L__,r28) "\n"), > >> - avr_init_stack, size, avr_init_stack, size); > >> - > >> - prologue_size += 4; > >> - } > >> - else if (minimize && (frame_pointer_needed || live_seq > 6)) > >> + if (minimize && (frame_pointer_needed || live_seq > 6)) > > > > That would restore the old (buggy) stack pointer initialization. > > > > > NO! NO! NO! Code which you see in the beginning of main() function: > ldi r28, 0x5D ; 93 > ldi r29, 0x08 ; 8 > out 0x3e, r29 ; 62 > out 0x3d, r28 ; 61 > > no stack pointer initialization!!!! It is function frames > initialization!!! > > It is no SP = RAMEND.... It is SP = FP= (RAMEND - size); > > Where 'size' is size all local (unoptimized) variables. > > This code compiled for ATmega32 device. > int main() > { > int i; > } > > RAMEND for ATmega32 is defined as 0x85F. And SP != 0x085F, but > SP = RAMEND - sizeof(int) = 0x085F - 2 = 0x85D!!! > > But, if the frame size is null it is possible to not > initialize function > frames: > - if (main_p) > + if (main_p && size != 0) > { > fprintf (file, ("\t" > AS1 (ldi,r28) ",lo8(%s - " HOST_WIDE_INT_PRINT_DEC ")" CR_TAB > AS1 (ldi,r29) ",hi8(%s - " HOST_WIDE_INT_PRINT_DEC ")" CR_TAB > AS2 (out,__SP_H__,r29) CR_TAB > AS2 (out,__SP_L__,r28) "\n"), > avr_init_stack, size, avr_init_stack, size); > > prologue_size += 4; > } > > It needs to be tested, probably the fream pointer (r28:r29) > is required to > the compiler.
Part of the problem here is that the issue with main() being a normal function is that it is part of the mega256x patch. This brings up some questions: Is this portion (about main()) *required* for the mega256x patch? Can these two be separated? Can we start the process on getting the mega256x support committed to GCC HEAD? And deal with the main() issue separately... Eric _______________________________________________ AVR-libc-dev mailing list [email protected] http://lists.nongnu.org/mailman/listinfo/avr-libc-dev
