Skip to content

Commit 13245ce

Browse files
authored
[lldb] Modernize ABI-based unwind plan creation (#128505)
Replace the by-ref return value with an actual result.
1 parent 2d12c9e commit 13245ce

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+320
-445
lines changed

lldb/include/lldb/Symbol/UnwindPlan.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,11 @@ class UnwindPlan {
452452
for (const RowSP &row_sp : rhs.m_row_list)
453453
m_row_list.emplace_back(new Row(*row_sp));
454454
}
455+
UnwindPlan(UnwindPlan &&rhs) = default;
456+
UnwindPlan &operator=(const UnwindPlan &rhs) {
457+
return *this = UnwindPlan(rhs); // NB: moving from a temporary (deep) copy
458+
}
459+
UnwindPlan &operator=(UnwindPlan &&) = default;
455460

456461
~UnwindPlan() = default;
457462

lldb/include/lldb/Target/ABI.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "lldb/Symbol/UnwindPlan.h"
1414
#include "lldb/Target/DynamicRegisterInfo.h"
1515
#include "lldb/Utility/Status.h"
16+
#include "lldb/lldb-forward.h"
1617
#include "lldb/lldb-private.h"
1718

1819
#include "llvm/ADT/ArrayRef.h"
@@ -96,9 +97,9 @@ class ABI : public PluginInterface {
9697
lldb::ProcessSP GetProcessSP() const { return m_process_wp.lock(); }
9798

9899
public:
99-
virtual bool CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) = 0;
100+
virtual lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() = 0;
100101

101-
virtual bool CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) = 0;
102+
virtual lldb::UnwindPlanSP CreateDefaultUnwindPlan() = 0;
102103

103104
virtual bool RegisterIsVolatile(const RegisterInfo *reg_info) = 0;
104105

lldb/source/Commands/CommandObjectTarget.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3763,20 +3763,18 @@ class CommandObjectTargetModulesShowUnwind : public CommandObjectParsed {
37633763

37643764
ABISP abi_sp = process->GetABI();
37653765
if (abi_sp) {
3766-
UnwindPlan arch_default(lldb::eRegisterKindGeneric);
3767-
if (abi_sp->CreateDefaultUnwindPlan(arch_default)) {
3766+
if (UnwindPlanSP plan_sp = abi_sp->CreateDefaultUnwindPlan()) {
37683767
result.GetOutputStream().Printf("Arch default UnwindPlan:\n");
3769-
arch_default.Dump(result.GetOutputStream(), thread.get(),
3770-
LLDB_INVALID_ADDRESS);
3768+
plan_sp->Dump(result.GetOutputStream(), thread.get(),
3769+
LLDB_INVALID_ADDRESS);
37713770
result.GetOutputStream().Printf("\n");
37723771
}
37733772

3774-
UnwindPlan arch_entry(lldb::eRegisterKindGeneric);
3775-
if (abi_sp->CreateFunctionEntryUnwindPlan(arch_entry)) {
3773+
if (UnwindPlanSP plan_sp = abi_sp->CreateFunctionEntryUnwindPlan()) {
37763774
result.GetOutputStream().Printf(
37773775
"Arch default at entry point UnwindPlan:\n");
3778-
arch_entry.Dump(result.GetOutputStream(), thread.get(),
3779-
LLDB_INVALID_ADDRESS);
3776+
plan_sp->Dump(result.GetOutputStream(), thread.get(),
3777+
LLDB_INVALID_ADDRESS);
37803778
result.GetOutputStream().Printf("\n");
37813779
}
37823780
}

lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.cpp

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -343,10 +343,7 @@ ABIMacOSX_arm64::SetReturnValueObject(lldb::StackFrameSP &frame_sp,
343343
return error;
344344
}
345345

346-
bool ABIMacOSX_arm64::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) {
347-
unwind_plan.Clear();
348-
unwind_plan.SetRegisterKind(eRegisterKindDWARF);
349-
346+
UnwindPlanSP ABIMacOSX_arm64::CreateFunctionEntryUnwindPlan() {
350347
uint32_t lr_reg_num = arm64_dwarf::lr;
351348
uint32_t sp_reg_num = arm64_dwarf::sp;
352349
uint32_t pc_reg_num = arm64_dwarf::pc;
@@ -356,23 +353,17 @@ bool ABIMacOSX_arm64::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) {
356353
// Our previous Call Frame Address is the stack pointer
357354
row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0);
358355

359-
// Our previous PC is in the LR
356+
// Our previous PC is in the LR, all other registers are the same.
360357
row->SetRegisterLocationToRegister(pc_reg_num, lr_reg_num, true);
361358

362-
unwind_plan.AppendRow(row);
363-
364-
// All other registers are the same.
365-
366-
unwind_plan.SetSourceName("arm64 at-func-entry default");
367-
unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
368-
369-
return true;
359+
auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF);
360+
plan_sp->AppendRow(row);
361+
plan_sp->SetSourceName("arm64 at-func-entry default");
362+
plan_sp->SetSourcedFromCompiler(eLazyBoolNo);
363+
return plan_sp;
370364
}
371365

372-
bool ABIMacOSX_arm64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) {
373-
unwind_plan.Clear();
374-
unwind_plan.SetRegisterKind(eRegisterKindDWARF);
375-
366+
UnwindPlanSP ABIMacOSX_arm64::CreateDefaultUnwindPlan() {
376367
uint32_t fp_reg_num = arm64_dwarf::fp;
377368
uint32_t pc_reg_num = arm64_dwarf::pc;
378369

@@ -386,12 +377,13 @@ bool ABIMacOSX_arm64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) {
386377
row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, ptr_size * -2, true);
387378
row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true);
388379

