> __builtin_frame_address(n) is not required to work for any value other
> than n=0.  It's not clear what it means anyway on a function that
> eliminates the frame pointer.
>
> On ARM you *cannot* walk the stack frames without additional
> information.  Frames are private to each function and there is no
> defined format for the layout.  In particular the layout (and the frame
> pointer register) is different for ARM and Thumb code, but the two can
> be freely intermixed.
>
> The only chance you have for producing a backtrace() is to have
> unwinding information similar to that provided for exception unwinding.
> This would describe to the unwinder how that frames code is laid out so
> that it can unpick it.

I agree that in general you need ancillary information way to get a backtrace 
on Arm. However if you assume only Arm code code and -fno-omit-frame-pointer 
then you can walk the frames. Given this assumption I think it make sense to 
have _b_f_a(0) force the use of a frame pointer.

If you're implementing "proper" unwinding then I'd say you want to use an 
assembly function stub to determine the initial frame, rather than relying on 
a rather ill-defined gcc builtin function. In other words 
__builtin_frame_address is effectively useless, so we may as well make it 
consistent with historical use than try to optimize it.

Th background to this problem is we have a client who was upset when 
backtrace() "broke" with gcc4. For this particular client 
-marm -fno-omit-frame-pointer -mapcs-frame is an acceptable price to play for 
making backtrace() work.

Paul

Reply via email to