This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Forgetting return values
- From: Jamie Prescott <jpresss at yahoo dot com>
- To: gcc at gcc dot gnu dot org
- Date: Thu, 28 May 2009 10:48:31 -0700 (PDT)
- Subject: Forgetting return values
What am I missing?
I have a simple:
static inline int set_prop(char const *path, char const *name,
void const *data, int size)
{
int error;
asm volatile ("int\t11\n\t"
: "=a0" (error): "a0" (path), "a1" (name), "a2" (data),
"a3" (size));
return error;
}
extern int calc(int);
int proc(int i)
{
int j = calc(i);
return set_prop(0, 0, &j, sizeof(int));
}
The aX classes maps to the rX registers, no problem for GCC in there.
The code above, compiled with GCC 4.4.0 and -O3 produces:
_proc:
push FP
mov SP,FP
sub SP,4,SP
call _calc
mov 0,r0
mov 4,r3
add FP,-4,r2
mov r0,r1
; APP
; 69 "xxxx.c" 1
int 11
; NO_APP
add SP,4,SP
pop FP
ret
GCC forgets about the calc() return value, and passes an address (FP-4) that
has never been written into.
buf if I add a "memory" clobber to the asm inline, everything comes back to
normal:
_proc:
push FP
mov SP,FP
sub SP,4,SP
call _calc
str.w r0,FP[-4]
mov 0,r0
mov 4,r3
add FP,-4,r2
mov r0,r1
; APP
; 69 "xxxx.c" 1
int 11
; NO_APP
add SP,4,SP
pop FP
ret
Why is the memory clobber required, and why GCC does not understand to
sync the value to memory when passing the address to a function?
Thanks,
- Jamie