389-
unwind_plan.AppendRow(row);
390-
unwind_plan.SetSourceName("arm64-apple-darwin default unwind plan");
391-
unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
392-
unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);
393-
unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo);
394-
return true;
380+
auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF);
381+
plan_sp->AppendRow(row);
382+
plan_sp->SetSourceName("arm64-apple-darwin default unwind plan");
383+
plan_sp->SetSourcedFromCompiler(eLazyBoolNo);
384+
plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);
385+
plan_sp->SetUnwindPlanForSignalTrap(eLazyBoolNo);
386+
return plan_sp;
395387
}
396388

397389
// AAPCS64 (Procedure Call Standard for the ARM 64-bit Architecture) says

lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,9 @@ class ABIMacOSX_arm64 : public ABIAArch64 {
2727
bool GetArgumentValues(lldb_private::Thread &thread,
2828
lldb_private::ValueList &values) const override;
2929

30-
bool
31-
CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;
30+
lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override;
3231

33-
bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;
32+
lldb::UnwindPlanSP CreateDefaultUnwindPlan() override;
3433

3534
bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override;
3635

lldb/source/Plugins/ABI/AArch64/ABISysV_arm64.cpp

Lines changed: 19 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -391,35 +391,27 @@ Status ABISysV_arm64::SetReturnValueObject(lldb::StackFrameSP &frame_sp,
391391
return error;
392392
}
393393

394-
bool ABISysV_arm64::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) {
395-
unwind_plan.Clear();
396-
unwind_plan.SetRegisterKind(eRegisterKindDWARF);
397-
394+
UnwindPlanSP ABISysV_arm64::CreateFunctionEntryUnwindPlan() {
398395
uint32_t lr_reg_num = arm64_dwarf::lr;
399396
uint32_t sp_reg_num = arm64_dwarf::sp;
400397

401398
UnwindPlan::RowSP row(new UnwindPlan::Row);
402399

403-
// Our previous Call Frame Address is the stack pointer
400+
// Our previous Call Frame Address is the stack pointer, all other registers
401+
// are the same.
404402
row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0);
405403

406-
unwind_plan.AppendRow(row);
407-
unwind_plan.SetReturnAddressRegister(lr_reg_num);
408-
409-
// All other registers are the same.
410-
411-
unwind_plan.SetSourceName("arm64 at-func-entry default");
412-
unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
413-
unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);
414-
unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo);
415-
416-
return true;
404+
auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF);
405+
plan_sp->AppendRow(row);
406+
plan_sp->SetReturnAddressRegister(lr_reg_num);
407+
plan_sp->SetSourceName("arm64 at-func-entry default");
408+
plan_sp->SetSourcedFromCompiler(eLazyBoolNo);
409+
plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);
410+
plan_sp->SetUnwindPlanForSignalTrap(eLazyBoolNo);
411+
return plan_sp;
417412
}
418413

