[Lldb-commits] [PATCH] D64993: Fix PC adjustment in StackFrame::GetSymbolContext

Greg Clayton via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Wed Jul 31 07:12:33 PDT 2019


clayborg requested changes to this revision.
clayborg added a comment.
This revision now requires changes to proceed.

I will let Jason comment on the unwind specifics since this is his area. I caught a few other things that need to be cleaned up.



================
Comment at: lldb/include/lldb/Target/Unwind.h:40
     uint32_t idx;
+    bool behaves_like_zeroth_frame;
 
----------------
initialize with value just in case.


================
Comment at: lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp:153-155
+  AddressRange addr_range;
+  m_sym_ctx_valid = TryResolveSymbolContextAndAddressRange(
+      m_current_pc, m_sym_ctx, addr_range);
----------------
See comment for RegisterContextLLDB::TryResolveSymbolContextAndAddressRange, but if we change as suggested this will become:
```
m_sym_ctx_valid = m_current_pc.ResolveFunctionScope(m_sym_ctx, nullptr);
```


================
Comment at: lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp:430-432
+  AddressRange addr_range;
+  m_sym_ctx_valid = TryResolveSymbolContextAndAddressRange(
+      m_current_pc, m_sym_ctx, addr_range);
----------------
See comment for RegisterContextLLDB::TryResolveSymbolContextAndAddressRange, but if we change as suggested this will become:
```
m_sym_ctx_valid = m_current_pc.ResolveFunctionScope(m_sym_ctx, nullptr);
```


================
Comment at: lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp:486-487
     m_sym_ctx.Clear(false);
-    m_sym_ctx_valid = false;
-    SymbolContextItem resolve_scope =
-        eSymbolContextFunction | eSymbolContextSymbol;
-
-    ModuleSP temporary_module_sp = temporary_pc.GetModule();
-    if (temporary_module_sp &&
-        temporary_module_sp->ResolveSymbolContextForAddress(
-            temporary_pc, resolve_scope, m_sym_ctx) &
-            resolve_scope) {
-      if (m_sym_ctx.GetAddressRange(resolve_scope, 0, false, addr_range))
-        m_sym_ctx_valid = true;
-    }
+    m_sym_ctx_valid = TryResolveSymbolContextAndAddressRange(
+        temporary_pc, m_sym_ctx, addr_range);
+
----------------
See comment for RegisterContextLLDB::TryResolveSymbolContextAndAddressRange, but if we change as suggested this will become:
```
m_sym_ctx_valid = m_current_pc.ResolveFunctionScope(m_sym_ctx, &addr_range);
```


================
Comment at: lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp:595-624
+bool RegisterContextLLDB::TryResolveSymbolContextAndAddressRange(
+    lldb_private::Address pc, lldb_private::SymbolContext &sym_ctx,
+    lldb_private::AddressRange &addr_range) {
+  ModuleSP pc_module_sp = pc.GetModule();
+
+  // Can't resolve context without a module.
+  if (!pc_module_sp)
----------------
This function doesn't belong in RegisterContextLLDB. It think lldb_private::Address would be a better place:

```
/// if "addr_range_ptr" is not NULL, then fill in with the address range of the function.
bool lldb_private::Address::ResolveFunctionScope(lldb_private::SymbolContext &sym_ctx, lldb_private::AddressRange *addr_range_ptr) {
  constexpr bool resolve_tail_call_address = false;
  constexpr SymbolContextItem resolve_scope = eSymbolContextFunction | eSymbolContextSymbol;
  if (!CalculateSymbolContext(&sym_ctx, resolve_scope))
   return false;
  if (!addr_range_ptr)
    return true;
  return sym_ctx.GetAddressRange(resolve_scope, 0, false, *addr_range_ptr);  
}
```


================
Comment at: lldb/source/Plugins/Process/Utility/RegisterContextLLDB.cpp:1760
+void RegisterContextLLDB::PropagateTrapHandlerFlag(
+    lldb::UnwindPlanSP unwind_plan) {
+  if (unwind_plan->GetUnwindPlanForSignalTrap() != eLazyBoolYes) {
----------------
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.


================
Comment at: lldb/source/Target/StackFrameList.cpp:453
     lldb::addr_t cfa = LLDB_INVALID_ADDRESS;
+    bool behaves_like_zeroth_frame;
     if (idx == 0) {
----------------
init with value


================
Comment at: lldb/source/Target/StackFrameList.cpp:670
         addr_t pc, cfa;
-        if (unwinder->GetFrameInfoAtIndex(idx, cfa, pc)) {
+        bool behaves_like_zeroth_frame;
+        if (unwinder->GetFrameInfoAtIndex(idx, cfa, pc,
----------------
init with value


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D64993





More information about the lldb-commits mailing list