3131using namespace lldb ;
3232using namespace lldb_private ;
3333
34- static AddressRange CollapseRanges (llvm::ArrayRef<AddressRange> ranges) {
35- if (ranges.empty ())
36- return AddressRange ();
37- if (ranges.size () == 1 )
38- return ranges[0 ];
39-
40- Address lowest_addr = ranges[0 ].GetBaseAddress ();
41- addr_t highest_addr = lowest_addr.GetFileAddress () + ranges[0 ].GetByteSize ();
42- for (const AddressRange &range : ranges.drop_front ()) {
43- Address range_begin = range.GetBaseAddress ();
44- addr_t range_end = range_begin.GetFileAddress () + range.GetByteSize ();
45- if (range_begin.GetFileAddress () < lowest_addr.GetFileAddress ())
46- lowest_addr = range_begin;
47- if (range_end > highest_addr)
48- highest_addr = range_end;
49- }
50- return AddressRange (lowest_addr, highest_addr - lowest_addr.GetFileAddress ());
51- }
52-
5334FuncUnwinders::FuncUnwinders (UnwindTable &unwind_table, Address addr,
5435 AddressRanges ranges)
5536 : m_unwind_table(unwind_table), m_addr(std::move(addr)),
56- m_ranges(std::move(ranges)), m_range(CollapseRanges(m_ranges) ),
57- m_tried_unwind_plan_assembly( false ), m_tried_unwind_plan_eh_frame(false ),
37+ m_ranges(std::move(ranges)), m_tried_unwind_plan_assembly( false ),
38+ m_tried_unwind_plan_eh_frame(false ),
5839 m_tried_unwind_plan_object_file(false ),
5940 m_tried_unwind_plan_debug_frame(false ),
6041 m_tried_unwind_plan_object_file_augmented(false ),
@@ -106,8 +87,9 @@ FuncUnwinders::GetCompactUnwindUnwindPlan(Target &target) {
10687 return nullptr ;
10788
10889 m_tried_unwind_plan_compact_unwind = true ;
109- if (m_range.GetBaseAddress ().IsValid ()) {
110- Address current_pc (m_range.GetBaseAddress ());
90+ // Only continuous functions are supported.
91+ if (m_ranges.size () == 1 ) {
92+ Address current_pc (m_ranges[0 ].GetBaseAddress ());
11193 CompactUnwindInfo *compact_unwind = m_unwind_table.GetCompactUnwindInfo ();
11294 if (compact_unwind) {
11395 auto unwind_plan_sp =
@@ -131,14 +113,10 @@ FuncUnwinders::GetObjectFileUnwindPlan(Target &target) {
131113 return m_unwind_plan_object_file_sp;
132114
133115 m_tried_unwind_plan_object_file = true ;
134- if (m_range.GetBaseAddress ().IsValid ()) {
135- CallFrameInfo *object_file_frame = m_unwind_table.GetObjectFileUnwindInfo ();
136- if (object_file_frame) {
137- auto plan_sp = std::make_shared<UnwindPlan>(lldb::eRegisterKindGeneric);
138- if (object_file_frame->GetUnwindPlan (m_range, *plan_sp))
139- m_unwind_plan_object_file_sp = std::move (plan_sp);
140- }
141- }
116+ if (CallFrameInfo *object_file_frame =
117+ m_unwind_table.GetObjectFileUnwindInfo ())
118+ m_unwind_plan_object_file_sp =
119+ object_file_frame->GetUnwindPlan (m_ranges, m_addr);
142120 return m_unwind_plan_object_file_sp;
143121}
144122
@@ -178,8 +156,9 @@ FuncUnwinders::GetArmUnwindUnwindPlan(Target &target) {
178156 return m_unwind_plan_arm_unwind_sp;
179157
180158 m_tried_unwind_plan_arm_unwind = true ;
181- if (m_range.GetBaseAddress ().IsValid ()) {
182- Address current_pc (m_range.GetBaseAddress ());
159+ // Only continuous functions are supported.
160+ if (m_ranges.size () == 1 ) {
161+ Address current_pc = m_ranges[0 ].GetBaseAddress ();
183162 ArmUnwindInfo *arm_unwind_info = m_unwind_table.GetArmUnwindInfo ();
184163 if (arm_unwind_info) {
185164 auto plan_sp = std::make_shared<UnwindPlan>(lldb::eRegisterKindGeneric);
@@ -215,9 +194,10 @@ FuncUnwinders::GetSymbolFileUnwindPlan(Thread &thread) {
215194 return m_unwind_plan_symbol_file_sp;
216195
217196 m_tried_unwind_plan_symbol_file = true ;
218- if (SymbolFile *symfile = m_unwind_table.GetSymbolFile ()) {
197+ if (SymbolFile *symfile = m_unwind_table.GetSymbolFile ();
198+ symfile && m_ranges.size () == 1 ) {
219199 m_unwind_plan_symbol_file_sp = symfile->GetUnwindPlan (
220- m_range .GetBaseAddress (),
200+ m_ranges[ 0 ] .GetBaseAddress (),
221201 RegisterContextToInfo (*thread.GetRegisterContext ()));
222202 }
223203 return m_unwind_plan_symbol_file_sp;
@@ -242,10 +222,11 @@ FuncUnwinders::GetObjectFileAugmentedUnwindPlan(Target &target,
242222 // so the UnwindPlan can be used at any instruction in the function.
243223
244224 UnwindAssemblySP assembly_profiler_sp (GetUnwindAssemblyProfiler (target));
245- if (assembly_profiler_sp) {
225+ // Only continuous functions are supported.
226+ if (assembly_profiler_sp && m_ranges.size () == 1 ) {
246227 auto plan_sp = std::make_shared<UnwindPlan>(*object_file_unwind_plan);
247228
248- if (assembly_profiler_sp->AugmentUnwindPlanFromCallSite (m_range , thread,
229+ if (assembly_profiler_sp->AugmentUnwindPlanFromCallSite (m_ranges[ 0 ] , thread,
249230 *plan_sp))
250231 m_unwind_plan_object_file_augmented_sp = std::move (plan_sp);
251232 }
@@ -280,9 +261,10 @@ FuncUnwinders::GetEHFrameAugmentedUnwindPlan(Target &target, Thread &thread) {
280261 // so the UnwindPlan can be used at any instruction in the function.
281262
282263 UnwindAssemblySP assembly_profiler_sp (GetUnwindAssemblyProfiler (target));
283- if (assembly_profiler_sp) {
264+ // Only continuous functions are supported.
265+ if (assembly_profiler_sp && m_ranges.size () == 1 ) {
284266 auto plan_sp = std::make_shared<UnwindPlan>(*eh_frame_plan);
285- if (assembly_profiler_sp->AugmentUnwindPlanFromCallSite (m_range , thread,
267+ if (assembly_profiler_sp->AugmentUnwindPlanFromCallSite (m_ranges[ 0 ] , thread,
286268 *plan_sp))
287269 m_unwind_plan_eh_frame_augmented_sp = std::move (plan_sp);
288270 }
@@ -319,10 +301,11 @@ FuncUnwinders::GetDebugFrameAugmentedUnwindPlan(Target &target,
319301 // function.
320302
321303 UnwindAssemblySP assembly_profiler_sp (GetUnwindAssemblyProfiler (target));
322- if (assembly_profiler_sp) {
304+ // Only continuous functions are supported.
305+ if (assembly_profiler_sp && m_ranges.size () == 1 ) {
323306 auto plan_sp = std::make_shared<UnwindPlan>(*debug_frame_plan);
324307
325- if (assembly_profiler_sp->AugmentUnwindPlanFromCallSite (m_range , thread,
308+ if (assembly_profiler_sp->AugmentUnwindPlanFromCallSite (m_ranges[ 0 ] , thread,
326309 *plan_sp))
327310 m_unwind_plan_debug_frame_augmented_sp = std::move (plan_sp);
328311 }
@@ -339,18 +322,19 @@ FuncUnwinders::GetAssemblyUnwindPlan(Target &target, Thread &thread) {
339322
340323 m_tried_unwind_plan_assembly = true ;
341324
342- // Don't analyze more than 10 megabytes of instructions,
343- // if a function is legitimately larger than that, we'll
344- // miss the epilogue instructions, but guard against a
345- // bogusly large function and analyzing large amounts of
346- // non-instruction data.
347- AddressRange range = m_range;
348- const addr_t func_size =
349- std::min (range.GetByteSize (), (addr_t )1024 * 10 * 10 );
350- range.SetByteSize (func_size);
351-
352325 UnwindAssemblySP assembly_profiler_sp (GetUnwindAssemblyProfiler (target));
353- if (assembly_profiler_sp) {
326+ // Only continuous functions are supported.
327+ if (assembly_profiler_sp && m_ranges.size () == 1 ) {
328+ // Don't analyze more than 10 megabytes of instructions,
329+ // if a function is legitimately larger than that, we'll
330+ // miss the epilogue instructions, but guard against a
331+ // bogusly large function and analyzing large amounts of
332+ // non-instruction data.
333+ AddressRange range = m_ranges[0 ];
334+ const addr_t func_size =
335+ std::min (range.GetByteSize (), (addr_t )1024 * 10 * 10 );
336+ range.SetByteSize (func_size);
337+
354338 auto plan_sp = std::make_shared<UnwindPlan>(lldb::eRegisterKindGeneric);
355339 if (assembly_profiler_sp->GetNonCallSiteUnwindPlanFromAssembly (
356340 range, thread, *plan_sp))
@@ -457,9 +441,9 @@ FuncUnwinders::GetUnwindPlanFastUnwind(Target &target, Thread &thread) {
457441 m_tried_unwind_fast = true ;
458442
459443 UnwindAssemblySP assembly_profiler_sp (GetUnwindAssemblyProfiler (target));
460- if (assembly_profiler_sp) {
444+ if (assembly_profiler_sp && m_ranges. size () == 1 ) {
461445 auto plan_sp = std::make_shared<UnwindPlan>(lldb::eRegisterKindGeneric);
462- if (assembly_profiler_sp->GetFastUnwindPlan (m_range , thread, *plan_sp))
446+ if (assembly_profiler_sp->GetFastUnwindPlan (m_ranges[ 0 ] , thread, *plan_sp))
463447 m_unwind_plan_fast_sp = std::move (plan_sp);
464448 }
465449 return m_unwind_plan_fast_sp;
@@ -503,19 +487,6 @@ FuncUnwinders::GetUnwindPlanArchitectureDefaultAtFunctionEntry(Thread &thread) {
503487 return m_unwind_plan_arch_default_at_func_entry_sp;
504488}
505489
506- Address &FuncUnwinders::GetFirstNonPrologueInsn (Target &target) {
507- std::lock_guard<std::recursive_mutex> guard (m_mutex);
508- if (m_first_non_prologue_insn.IsValid ())
509- return m_first_non_prologue_insn;
510-
511- ExecutionContext exe_ctx (target.shared_from_this (), false );
512- UnwindAssemblySP assembly_profiler_sp (GetUnwindAssemblyProfiler (target));
513- if (assembly_profiler_sp)
514- assembly_profiler_sp->FirstNonPrologueInsn (m_range, exe_ctx,
515- m_first_non_prologue_insn);
516- return m_first_non_prologue_insn;
517- }
518-
519490const Address &FuncUnwinders::GetFunctionStartAddress () const { return m_addr; }
520491
521492lldb::UnwindAssemblySP
0 commit comments