419-
bool ABISysV_arm64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) {
420-
unwind_plan.Clear();
421-
unwind_plan.SetRegisterKind(eRegisterKindDWARF);
422-
414+
UnwindPlanSP ABISysV_arm64::CreateDefaultUnwindPlan() {
423415
uint32_t fp_reg_num = arm64_dwarf::fp;
424416
uint32_t pc_reg_num = arm64_dwarf::pc;
425417

@@ -433,13 +425,13 @@ bool ABISysV_arm64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) {
433425
row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, ptr_size * -2, true);
434426
row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true);
435427

436-
unwind_plan.AppendRow(row);
437-
unwind_plan.SetSourceName("arm64 default unwind plan");
438-
unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
439-
unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);
440-
unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo);
441-
442-
return true;
428+
auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF);
429+
plan_sp->AppendRow(row);
430+
plan_sp->SetSourceName("arm64 default unwind plan");
431+
plan_sp->SetSourcedFromCompiler(eLazyBoolNo);
432+
plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);
433+
plan_sp->SetUnwindPlanForSignalTrap(eLazyBoolNo);
434+
return plan_sp;
443435
}
444436

445437
// AAPCS64 (Procedure Call Standard for the ARM 64-bit Architecture) says

lldb/source/Plugins/ABI/AArch64/ABISysV_arm64.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,9 @@ class ABISysV_arm64 : public ABIAArch64 {
3030
SetReturnValueObject(lldb::StackFrameSP &frame_sp,
3131
lldb::ValueObjectSP &new_value) override;
3232

33-
bool
34-
CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;
33+
lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override;
3534

36-
bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;
35+
lldb::UnwindPlanSP CreateDefaultUnwindPlan() override;
3736

3837
bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override;
3938

lldb/source/Plugins/ABI/ARC/ABISysV_arc.cpp

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -555,29 +555,23 @@ ValueObjectSP ABISysV_arc::GetReturnValueObjectImpl(Thread &thread,
555555
value, ConstString(""));
556556
}
557557

558-
bool ABISysV_arc::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) {
559-
unwind_plan.Clear();
560-
unwind_plan.SetRegisterKind(eRegisterKindDWARF);
561-
558+
UnwindPlanSP ABISysV_arc::CreateFunctionEntryUnwindPlan() {
562559
UnwindPlan::RowSP row(new UnwindPlan::Row);
563560

564561
// Our Call Frame Address is the stack pointer value.
565562
row->GetCFAValue().SetIsRegisterPlusOffset(dwarf::sp, 0);
566563

567-
// The previous PC is in the BLINK.
564+
// The previous PC is in the BLINK, all other registers are the same.
568565
row->SetRegisterLocationToRegister(dwarf::pc, dwarf::blink, true);
569-
unwind_plan.AppendRow(row);
570-
571-
// All other registers are the same.
572-
unwind_plan.SetSourceName("arc at-func-entry default");
573-
unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
574566

575-
return true;
567+
auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF);
568+
plan_sp->AppendRow(row);
569+
plan_sp->SetSourceName("arc at-func-entry default");
570+
plan_sp->SetSourcedFromCompiler(eLazyBoolNo);
571+
return plan_sp;
576572
}
577573

578-
bool ABISysV_arc::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) {
579-
return false;
580-
}
574+
UnwindPlanSP ABISysV_arc::CreateDefaultUnwindPlan() { return nullptr; }
581575

