I think I have tracked down the cause of the problem. It seems that the
extern declaration of __get_frame_address (in iomacros.h) causes the
compiler to assume that it really is an external call. I assume this
doesn't affect the other builtins as they return void. By removing this
declaration the correct code is generated, however this isn't really a fix
as the return type is undefined.
Regards
Phil Sambles.
Compiler is gcc-3.4.0 running under cygwin on Windows 2000.
Command line is: msp430-gcc -S test.c
The following code:
#include <iomacros.h>
void *func1(void)
{
return GET_FRAME_ADDR_F();
}
produces this assembler output:
func1:
.L__FrameSize_func1=0x0
.L__FrameOffset_func1=0x4
push r5
push r4
call #__get_frame_address
pop r4
pop r5
ret
Commenting out line 126 of iomacros.h (extern void
*__get_frame_address(void);) gives the following output:
func1:
.L__FrameSize_func1=0x0
.L__FrameOffset_func1=0x4
push r5
push r4
mov .L__FrameOffset_func1(r1), r15
pop r4
pop r5
ret
Philip Sambles wrote:
> Using gcc-3.4.0, calls to __get_frame_address are generating CALL
> instructions (and therefore undefined symbols at link). They don't
> seem to be identified as a builtin.
> The other builtins (__bic_sr_irq and __bis_sr_irq) work as expected.
>
> Has anybody got any bright ideas as to where the problem might lie?