labath created this revision.
labath added reviewers: jasonmolenda, aprantl.

Some (but not all) of the unwind plan creation functions were checking
the validity of their address range before they attempted to create the
unwind plan.

Since a FuncUnwinders object cannot do anything reasonable with an
invalid address range, in this patch I remove the checks in from the
creation functions, and instead make it's validity a class invariant.
This makes it the responsibility of whoever's creating the FuncUnwinders
to ensure it does that with a valid address range, which is easy to
achieve as there is only one place we are doing that.


https://reviews.llvm.org/D61004

Files:
  include/lldb/Symbol/FuncUnwinders.h
  source/Symbol/FuncUnwinders.cpp
  source/Symbol/UnwindTable.cpp

Index: source/Symbol/UnwindTable.cpp
===================================================================
--- source/Symbol/UnwindTable.cpp
+++ source/Symbol/UnwindTable.cpp
@@ -89,11 +89,13 @@
     return range;
 
   // Does the eh_frame unwind info has a function bounds for this addr?
-  if (m_eh_frame_up && m_eh_frame_up->GetAddressRange(addr, range))
+  if (m_eh_frame_up && m_eh_frame_up->GetAddressRange(addr, range) &&
+      range.GetBaseAddress().IsValid())
     return range;
 
   // Try debug_frame as well
-  if (m_debug_frame_up && m_debug_frame_up->GetAddressRange(addr, range))
+  if (m_debug_frame_up && m_debug_frame_up->GetAddressRange(addr, range) &&
+      range.GetBaseAddress().IsValid())
     return range;
 
   return llvm::None;
Index: source/Symbol/FuncUnwinders.cpp
===================================================================
--- source/Symbol/FuncUnwinders.cpp
+++ source/Symbol/FuncUnwinders.cpp
@@ -45,7 +45,9 @@
       m_tried_unwind_plan_arm_unwind(false), m_tried_unwind_fast(false),
       m_tried_unwind_arch_default(false),
       m_tried_unwind_arch_default_at_func_entry(false),
-      m_first_non_prologue_insn() {}
+      m_first_non_prologue_insn() {
+  assert(range.GetBaseAddress().IsValid());
+}
 
 /// destructor
 
@@ -75,17 +77,15 @@
     return UnwindPlanSP();
 
   m_tried_unwind_plan_compact_unwind = true;