582576
bool ABISysV_arc::RegisterIsVolatile(const RegisterInfo *reg_info) {
583577
if (nullptr == reg_info)

lldb/source/Plugins/ABI/ARC/ABISysV_arc.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,9 @@ class ABISysV_arc : public lldb_private::RegInfoBasedABI {
4949
lldb::ValueObjectSP GetReturnValueObjectImpl(lldb_private::Thread &thread,
5050
llvm::Type &type) const override;
5151

52-
bool
53-
CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;
52+
lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override;
5453

55-
bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;
54+
lldb::UnwindPlanSP CreateDefaultUnwindPlan() override;
5655

5756
bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override;
5857

lldb/source/Plugins/ABI/ARM/ABIMacOSX_arm.cpp

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1781,10 +1781,7 @@ Status ABIMacOSX_arm::SetReturnValueObject(lldb::StackFrameSP &frame_sp,
17811781
return error;
17821782
}
17831783

1784-
bool ABIMacOSX_arm::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) {
1785-
unwind_plan.Clear();
1786-
unwind_plan.SetRegisterKind(eRegisterKindDWARF);
1787-
1784+
UnwindPlanSP ABIMacOSX_arm::CreateFunctionEntryUnwindPlan() {
17881785
uint32_t lr_reg_num = dwarf_lr;
17891786
uint32_t sp_reg_num = dwarf_sp;
17901787
uint32_t pc_reg_num = dwarf_pc;
@@ -1794,22 +1791,17 @@ bool ABIMacOSX_arm::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) {
17941791
// Our Call Frame Address is the stack pointer value
17951792
row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0);
17961793

1797-
// The previous PC is in the LR
1794+
// The previous PC is in the LR, all other registers are the same.
17981795
row->SetRegisterLocationToRegister(pc_reg_num, lr_reg_num, true);
1799-
unwind_plan.AppendRow(row);
1800-
1801-
// All other registers are the same.
18021796

1803-
unwind_plan.SetSourceName("arm at-func-entry default");
1804-
unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
1805-
1806-
return true;
1797+
auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF);
1798+
plan_sp->AppendRow(row);
1799+
plan_sp->SetSourceName("arm at-func-entry default");
1800+
plan_sp->SetSourcedFromCompiler(eLazyBoolNo);
1801+
return plan_sp;
18071802
}
18081803

1809-
bool ABIMacOSX_arm::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) {
1810-
unwind_plan.Clear();
1811-
unwind_plan.SetRegisterKind(eRegisterKindDWARF);
1812-
1804+
UnwindPlanSP ABIMacOSX_arm::CreateDefaultUnwindPlan() {
18131805
uint32_t fp_reg_num =
18141806
dwarf_r7; // apple uses r7 for all frames. Normal arm uses r11
18151807
uint32_t pc_reg_num = dwarf_pc;
@@ -1824,13 +1816,13 @@ bool ABIMacOSX_arm::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) {
18241816
row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, ptr_size * -2, true);
18251817
row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true);
18261818

1827-
unwind_plan.AppendRow(row);
1828-
unwind_plan.SetSourceName("arm-apple-ios default unwind plan");
1829-
unwind_plan.SetSourcedFromCompiler(eLazyBoolNo);
1830-
unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);
1831-
unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo);
1832-
1833-
return true;
1819+
auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF);
1820+
plan_sp->AppendRow(row);
1821+
plan_sp->SetSourceName("arm-apple-ios default unwind plan");
1822+
plan_sp->SetSourcedFromCompiler(eLazyBoolNo);
1823+
plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo);
1824+
plan_sp->SetUnwindPlanForSignalTrap(eLazyBoolNo);
1825+
return plan_sp;
18341826
}
18351827

18361828
// cf. "ARMv6 Function Calling Conventions"

lldb/source/Plugins/ABI/ARM/ABIMacOSX_arm.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,9 @@ class ABIMacOSX_arm : public lldb_private::RegInfoBasedABI {
2929
SetReturnValueObject(lldb::StackFrameSP &frame_sp,
3030
lldb::ValueObjectSP &new_value) override;
3131

32-
bool
33-
CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;
32+
lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override;
3433

35-
bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override;
34+
lldb::UnwindPlanSP CreateDefaultUnwindPlan() override;
3635

3736
bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override;
3837

0 commit comments

Comments
 (0)