31
31
using namespace lldb ;
32
32
using namespace lldb_private ;
33
33
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
-
53
34
FuncUnwinders::FuncUnwinders (UnwindTable &unwind_table, Address addr,
54
35
AddressRanges ranges)
55
36
: 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 ),
58
39
m_tried_unwind_plan_object_file(false ),
59
40
m_tried_unwind_plan_debug_frame(false ),
60
41
m_tried_unwind_plan_object_file_augmented(false ),
@@ -106,8 +87,9 @@ FuncUnwinders::GetCompactUnwindUnwindPlan(Target &target) {
106
87
return nullptr ;
107
88
108
89
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 ());
111
93
CompactUnwindInfo *compact_unwind = m_unwind_table.GetCompactUnwindInfo ();
112
94
if (compact_unwind) {
113
95
auto unwind_plan_sp =
@@ -131,14 +113,10 @@ FuncUnwinders::GetObjectFileUnwindPlan(Target &target) {
131
113
return m_unwind_plan_object_file_sp;
132
114
133
115
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);
142
120
return m_unwind_plan_object_file_sp;
143
121
}
144
122
@@ -178,8 +156,9 @@ FuncUnwinders::GetArmUnwindUnwindPlan(Target &target) {
178
156
return m_unwind_plan_arm_unwind_sp;
179
157
180
158
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 ();
183
162
ArmUnwindInfo *arm_unwind_info = m_unwind_table.GetArmUnwindInfo ();
184
163
if (arm_unwind_info) {
185
164
auto plan_sp = std::make_shared<UnwindPlan>(lldb::eRegisterKindGeneric);
@@ -215,9 +194,10 @@ FuncUnwinders::GetSymbolFileUnwindPlan(Thread &thread) {
215
194
return m_unwind_plan_symbol_file_sp;
216
195
217
196
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 ) {
219
199
m_unwind_plan_symbol_file_sp = symfile->GetUnwindPlan (
220
- m_range .GetBaseAddress (),
200
+ m_ranges[ 0 ] .GetBaseAddress (),
221
201
RegisterContextToInfo (*thread.GetRegisterContext ()));
222
202
}
223
203
return m_unwind_plan_symbol_file_sp;
@@ -242,10 +222,11 @@ FuncUnwinders::GetObjectFileAugmentedUnwindPlan(Target &target,
242
222
// so the UnwindPlan can be used at any instruction in the function.
243
223
244
224
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 ) {
246
227
auto plan_sp = std::make_shared<UnwindPlan>(*object_file_unwind_plan);
247
228
248
- if (assembly_profiler_sp->AugmentUnwindPlanFromCallSite (m_range , thread,
229
+ if (assembly_profiler_sp->AugmentUnwindPlanFromCallSite (m_ranges[ 0 ] , thread,
249
230
*plan_sp))
250
231
m_unwind_plan_object_file_augmented_sp = std::move (plan_sp);
251
232
}
@@ -280,9 +261,10 @@ FuncUnwinders::GetEHFrameAugmentedUnwindPlan(Target &target, Thread &thread) {
280
261
// so the UnwindPlan can be used at any instruction in the function.
281
262
282
263
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 ) {
284
266
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,
286
268
*plan_sp))
287
269
m_unwind_plan_eh_frame_augmented_sp = std::move (plan_sp);
288
270
}
@@ -319,10 +301,11 @@ FuncUnwinders::GetDebugFrameAugmentedUnwindPlan(Target &target,
319
301
// function.
320
302
321
303
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 ) {
323
306
auto plan_sp = std::make_shared<UnwindPlan>(*debug_frame_plan);
324
307
325
- if (assembly_profiler_sp->AugmentUnwindPlanFromCallSite (m_range , thread,
308
+ if (assembly_profiler_sp->AugmentUnwindPlanFromCallSite (m_ranges[ 0 ] , thread,
326
309
*plan_sp))
327
310
m_unwind_plan_debug_frame_augmented_sp = std::move (plan_sp);
328
311
}
@@ -339,18 +322,19 @@ FuncUnwinders::GetAssemblyUnwindPlan(Target &target, Thread &thread) {
339
322
340
323
m_tried_unwind_plan_assembly = true ;
341
324
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
-
352
325
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
+
354
338
auto plan_sp = std::make_shared<UnwindPlan>(lldb::eRegisterKindGeneric);
355
339
if (assembly_profiler_sp->GetNonCallSiteUnwindPlanFromAssembly (
356
340
range, thread, *plan_sp))
@@ -457,9 +441,9 @@ FuncUnwinders::GetUnwindPlanFastUnwind(Target &target, Thread &thread) {
457
441
m_tried_unwind_fast = true ;
458
442
459
443
UnwindAssemblySP assembly_profiler_sp (GetUnwindAssemblyProfiler (target));
460
- if (assembly_profiler_sp) {
444
+ if (assembly_profiler_sp && m_ranges. size () == 1 ) {
461
445
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))
463
447
m_unwind_plan_fast_sp = std::move (plan_sp);
464
448
}
465
449
return m_unwind_plan_fast_sp;
@@ -503,19 +487,6 @@ FuncUnwinders::GetUnwindPlanArchitectureDefaultAtFunctionEntry(Thread &thread) {
503
487
return m_unwind_plan_arch_default_at_func_entry_sp;
504
488
}
505
489
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
-
519
490
const Address &FuncUnwinders::GetFunctionStartAddress () const { return m_addr; }
520
491
521
492
lldb::UnwindAssemblySP
0 commit comments