[parisc-linux] pa __builtin_return_addr

Alan Modra alan@SPRI.Levels.UniSA.Edu.Au
Sat, 5 May 2001 22:11:43 +0930 (CST)


Hi Jeff,
  I stumbled on this one a couple of hours ago, and haven't figured out
a good fix yet.

cat >builtin_ret.c <<EOF
void *foo (void) { return __builtin_return_address (0); }
EOF
gcc -O -S -mno-space-regs builtin_ret.c

gives (trimming somewhat)
foo:
        bv %r0(%r2)
        ldw -20(%r30),%r28	# Oops, we never stored r2 at -20(%r30)

The fix I have in mind is to add some communication between
builtins.c:expand_builtin_return_addr and pa.c:hppa_expand_prologue.
eg. add a field to struct machine_function, and set it in
pa.c:return_addr_rtx to indicate that r2 must be saved.


A similar problem occurs with
cat >builtin_frame.c <<EOF
void *foo (void) { return __builtin_frame_address (1); }
EOF
gcc -O -S builtin_frame.c

foo:
        bv %r0(%r2)
        ldw 0(%r30),%r28	# Oops, we haven't saved a frame pointer.

We ought to be able to make __builtin_frame_address (n) work reliably for
n = 0 and n = 1 by something similar to the fix I'm proposing for the
return address problem.  ie. set a "frame_pointer_needed" flag in
struct machine_function.

-- 
Alan Modra