jasonmolenda added a comment.

Michael and I looked into this.  This simple c++ file is resulting in eh_frame 
unwind info on aarch64 darwin instead of compact unwind info.  The eh_frame 
instructions don't describe the epilogue, so lldb is stopping on the final RET 
instruction after it has adjusted $sp back to its original value and the unwind 
now fails to work in the debugger.  That's always the problem with 
eh_frame/debug_frame from the debugger's point of view - it's only guaranteed 
to describe the unwind state at throwable locations.  gdb lives exclusively off 
of eh_frame/debug_frame so in practice gcc/clang (at least on intel) describe 
both the prologue and the epilogue for the debugger's benefit.  But that's not 
what this eh_frame includes on aarch64 darwin, and it breaks the debugger 
because it's trusting the eh_frame to be accurate at every instruction point.

The emission of eh_frame on aarch64 darwin instead of compact unwind, for this 
simple codegen, is a bug and cannot remain in the tree unfixed.  It will 
increase binary size and reduce throw performance.  It also happens to cause 
lldb regressions like this because we've never lived off of eh_frame as our 
primary unwind format on this platform, but that's a separate issue and I'm not 
going to dig in to finding a way to detect this & ignore the eh_frame on this 
target.

Looking at the failing test case that Michael has been debugging, none of these 
methods have a personality, and yet we're getting eh_frame instead of compact 
unwind.  That's the bug.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D144999/new/

https://reviews.llvm.org/D144999

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

Reply via email to