rnk added a comment.

In https://reviews.llvm.org/D38680#903203, @joerg wrote:

> I've looked at this in some detail now. I'm not exactly sure yet why it is 
> broken. The patch seems quite wrong to me. DW_CFA_GNU_args_size should be 
> applied only when unwinding a call instruction and that regard, the commit 
> message of the original change is quite correct. What I am still trying to 
> understand is how the precise unwind frame disagrees with the unwinder.


If you look at Clang's output here https://godbolt.org/g/jFcSxz, you can see 
that we emit precise CFA adjustments for each push. We don't need to adjust the 
CFA by gnu arg size in UnwindCursor::step, which unwinds through frames. We 
only apply it when setting up the register context before transitioning to the 
landingpad. That's why unw_set_reg UNW_REG_IP is at least approximately the 
right place to do this SP adjustment, IMO.

Basically, a general purpose unwinder that collects return addresses can ignore 
gnu args size because we already have CFA adjustments, but an unwinder that 
implements landingpad transitions must adjust SP by gnu arg size as part of 
that context switch.

At least, that's how I understand this change. Maybe older (VAX?) compilers 
didn't implement gnu arg size this way, but at least with this patch, we 
handshake with ourselves correctly.


https://reviews.llvm.org/D38680



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to