jasonmolenda accepted this revision.
jasonmolenda added a comment.

This looks good, this is in line with what we discussed, thanks for taking it 
on!  Sorry for the delay at looking this over, it has been a little crazy this 
week.



================
Comment at: lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp:1760
+void RegisterContextLLDB::PropagateTrapHandlerFlag(
+    lldb::UnwindPlanSP unwind_plan) {
+  if (unwind_plan->GetUnwindPlanForSignalTrap() != eLazyBoolYes) {
----------------
clayborg wrote:
> JosephTremoulet wrote:
> > I'm a bit ambivalent about adding this part -- the downside is that it's 
> > not concretely helping today, because if an eh_frame record has the 'S' 
> > flag in its augmentation (which is what 
> > `unwind_Plan->GetUnwindPlanForSignalTrap()` reports), we'll have already 
> > decremented pc and generated unwind plans based on the prior function when 
> > initializing the register context.  But the upside is that this connects 
> > the dots between the otherwise-unused bit on the unwind plan and the frame 
> > type, and will be in place should we subsequently add code to try the 
> > second function's unwind plan as a fallback.
> I will let Jason comment on this one.
Yeah, this was my impression of the S augmentation flag in the eh_frame too -- 
we can't really use it in lldb today without forcing a scan of eh_frame entries 
the first time we unwind a function from that Module, and that would be 
unfortunate.  But I like to see the flag being parsed and recorded; at some 
point in the future we may find a good way to use it.


================
Comment at: lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp:1744
+    // frame may in fact be the first instruction of a signal return
+    // trampoline, rather than the instruction after a call.
+    UnwindLogMsg("Resetting current offset and re-doing symbol lookup; "
----------------
This is more a personal preference thing, but I would explicitly call out that 
we're addressing a problem on a platform where a trap handler is "added" to the 
stack by the kernel, but it hasn't actually been called and executed the way a 
normal function is, the PC is sitting on the first instruction of the function, 
so backing the pc up by 1 points us to the wrong function.

The kernel is presenting us with a stack frame that doesn't follow the normal 
ABI and execution models, and we're hacking around that.  It's perfectly OK to 
do that, but it's a specific enough thing we're addressing here, I think it'll 
be helpful to Future Us to name it explicitly.


================
Comment at: lldb/source/Plugins/Process/Utility/RegisterContextLLDB.h:125
+  /// update frame type and symbol context if so.
+  void PropagateTrapHandlerFlag(lldb::UnwindPlanSP unwind_plan);
+
----------------
This is very much a personal preference, but I might call this something like 
UpdateTrapHandlerFlagFromUnwindPlan.  I'm fine with this name if you find it 
clearer.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D64993



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

Reply via email to