[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [avr-gcc-list] Is "noreturn" attribute still not supported?
From: |
Lin Gu |
Subject: |
Re: [avr-gcc-list] Is "noreturn" attribute still not supported? |
Date: |
Tue, 25 Jan 2005 10:47:33 -0500 |
> > The bottom line is that g() needs to know an
> > address to JMP to. I assume I cannot use
> > a label like F outside a
> > function where it is defined. Hence I need a
> > function. This is why I need to have a function
> > that is compiled with 'noreturn' attribute.
> >
> > Without "noreturn", I have to write the function
> > completely in assembly code.
>
> Why would that be?
>
> You don't need anything more than an address. Presumably, you have an address\
,
> since you've written to the flash.
>
> So all you have to do is to replace the return address on the top of the stac\
k
> with the address you want to jump to, and then do a return.
>
> You could do the replacement with an assembly language macro that takes the
> desired destination address.
Agree. What I need is an address. With that address I just use
assembly code to "JMP" to that address. Changing the return
address is nicer but my application has strict size limit so a direct
jump seems more appropriate.
My whole problem originates from how to get that "address" in the
first place. I cannot use the C funtion as the address since it
starts with a prolog of pushes which I do not need.
Fortunately I found a way to do it -- use a global label in inline
assembly code. Like this
f()
{
asm volatile (".global global_lable"
global_label:" : :);
... some C/assembly code ...
}
Then global_label can be the correct address, assuming gcc does not
move code around agressively.
Thanks to all who replied to my question!
lin
--
Lin Gu
University of Virginia