-  if (m_range.GetBaseAddress().IsValid()) {
-    Address current_pc(m_range.GetBaseAddress());
-    CompactUnwindInfo *compact_unwind = m_unwind_table.GetCompactUnwindInfo();
-    if (compact_unwind) {
-      UnwindPlanSP unwind_plan_sp(new UnwindPlan(lldb::eRegisterKindGeneric));
-      if (compact_unwind->GetUnwindPlan(target, current_pc, *unwind_plan_sp)) {
-        m_unwind_plan_compact_unwind.push_back(unwind_plan_sp);
-        return m_unwind_plan_compact_unwind[0]; // FIXME support multiple
-                                                // compact unwind plans for one
-                                                // func
-      }
+  Address current_pc(m_range.GetBaseAddress());
+  CompactUnwindInfo *compact_unwind = m_unwind_table.GetCompactUnwindInfo();
+  if (compact_unwind) {
+    UnwindPlanSP unwind_plan_sp(new UnwindPlan(lldb::eRegisterKindGeneric));
+    if (compact_unwind->GetUnwindPlan(target, current_pc, *unwind_plan_sp)) {
+      m_unwind_plan_compact_unwind.push_back(unwind_plan_sp);
+      return m_unwind_plan_compact_unwind[0]; // FIXME support multiple
+                                              // compact unwind plans for one
+                                              // func
     }
   }
   return UnwindPlanSP();
@@ -97,14 +97,12 @@
     return m_unwind_plan_eh_frame_sp;
 
   m_tried_unwind_plan_eh_frame = true;
-  if (m_range.GetBaseAddress().IsValid()) {
-    DWARFCallFrameInfo *eh_frame = m_unwind_table.GetEHFrameInfo();
-    if (eh_frame) {
-      m_unwind_plan_eh_frame_sp =
-          std::make_shared<UnwindPlan>(lldb::eRegisterKindGeneric);
-      if (!eh_frame->GetUnwindPlan(m_range, *m_unwind_plan_eh_frame_sp))
-        m_unwind_plan_eh_frame_sp.reset();
-    }
+  DWARFCallFrameInfo *eh_frame = m_unwind_table.GetEHFrameInfo();
+  if (eh_frame) {
+    m_unwind_plan_eh_frame_sp =
+        std::make_shared<UnwindPlan>(lldb::eRegisterKindGeneric);
+    if (!eh_frame->GetUnwindPlan(m_range, *m_unwind_plan_eh_frame_sp))
+      m_unwind_plan_eh_frame_sp.reset();
   }
   return m_unwind_plan_eh_frame_sp;
 }
@@ -115,14 +113,13 @@
     return m_unwind_plan_debug_frame_sp;
 
   m_tried_unwind_plan_debug_frame = true;
-  if (m_range.GetBaseAddress().IsValid()) {
-    DWARFCallFrameInfo *debug_frame = m_unwind_table.GetDebugFrameInfo();
-    if (debug_frame) {
-      m_unwind_plan_debug_frame_sp =
-          std::make_shared<UnwindPlan>(lldb::eRegisterKindGeneric);
-      if (!debug_frame->GetUnwindPlan(m_range, *m_unwind_plan_debug_frame_sp))
-        m_unwind_plan_debug_frame_sp.reset();
-    }
+  DWARFCallFrameInfo *debug_frame = m_unwind_table.GetDebugFrameInfo();
+  if (debug_frame) {
+    m_unwind_plan_debug_frame_sp =
+        std::make_shared<UnwindPlan>(lldb::eRegisterKindGeneric);
+    if (!debug_frame->GetUnwindPlan(m_range,
+                                    *m_unwind_plan_debug_frame_sp))
+      m_unwind_plan_debug_frame_sp.reset();
   }
   return m_unwind_plan_debug_frame_sp;
 }
@@ -133,16 +130,14 @@
     return m_unwind_plan_arm_unwind_sp;
 
   m_tried_unwind_plan_arm_unwind = true;
-  if (m_range.GetBaseAddress().IsValid()) {
-    Address current_pc(m_range.GetBaseAddress());
-    ArmUnwindInfo *arm_unwind_info = m_unwind_table.GetArmUnwindInfo();
-    if (arm_unwind_info) {
-      m_unwind_plan_arm_unwind_sp =
-          std::make_shared<UnwindPlan>(lldb::eRegisterKindGeneric);
-      if (!arm_unwind_info->GetUnwindPlan(target, current_pc,
-                                          *m_unwind_plan_arm_unwind_sp))
-        m_unwind_plan_arm_unwind_sp.reset();
-    }
+  Address current_pc(m_range.GetBaseAddress());
+  ArmUnwindInfo *arm_unwind_info = m_unwind_table.GetArmUnwindInfo();
+  if (arm_unwind_info) {
+    m_unwind_plan_arm_unwind_sp =
+        std::make_shared<UnwindPlan>(lldb::eRegisterKindGeneric);
+    if (!arm_unwind_info->GetUnwindPlan(target, current_pc,
+                                        *m_unwind_plan_arm_unwind_sp))
+      m_unwind_plan_arm_unwind_sp.reset();
   }
   return m_unwind_plan_arm_unwind_sp;
 }
Index: include/lldb/Symbol/FuncUnwinders.h
===================================================================
--- include/lldb/Symbol/FuncUnwinders.h
+++ include/lldb/Symbol/FuncUnwinders.h
@@ -31,6 +31,9 @@
   // instructions are finished for migrating breakpoints past the stack frame
   // setup instructions when we don't have line table information.
 
+  /// Create the FuncUnwinders object for the given address range. The object
+  /// will use the data from the given UnwindTable for UnwindPlan generation.
+  /// The input address range must be valid.
   FuncUnwinders(lldb_private::UnwindTable &unwind_table, AddressRange range);
 
   ~FuncUnwinders();
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to