This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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



      


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]