Simplify FuncUnwinders::GetEHFrameAugmentedUnwindPlan
authorPavel Labath <labath@google.com>
Wed, 6 May 2015 15:54:48 +0000 (15:54 +0000)
committerPavel Labath <labath@google.com>
Wed, 6 May 2015 15:54:48 +0000 (15:54 +0000)
Summary:
GetEHFrameAugmentedUnwindPlan duplicated the work of GetEHFrameUnwindPlan in getting the original
plan from DWARF CFI. This changes the function to call GetEHFrameUnwindPlan instead of doing all
the work itself. A copy constructor is added to UnwindPlan to enable plan copying.

Test Plan: No regressions on linux test suite.

Reviewers: jasonmolenda, clayborg

Subscribers: lldb-commits

Differential Revision: http://reviews.llvm.org/D9369

llvm-svn: 236607

lldb/include/lldb/Symbol/UnwindPlan.h
lldb/source/Symbol/FuncUnwinders.cpp

index 74f3881..bfc008a 100644 (file)
@@ -504,6 +504,22 @@ public:
     {
     }
 
+    // Performs a deep copy of the plan, including all the rows (expensive).
+    UnwindPlan (const UnwindPlan &rhs) :
+        m_plan_valid_address_range (rhs.m_plan_valid_address_range),
+        m_register_kind (rhs.m_register_kind),
+        m_return_addr_register (rhs.m_return_addr_register),
+        m_source_name (rhs.m_source_name),
+        m_plan_is_sourced_from_compiler (rhs.m_plan_is_sourced_from_compiler),
+        m_plan_is_valid_at_all_instruction_locations (rhs.m_plan_is_valid_at_all_instruction_locations),
+        m_lsda_address (rhs.m_lsda_address),
+        m_personality_func_addr (rhs.m_personality_func_addr)
+    {
+        m_row_list.reserve (rhs.m_row_list.size());
+        for (const RowSP &row_sp: rhs.m_row_list)
+            m_row_list.emplace_back (new Row (*row_sp));
+    }
+
     ~UnwindPlan ()
        {
        }
index 1eb73ee..a36d554 100644 (file)
@@ -145,39 +145,27 @@ FuncUnwinders::GetEHFrameAugmentedUnwindPlan (Target &target, Thread &thread, in
     Mutex::Locker lock (m_mutex);
     m_tried_unwind_plan_eh_frame_augmented = true;
 
-    if (m_range.GetBaseAddress().IsValid())
+    UnwindPlanSP eh_frame_plan = GetEHFrameUnwindPlan (target, current_offset);
+    if (!eh_frame_plan)
+        return m_unwind_plan_eh_frame_augmented_sp;
+
+    m_unwind_plan_eh_frame_augmented_sp.reset(new UnwindPlan(*eh_frame_plan));
+
+    // Augment the eh_frame instructions with epilogue descriptions if necessary so the
+    // UnwindPlan can be used at any instruction in the function.
+
+    UnwindAssemblySP assembly_profiler_sp (GetUnwindAssemblyProfiler());
+    if (assembly_profiler_sp)
     {
-        Address current_pc (m_range.GetBaseAddress ());
-        if (current_offset != -1)
-            current_pc.SetOffset (current_pc.GetOffset() + current_offset);
-        DWARFCallFrameInfo *eh_frame = m_unwind_table.GetEHFrameInfo();
-        if (eh_frame)
+        if (!assembly_profiler_sp->AugmentUnwindPlanFromCallSite (m_range, thread, *m_unwind_plan_eh_frame_augmented_sp))
         {
-            m_unwind_plan_eh_frame_augmented_sp.reset (new UnwindPlan (lldb::eRegisterKindGeneric));
-            if (!eh_frame->GetUnwindPlan (current_pc, *m_unwind_plan_eh_frame_augmented_sp))
-            {
-                m_unwind_plan_eh_frame_augmented_sp.reset();
-            }
-            else
-            {
-                // Augment the eh_frame instructions with epilogue descriptions if necessary so the
-                // UnwindPlan can be used at any instruction in the function.
-
-                UnwindAssemblySP assembly_profiler_sp (GetUnwindAssemblyProfiler());
-                if (assembly_profiler_sp)
-                {
-                    if (!assembly_profiler_sp->AugmentUnwindPlanFromCallSite (m_range, thread, *m_unwind_plan_eh_frame_augmented_sp))
-                    {
-                        m_unwind_plan_eh_frame_augmented_sp.reset();
-                    }
-                }
-                else
-                {
-                    m_unwind_plan_eh_frame_augmented_sp.reset();
-                }
-            }
+            m_unwind_plan_eh_frame_augmented_sp.reset();
         }
     }
+    else
+    {
+        m_unwind_plan_eh_frame_augmented_sp.reset();
+    }
     return m_unwind_plan_eh_frame_augmented_sp;
 }