avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[avr-gcc-list] RE: AVR-GCC-list Digest, Vol 52, Issue 10


From: Mohamed Reda
Subject: [avr-gcc-list] RE: AVR-GCC-list Digest, Vol 52, Issue 10
Date: Sun, 10 May 2009 22:40:10 +0300

i wish to learn the c++ structure to be able to wright a project using AVR-GCC.
 
> Date: Sun, 10 May 2009 12:01:07 -0400
> From: address@hidden
> Subject: AVR-GCC-list Digest, Vol 52, Issue 10
> To: address@hidden
>
> Send AVR-GCC-list mailing list submissions to
> address@hidden
>
> To subscribe or unsubscribe via the World Wide Web, visit
> http://lists.nongnu.org/mailman/listinfo/avr-gcc-list
> or, via email, send a message with subject or body 'help' to
> address@hidden
>
> You can reach the person managing the list at
> address@hidden
>
> When replying, please edit your Subject line so it is more specific
> than "Re: Contents of AVR-GCC-list digest..."
>
>
> Today's Topics:
>
> 1. mcall-prologues completely broken for >128k (Sean D'Epagnier)
> 2. RE: mcall-prologues completely broken for >128k (Weddington, Eric)
> 3. Re: mcall-prologues completely broken for >128k (Sean D'Epagnier)
> 4. Re: mcall-prologues completely broken for >128k (Sean D'Epagnier)
>
>
> ----------------------------------------------------------------------
>
> Message: 1
> Date: Sat, 9 May 2009 13:36:21 -0600
> From: "Sean D'Epagnier" <address@hidden>
> Subject: [avr-gcc-list] mcall-prologues completely broken for >128k
> To: address@hidden
> Message-ID:
> <address@hidden>
> Content-Type: text/plain; charset=ISO-8859-1
>
> Hi, I originally thought my extensive used of the gcc extension
> "Address labels" was the cause of my problems. After inspection of
> the assembly I realized that they worked perfectly via the trampoline
> mechanism.. so what was the problem?
>
> I found that prologue_saves calls eijmp at the end, which makes sense,
> it gets back to the function it was in. However, the EIND register is
> not set which means it jumps to the wrong section if the function was
> in the upper section.
>
> I verified it by recompiling everything (including avr-libc) without
> -mcall_prologues and the program seems to run.. (before there was no
> luck)
>
> This issue is pretty easy to fix.. I can set EIND before jumping to
> prologue_saves.. but this would break when the next eijmp or eicall
> instruction is executed if I don't set EIND back to 0.
>
> The thing confusing me the most right now, is why gcc currently emits
> eijmp or eicall at all. Since EIND is _never_ set, why did someone go
> to all the trouble to make gcc emit eijmp and eicall? I want to
> change gcc to use ijmp and icall always.. then in libgcc.S use eijmp,
> and set EIND in prologue_saves and I won't have to bother restoring
> it.
>
> If I'm confused about something, or there is a better explanation, let
> me know. I'm going to modify gcc and have a patch for this soon.
>
> Thanks,
> Sean
>
>
>
>
> ------------------------------
>
> Message: 2
> Date: Sat, 9 May 2009 21:08:18 -0600
> From: "Weddington, Eric" <address@hidden>
> Subject: RE: [avr-gcc-list] mcall-prologues completely broken for
> >128k
> To: "Sean D'Epagnier" <address@hidden>,
> <address@hidden>
> Message-ID:
> <address@hidden>
> Content-Type: text/plain; charset="us-ascii"
>
>
>
> > -----Original Message-----
> > From:
> > address@hidden
> > [mailto:address@hidden
> > org] On Behalf Of Sean D'Epagnier
> > Sent: Saturday, May 09, 2009 1:36 PM
> > To: address@hidden
> > Subject: [avr-gcc-list] mcall-prologues completely broken for >128k
> >
> > Hi, I originally thought my extensive used of the gcc extension
> > "Address labels" was the cause of my problems. After inspection of
> > the assembly I realized that they worked perfectly via the trampoline
> > mechanism.. so what was the problem?
> >
> > I found that prologue_saves calls eijmp at the end, which makes sense,
> > it gets back to the function it was in. However, the EIND register is
> > not set which means it jumps to the wrong section if the function was
> > in the upper section.
> >
> > I verified it by recompiling everything (including avr-libc) without
> > -mcall_prologues and the program seems to run.. (before there was no
> > luck)
> >
> > This issue is pretty easy to fix.. I can set EIND before jumping to
> > prologue_saves.. but this would break when the next eijmp or eicall
> > instruction is executed if I don't set EIND back to 0.
> >
> > The thing confusing me the most right now, is why gcc currently emits
> > eijmp or eicall at all. Since EIND is _never_ set, why did someone go
> > to all the trouble to make gcc emit eijmp and eicall? I want to
> > change gcc to use ijmp and icall always.. then in libgcc.S use eijmp,
> > and set EIND in prologue_saves and I won't have to bother restoring
> > it.
> >
> > If I'm confused about something, or there is a better explanation, let
> > me know. I'm going to modify gcc and have a patch for this soon.
>
> Known issue. There is a bug report in the WinAVR bug database about it (EIND not being set correctly). I have recently changed avr-libc (in HEAD and 1.6 branch) to compile the libs without -mcall-prologues because I ran into this very problem.
>
> A patch to GCC to fix the EIND issue would be *very* welcome and I would include it in the next WinAVR release.
>
>
>
>
> ------------------------------
>
> Message: 3
> Date: Sat, 9 May 2009 22:39:33 -0600
> From: "Sean D'Epagnier" <address@hidden>
> Subject: Re: [avr-gcc-list] mcall-prologues completely broken for
> >128k
> To: "Weddington, Eric" <address@hidden>
> Cc: address@hidden
> Message-ID:
> <address@hidden>
> Content-Type: text/plain; charset=ISO-8859-1
>
> I got myself a little confused here..
>
> I was using gcc 4.2.2, and an older binutils at first because it has
> superior code size.. however this version really is broken for > 128k
> parts, and I'm not sure why.. don't care.
>
> Somewhere along the way I set EIND to a nonzero value in my code and
> forgot about it, then I had issues with -mcall-prologues with the
> newer gcc. If you don't set EIND at all, I believe the current gcc is
> ok.
>
> I managed to modify gcc to set EIND correctly in the call prologue so
> that a trampoline entree is no longer needed for every function that
> gets prologues_saved which reduced 75 trampolines from my program.
> Unfortunately this actually slightly increased code size because 2
> bytes are added to all the functions that get prologues_saved, and
> there was no exception for the lower 128k which don't need trampolines
>
> So.. I don't think using the indirect register really helps much..
> there are various ways I can handle things, but no clear winner, and
> it's looking like 100 bytes or less difference at most. If we had a
> part with 1meg of flash or more, it might start to matter more and it
> could be changed.
>
> Instead I just converted gcc to only emit icall and ijmp instead of
> eicall and eijmp. This seems to work well, and avoids the problem of
> EIND not being set right. The only place now that uses eijmp is in
> setjmp.S This is good because even in the newest gcc, if EIND was set
> by a longjmp, then a function is called with prologue saves.. or even
> a function pointer or address label is invoked, then the program would
> crash. This is fixed now.
>
> I am still a little worried that in the middle of a longjmp, an
> interrupt goes off between setting EIND and eijmp, and this interrupt
> sets EIND to a different value. It would still cause a crash. This
> is only if you use longjmp in both program and interrupt handler. The
> solution is to guard it. I'll have a patch for it too.
>
> Sean
>
>
> On 5/9/09, Weddington, Eric <address@hidden> wrote:
> >
> >
> >> -----Original Message-----
> >> From:
> >> address@hidden
> >> [mailto:address@hidden
> >> org] On Behalf Of Sean D'Epagnier
> >> Sent: Saturday, May 09, 2009 1:36 PM
> >> To: address@hidden
> >> Subject: [avr-gcc-list] mcall-prologues completely broken for >128k
> >>
> >> Hi, I originally thought my extensive used of the gcc extension
> >> "Address labels" was the cause of my problems. After inspection of
> >> the assembly I realized that they worked perfectly via the trampoline
> >> mechanism.. so what was the problem?
> >>
> >> I found that prologue_saves calls eijmp at the end, which makes sense,
> >> it gets back to the function it was in. However, the EIND register is
> >> not set which means it jumps to the wrong section if the function was
> >> in the upper section.
> >>
> >> I verified it by recompiling everything (including avr-libc) without
> >> -mcall_prologues and the program seems to run.. (before there was no
> >> luck)
> >>
> >> This issue is pretty easy to fix.. I can set EIND before jumping to
> >> prologue_saves.. but this would break when the next eijmp or eicall
> >> instruction is executed if I don't set EIND back to 0.
> >>
> >> The thing confusing me the most right now, is why gcc currently emits
> >> eijmp or eicall at all. Since EIND is _never_ set, why did someone go
> >> to all the trouble to make gcc emit eijmp and eicall? I want to
> >> change gcc to use ijmp and icall always.. then in libgcc.S use eijmp,
> >> and set EIND in prologue_saves and I won't have to bother restoring
> >> it.
> >>
> >> If I'm confused about something, or there is a better explanation, let
> >> me know. I'm going to modify gcc and have a patch for this soon.
> >
> > Known issue. There is a bug report in the WinAVR bug database about it (EIND
> > not being set correctly). I have recently changed avr-libc (in HEAD and 1.6
> > branch) to compile the libs without -mcall-prologues because I ran into this
> > very problem.
> >
> > A patch to GCC to fix the EIND issue would be *very* welcome and I would
> > include it in the next WinAVR release.
> >
>
>
>
>
> ------------------------------
>
> Message: 4
> Date: Sun, 10 May 2009 00:26:27 -0600
> From: "Sean D'Epagnier" <address@hidden>
> Subject: Re: [avr-gcc-list] mcall-prologues completely broken for
> >128k
> To: "Weddington, Eric" <address@hidden>
> Cc: address@hidden
> Message-ID:
> <address@hidden>
> Content-Type: text/plain; charset="iso-8859-1"
>
> Hi,
>
> Here are some patches. Please take a look and tell me if what I did
> with setjmp makes any sense. I don't really use longjmp so it's not
> fully tested, and it is only to handle a case which is very difficult
> to create.
>
> I have tested the gcc patch and my program is working very well now.
>
> There is still a major issue of what to do in bootloaders. It appears
> that the trampolines do not get generated for bootloaders.. and how
> can they? For bootloaders the compiler should use eijmp and eicall
> and set EIND to the bootloader segment at startup. But what if
> longjmp is used and what if application code is called? I'm not sure
> what the best solution is here, but currently I'm just glad my
> bootloader doesn't need indirect jumps.
>
> Sean
> -------------- next part --------------
> A non-text attachment was scrubbed...
> Name: avr-gcc-eijmp-eicall.patch
> Type: text/x-diff
> Size: 3583 bytes
> Desc: not available
> Url : http://lists.gnu.org/pipermail/avr-gcc-list/attachments/20090510/f80448c0/avr-gcc-eijmp-eicall.bin
> -------------- next part --------------
> A non-text attachment was scrubbed...
> Name: avr-libc-extended-setjmp.patch
> Type: text/x-diff
> Size: 594 bytes
> Desc: not available
> Url : http://lists.gnu.org/pipermail/avr-gcc-list/attachments/20090510/f80448c0/avr-libc-extended-setjmp.bin
>
> ------------------------------
>
> _______________________________________________
> AVR-GCC-list mailing list
> address@hidden
> http://lists.nongnu.org/mailman/listinfo/avr-gcc-list
>
>
> End of AVR-GCC-list Digest, Vol 52, Issue 10
> ********************************************


See all the ways you can stay connected to friends and family

reply via email to

[Prev in Thread] Current Thread [Next in Thread]