Author: Pavel Labath Date: 2025-02-26T11:22:11+01:00 New Revision: 13245cea11050f875891389ce36115c78aaedd4a
URL: https://github.com/llvm/llvm-project/commit/13245cea11050f875891389ce36115c78aaedd4a DIFF: https://github.com/llvm/llvm-project/commit/13245cea11050f875891389ce36115c78aaedd4a.diff LOG: [lldb] Modernize ABI-based unwind plan creation (#128505) Replace the by-ref return value with an actual result. Added: Modified: lldb/include/lldb/Symbol/UnwindPlan.h lldb/include/lldb/Target/ABI.h lldb/source/Commands/CommandObjectTarget.cpp lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.cpp lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.h lldb/source/Plugins/ABI/AArch64/ABISysV_arm64.cpp lldb/source/Plugins/ABI/AArch64/ABISysV_arm64.h lldb/source/Plugins/ABI/ARC/ABISysV_arc.cpp lldb/source/Plugins/ABI/ARC/ABISysV_arc.h lldb/source/Plugins/ABI/ARM/ABIMacOSX_arm.cpp lldb/source/Plugins/ABI/ARM/ABIMacOSX_arm.h lldb/source/Plugins/ABI/ARM/ABISysV_arm.cpp lldb/source/Plugins/ABI/ARM/ABISysV_arm.h lldb/source/Plugins/ABI/Hexagon/ABISysV_hexagon.cpp lldb/source/Plugins/ABI/Hexagon/ABISysV_hexagon.h lldb/source/Plugins/ABI/LoongArch/ABISysV_loongarch.cpp lldb/source/Plugins/ABI/LoongArch/ABISysV_loongarch.h lldb/source/Plugins/ABI/MSP430/ABISysV_msp430.cpp lldb/source/Plugins/ABI/MSP430/ABISysV_msp430.h lldb/source/Plugins/ABI/Mips/ABISysV_mips.cpp lldb/source/Plugins/ABI/Mips/ABISysV_mips.h lldb/source/Plugins/ABI/Mips/ABISysV_mips64.cpp lldb/source/Plugins/ABI/Mips/ABISysV_mips64.h lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc.cpp lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc.h lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc64.cpp lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc64.h lldb/source/Plugins/ABI/RISCV/ABISysV_riscv.cpp lldb/source/Plugins/ABI/RISCV/ABISysV_riscv.h lldb/source/Plugins/ABI/SystemZ/ABISysV_s390x.cpp lldb/source/Plugins/ABI/SystemZ/ABISysV_s390x.h lldb/source/Plugins/ABI/X86/ABIMacOSX_i386.cpp lldb/source/Plugins/ABI/X86/ABIMacOSX_i386.h lldb/source/Plugins/ABI/X86/ABISysV_i386.cpp lldb/source/Plugins/ABI/X86/ABISysV_i386.h lldb/source/Plugins/ABI/X86/ABISysV_x86_64.cpp lldb/source/Plugins/ABI/X86/ABISysV_x86_64.h lldb/source/Plugins/ABI/X86/ABIWindows_x86_64.cpp lldb/source/Plugins/ABI/X86/ABIWindows_x86_64.h lldb/source/Plugins/UnwindAssembly/x86/UnwindAssembly-x86.cpp lldb/source/Symbol/FuncUnwinders.cpp lldb/source/Target/RegisterContextUnwind.cpp Removed: ################################################################################ diff --git a/lldb/include/lldb/Symbol/UnwindPlan.h b/lldb/include/lldb/Symbol/UnwindPlan.h index de120c4a734db..462c1a52b01db 100644 --- a/lldb/include/lldb/Symbol/UnwindPlan.h +++ b/lldb/include/lldb/Symbol/UnwindPlan.h @@ -452,6 +452,11 @@ class UnwindPlan { for (const RowSP &row_sp : rhs.m_row_list) m_row_list.emplace_back(new Row(*row_sp)); } + UnwindPlan(UnwindPlan &&rhs) = default; + UnwindPlan &operator=(const UnwindPlan &rhs) { + return *this = UnwindPlan(rhs); // NB: moving from a temporary (deep) copy + } + UnwindPlan &operator=(UnwindPlan &&) = default; ~UnwindPlan() = default; diff --git a/lldb/include/lldb/Target/ABI.h b/lldb/include/lldb/Target/ABI.h index dd941d1c905c1..1a1f1724222e3 100644 --- a/lldb/include/lldb/Target/ABI.h +++ b/lldb/include/lldb/Target/ABI.h @@ -13,6 +13,7 @@ #include "lldb/Symbol/UnwindPlan.h" #include "lldb/Target/DynamicRegisterInfo.h" #include "lldb/Utility/Status.h" +#include "lldb/lldb-forward.h" #include "lldb/lldb-private.h" #include "llvm/ADT/ArrayRef.h" @@ -96,9 +97,9 @@ class ABI : public PluginInterface { lldb::ProcessSP GetProcessSP() const { return m_process_wp.lock(); } public: - virtual bool CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) = 0; + virtual lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() = 0; - virtual bool CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) = 0; + virtual lldb::UnwindPlanSP CreateDefaultUnwindPlan() = 0; virtual bool RegisterIsVolatile(const RegisterInfo *reg_info) = 0; diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index bd9470b804949..c77bddb4af061 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -3763,20 +3763,18 @@ class CommandObjectTargetModulesShowUnwind : public CommandObjectParsed { ABISP abi_sp = process->GetABI(); if (abi_sp) { - UnwindPlan arch_default(lldb::eRegisterKindGeneric); - if (abi_sp->CreateDefaultUnwindPlan(arch_default)) { + if (UnwindPlanSP plan_sp = abi_sp->CreateDefaultUnwindPlan()) { result.GetOutputStream().Printf("Arch default UnwindPlan:\n"); - arch_default.Dump(result.GetOutputStream(), thread.get(), - LLDB_INVALID_ADDRESS); + plan_sp->Dump(result.GetOutputStream(), thread.get(), + LLDB_INVALID_ADDRESS); result.GetOutputStream().Printf("\n"); } - UnwindPlan arch_entry(lldb::eRegisterKindGeneric); - if (abi_sp->CreateFunctionEntryUnwindPlan(arch_entry)) { + if (UnwindPlanSP plan_sp = abi_sp->CreateFunctionEntryUnwindPlan()) { result.GetOutputStream().Printf( "Arch default at entry point UnwindPlan:\n"); - arch_entry.Dump(result.GetOutputStream(), thread.get(), - LLDB_INVALID_ADDRESS); + plan_sp->Dump(result.GetOutputStream(), thread.get(), + LLDB_INVALID_ADDRESS); result.GetOutputStream().Printf("\n"); } } diff --git a/lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.cpp b/lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.cpp index cb121c14048f0..d208c6f874692 100644 --- a/lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.cpp +++ b/lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.cpp @@ -343,10 +343,7 @@ ABIMacOSX_arm64::SetReturnValueObject(lldb::StackFrameSP &frame_sp, return error; } -bool ABIMacOSX_arm64::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABIMacOSX_arm64::CreateFunctionEntryUnwindPlan() { uint32_t lr_reg_num = arm64_dwarf::lr; uint32_t sp_reg_num = arm64_dwarf::sp; uint32_t pc_reg_num = arm64_dwarf::pc; @@ -356,23 +353,17 @@ bool ABIMacOSX_arm64::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { // Our previous Call Frame Address is the stack pointer row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0); - // Our previous PC is in the LR + // Our previous PC is in the LR, all other registers are the same. row->SetRegisterLocationToRegister(pc_reg_num, lr_reg_num, true); - unwind_plan.AppendRow(row); - - // All other registers are the same. - - unwind_plan.SetSourceName("arm64 at-func-entry default"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("arm64 at-func-entry default"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + return plan_sp; } -bool ABIMacOSX_arm64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABIMacOSX_arm64::CreateDefaultUnwindPlan() { uint32_t fp_reg_num = arm64_dwarf::fp; uint32_t pc_reg_num = arm64_dwarf::pc; @@ -386,12 +377,13 @@ bool ABIMacOSX_arm64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, ptr_size * -2, true); row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("arm64-apple-darwin default unwind plan"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); - unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("arm64-apple-darwin default unwind plan"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); + plan_sp->SetUnwindPlanForSignalTrap(eLazyBoolNo); + return plan_sp; } // AAPCS64 (Procedure Call Standard for the ARM 64-bit Architecture) says diff --git a/lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.h b/lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.h index 025a7a3fc368b..94a60327c6181 100644 --- a/lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.h +++ b/lldb/source/Plugins/ABI/AArch64/ABIMacOSX_arm64.h @@ -27,10 +27,9 @@ class ABIMacOSX_arm64 : public ABIAArch64 { bool GetArgumentValues(lldb_private::Thread &thread, lldb_private::ValueList &values) const override; - bool - CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override; - bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateDefaultUnwindPlan() override; bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; diff --git a/lldb/source/Plugins/ABI/AArch64/ABISysV_arm64.cpp b/lldb/source/Plugins/ABI/AArch64/ABISysV_arm64.cpp index 74047ea65788c..280ec5ba37100 100644 --- a/lldb/source/Plugins/ABI/AArch64/ABISysV_arm64.cpp +++ b/lldb/source/Plugins/ABI/AArch64/ABISysV_arm64.cpp @@ -391,35 +391,27 @@ Status ABISysV_arm64::SetReturnValueObject(lldb::StackFrameSP &frame_sp, return error; } -bool ABISysV_arm64::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_arm64::CreateFunctionEntryUnwindPlan() { uint32_t lr_reg_num = arm64_dwarf::lr; uint32_t sp_reg_num = arm64_dwarf::sp; UnwindPlan::RowSP row(new UnwindPlan::Row); - // Our previous Call Frame Address is the stack pointer + // Our previous Call Frame Address is the stack pointer, all other registers + // are the same. row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0); - unwind_plan.AppendRow(row); - unwind_plan.SetReturnAddressRegister(lr_reg_num); - - // All other registers are the same. - - unwind_plan.SetSourceName("arm64 at-func-entry default"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); - unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo); - - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetReturnAddressRegister(lr_reg_num); + plan_sp->SetSourceName("arm64 at-func-entry default"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); + plan_sp->SetUnwindPlanForSignalTrap(eLazyBoolNo); + return plan_sp; } -bool ABISysV_arm64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_arm64::CreateDefaultUnwindPlan() { uint32_t fp_reg_num = arm64_dwarf::fp; uint32_t pc_reg_num = arm64_dwarf::pc; @@ -433,13 +425,13 @@ bool ABISysV_arm64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, ptr_size * -2, true); row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("arm64 default unwind plan"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); - unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo); - - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("arm64 default unwind plan"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); + plan_sp->SetUnwindPlanForSignalTrap(eLazyBoolNo); + return plan_sp; } // AAPCS64 (Procedure Call Standard for the ARM 64-bit Architecture) says diff --git a/lldb/source/Plugins/ABI/AArch64/ABISysV_arm64.h b/lldb/source/Plugins/ABI/AArch64/ABISysV_arm64.h index 01d4af62fa6ef..2b8e608d4caab 100644 --- a/lldb/source/Plugins/ABI/AArch64/ABISysV_arm64.h +++ b/lldb/source/Plugins/ABI/AArch64/ABISysV_arm64.h @@ -30,10 +30,9 @@ class ABISysV_arm64 : public ABIAArch64 { SetReturnValueObject(lldb::StackFrameSP &frame_sp, lldb::ValueObjectSP &new_value) override; - bool - CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override; - bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateDefaultUnwindPlan() override; bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; diff --git a/lldb/source/Plugins/ABI/ARC/ABISysV_arc.cpp b/lldb/source/Plugins/ABI/ARC/ABISysV_arc.cpp index 6f60663ca51e1..a38396dc14635 100644 --- a/lldb/source/Plugins/ABI/ARC/ABISysV_arc.cpp +++ b/lldb/source/Plugins/ABI/ARC/ABISysV_arc.cpp @@ -555,29 +555,23 @@ ValueObjectSP ABISysV_arc::GetReturnValueObjectImpl(Thread &thread, value, ConstString("")); } -bool ABISysV_arc::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_arc::CreateFunctionEntryUnwindPlan() { UnwindPlan::RowSP row(new UnwindPlan::Row); // Our Call Frame Address is the stack pointer value. row->GetCFAValue().SetIsRegisterPlusOffset(dwarf::sp, 0); - // The previous PC is in the BLINK. + // The previous PC is in the BLINK, all other registers are the same. row->SetRegisterLocationToRegister(dwarf::pc, dwarf::blink, true); - unwind_plan.AppendRow(row); - - // All other registers are the same. - unwind_plan.SetSourceName("arc at-func-entry default"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("arc at-func-entry default"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + return plan_sp; } -bool ABISysV_arc::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { - return false; -} +UnwindPlanSP ABISysV_arc::CreateDefaultUnwindPlan() { return nullptr; } bool ABISysV_arc::RegisterIsVolatile(const RegisterInfo *reg_info) { if (nullptr == reg_info) diff --git a/lldb/source/Plugins/ABI/ARC/ABISysV_arc.h b/lldb/source/Plugins/ABI/ARC/ABISysV_arc.h index de513453f2a2c..ac0c40c58937e 100644 --- a/lldb/source/Plugins/ABI/ARC/ABISysV_arc.h +++ b/lldb/source/Plugins/ABI/ARC/ABISysV_arc.h @@ -49,10 +49,9 @@ class ABISysV_arc : public lldb_private::RegInfoBasedABI { lldb::ValueObjectSP GetReturnValueObjectImpl(lldb_private::Thread &thread, llvm::Type &type) const override; - bool - CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override; - bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateDefaultUnwindPlan() override; bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; diff --git a/lldb/source/Plugins/ABI/ARM/ABIMacOSX_arm.cpp b/lldb/source/Plugins/ABI/ARM/ABIMacOSX_arm.cpp index 6aadf652da781..d85f4a5943acf 100644 --- a/lldb/source/Plugins/ABI/ARM/ABIMacOSX_arm.cpp +++ b/lldb/source/Plugins/ABI/ARM/ABIMacOSX_arm.cpp @@ -1781,10 +1781,7 @@ Status ABIMacOSX_arm::SetReturnValueObject(lldb::StackFrameSP &frame_sp, return error; } -bool ABIMacOSX_arm::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABIMacOSX_arm::CreateFunctionEntryUnwindPlan() { uint32_t lr_reg_num = dwarf_lr; uint32_t sp_reg_num = dwarf_sp; uint32_t pc_reg_num = dwarf_pc; @@ -1794,22 +1791,17 @@ bool ABIMacOSX_arm::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { // Our Call Frame Address is the stack pointer value row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0); - // The previous PC is in the LR + // The previous PC is in the LR, all other registers are the same. row->SetRegisterLocationToRegister(pc_reg_num, lr_reg_num, true); - unwind_plan.AppendRow(row); - - // All other registers are the same. - unwind_plan.SetSourceName("arm at-func-entry default"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("arm at-func-entry default"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + return plan_sp; } -bool ABIMacOSX_arm::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABIMacOSX_arm::CreateDefaultUnwindPlan() { uint32_t fp_reg_num = dwarf_r7; // apple uses r7 for all frames. Normal arm uses r11 uint32_t pc_reg_num = dwarf_pc; @@ -1824,13 +1816,13 @@ bool ABIMacOSX_arm::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, ptr_size * -2, true); row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("arm-apple-ios default unwind plan"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); - unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo); - - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("arm-apple-ios default unwind plan"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); + plan_sp->SetUnwindPlanForSignalTrap(eLazyBoolNo); + return plan_sp; } // cf. "ARMv6 Function Calling Conventions" diff --git a/lldb/source/Plugins/ABI/ARM/ABIMacOSX_arm.h b/lldb/source/Plugins/ABI/ARM/ABIMacOSX_arm.h index c5ebd9717575a..fc3d04b7060d3 100644 --- a/lldb/source/Plugins/ABI/ARM/ABIMacOSX_arm.h +++ b/lldb/source/Plugins/ABI/ARM/ABIMacOSX_arm.h @@ -29,10 +29,9 @@ class ABIMacOSX_arm : public lldb_private::RegInfoBasedABI { SetReturnValueObject(lldb::StackFrameSP &frame_sp, lldb::ValueObjectSP &new_value) override; - bool - CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override; - bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateDefaultUnwindPlan() override; bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; diff --git a/lldb/source/Plugins/ABI/ARM/ABISysV_arm.cpp b/lldb/source/Plugins/ABI/ARM/ABISysV_arm.cpp index d67591ffa109b..38f4413bb263b 100644 --- a/lldb/source/Plugins/ABI/ARM/ABISysV_arm.cpp +++ b/lldb/source/Plugins/ABI/ARM/ABISysV_arm.cpp @@ -1896,10 +1896,7 @@ Status ABISysV_arm::SetReturnValueObject(lldb::StackFrameSP &frame_sp, return error; } -bool ABISysV_arm::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_arm::CreateFunctionEntryUnwindPlan() { uint32_t lr_reg_num = dwarf_lr; uint32_t sp_reg_num = dwarf_sp; uint32_t pc_reg_num = dwarf_pc; @@ -1909,22 +1906,16 @@ bool ABISysV_arm::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { // Our Call Frame Address is the stack pointer value row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0); - // The previous PC is in the LR + // The previous PC is in the LR, all other registers are the same. row->SetRegisterLocationToRegister(pc_reg_num, lr_reg_num, true); - unwind_plan.AppendRow(row); - - // All other registers are the same. - - unwind_plan.SetSourceName("arm at-func-entry default"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("arm at-func-entry default"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + return plan_sp; } -bool ABISysV_arm::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_arm::CreateDefaultUnwindPlan() { // TODO: Handle thumb uint32_t fp_reg_num = dwarf_r11; uint32_t pc_reg_num = dwarf_pc; @@ -1939,13 +1930,13 @@ bool ABISysV_arm::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, ptr_size * -2, true); row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("arm default unwind plan"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); - unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo); - - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("arm default unwind plan"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); + plan_sp->SetUnwindPlanForSignalTrap(eLazyBoolNo); + return plan_sp; } // cf. "ARMv6 Function Calling Conventions" diff --git a/lldb/source/Plugins/ABI/ARM/ABISysV_arm.h b/lldb/source/Plugins/ABI/ARM/ABISysV_arm.h index 65bc3e0b62987..cd587dd16396b 100644 --- a/lldb/source/Plugins/ABI/ARM/ABISysV_arm.h +++ b/lldb/source/Plugins/ABI/ARM/ABISysV_arm.h @@ -29,10 +29,9 @@ class ABISysV_arm : public lldb_private::RegInfoBasedABI { SetReturnValueObject(lldb::StackFrameSP &frame_sp, lldb::ValueObjectSP &new_value) override; - bool - CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override; - bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateDefaultUnwindPlan() override; bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; diff --git a/lldb/source/Plugins/ABI/Hexagon/ABISysV_hexagon.cpp b/lldb/source/Plugins/ABI/Hexagon/ABISysV_hexagon.cpp index 5419f054cbe2d..4af9bcb8644f5 100644 --- a/lldb/source/Plugins/ABI/Hexagon/ABISysV_hexagon.cpp +++ b/lldb/source/Plugins/ABI/Hexagon/ABISysV_hexagon.cpp @@ -1195,11 +1195,7 @@ ValueObjectSP ABISysV_hexagon::GetReturnValueObjectImpl( // called when we are on the first instruction of a new function for hexagon // the return address is in RA (R31) -bool ABISysV_hexagon::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindGeneric); - unwind_plan.SetReturnAddressRegister(LLDB_REGNUM_GENERIC_RA); - +UnwindPlanSP ABISysV_hexagon::CreateFunctionEntryUnwindPlan() { UnwindPlan::RowSP row(new UnwindPlan::Row); // Our Call Frame Address is the stack pointer value @@ -1209,17 +1205,16 @@ bool ABISysV_hexagon::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { // The previous PC is in the LR row->SetRegisterLocationToRegister(LLDB_REGNUM_GENERIC_PC, LLDB_REGNUM_GENERIC_RA, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("hexagon at-func-entry default"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindGeneric); + plan_sp->AppendRow(row); + plan_sp->SetReturnAddressRegister(LLDB_REGNUM_GENERIC_RA); + plan_sp->SetSourceName("hexagon at-func-entry default"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + return plan_sp; } -bool ABISysV_hexagon::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindGeneric); - +UnwindPlanSP ABISysV_hexagon::CreateDefaultUnwindPlan() { uint32_t fp_reg_num = LLDB_REGNUM_GENERIC_FP; uint32_t sp_reg_num = LLDB_REGNUM_GENERIC_SP; uint32_t pc_reg_num = LLDB_REGNUM_GENERIC_PC; @@ -1233,12 +1228,13 @@ bool ABISysV_hexagon::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, -4, true); row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("hexagon default unwind plan"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); - unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindGeneric); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("hexagon default unwind plan"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); + plan_sp->SetUnwindPlanForSignalTrap(eLazyBoolNo); + return plan_sp; } /* diff --git a/lldb/source/Plugins/ABI/Hexagon/ABISysV_hexagon.h b/lldb/source/Plugins/ABI/Hexagon/ABISysV_hexagon.h index df7016926d797..87d394a4097f1 100644 --- a/lldb/source/Plugins/ABI/Hexagon/ABISysV_hexagon.h +++ b/lldb/source/Plugins/ABI/Hexagon/ABISysV_hexagon.h @@ -46,10 +46,9 @@ class ABISysV_hexagon : public lldb_private::RegInfoBasedABI { lldb::ValueObjectSP GetReturnValueObjectImpl(lldb_private::Thread &thread, llvm::Type &type) const override; - bool - CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override; - bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateDefaultUnwindPlan() override; bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; diff --git a/lldb/source/Plugins/ABI/LoongArch/ABISysV_loongarch.cpp b/lldb/source/Plugins/ABI/LoongArch/ABISysV_loongarch.cpp index b8d40501ec13a..1dd6070ec29c5 100644 --- a/lldb/source/Plugins/ABI/LoongArch/ABISysV_loongarch.cpp +++ b/lldb/source/Plugins/ABI/LoongArch/ABISysV_loongarch.cpp @@ -533,10 +533,7 @@ ValueObjectSP ABISysV_loongarch::GetReturnValueObjectImpl( return GetReturnValueObjectSimple(thread, return_compiler_type); } -bool ABISysV_loongarch::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_loongarch::CreateFunctionEntryUnwindPlan() { uint32_t pc_reg_num = loongarch_dwarf::dwarf_gpr_pc; uint32_t sp_reg_num = loongarch_dwarf::dwarf_gpr_sp; uint32_t ra_reg_num = loongarch_dwarf::dwarf_gpr_ra; @@ -547,19 +544,16 @@ bool ABISysV_loongarch::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0); // Previous frame's pc is in ra - row->SetRegisterLocationToRegister(pc_reg_num, ra_reg_num, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("loongarch function-entry unwind plan"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("loongarch function-entry unwind plan"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + return plan_sp; } -bool ABISysV_loongarch::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindGeneric); - +UnwindPlanSP ABISysV_loongarch::CreateDefaultUnwindPlan() { uint32_t pc_reg_num = LLDB_REGNUM_GENERIC_PC; uint32_t fp_reg_num = LLDB_REGNUM_GENERIC_FP; @@ -578,11 +572,12 @@ bool ABISysV_loongarch::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, reg_size * -2, true); row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, reg_size * -1, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("loongarch default unwind plan"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindGeneric); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("loongarch default unwind plan"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); + return plan_sp; } bool ABISysV_loongarch::RegisterIsVolatile(const RegisterInfo *reg_info) { diff --git a/lldb/source/Plugins/ABI/LoongArch/ABISysV_loongarch.h b/lldb/source/Plugins/ABI/LoongArch/ABISysV_loongarch.h index 144af041331d4..80cf4680319ec 100644 --- a/lldb/source/Plugins/ABI/LoongArch/ABISysV_loongarch.h +++ b/lldb/source/Plugins/ABI/LoongArch/ABISysV_loongarch.h @@ -40,10 +40,9 @@ class ABISysV_loongarch : public lldb_private::RegInfoBasedABI { GetReturnValueObjectImpl(lldb_private::Thread &thread, lldb_private::CompilerType &type) const override; - bool - CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override; - bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateDefaultUnwindPlan() override; bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; diff --git a/lldb/source/Plugins/ABI/MSP430/ABISysV_msp430.cpp b/lldb/source/Plugins/ABI/MSP430/ABISysV_msp430.cpp index 6f0fd3a6e8f6f..2cc1bbbcef11b 100644 --- a/lldb/source/Plugins/ABI/MSP430/ABISysV_msp430.cpp +++ b/lldb/source/Plugins/ABI/MSP430/ABISysV_msp430.cpp @@ -305,10 +305,7 @@ ValueObjectSP ABISysV_msp430::GetReturnValueObjectImpl( } // called when we are on the first instruction of a new function -bool ABISysV_msp430::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_msp430::CreateFunctionEntryUnwindPlan() { uint32_t sp_reg_num = dwarf_sp; uint32_t pc_reg_num = dwarf_pc; @@ -317,16 +314,14 @@ bool ABISysV_msp430::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, -2, true); row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("msp430 at-func-entry default"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("msp430 at-func-entry default"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + return plan_sp; } -bool ABISysV_msp430::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_msp430::CreateDefaultUnwindPlan() { uint32_t fp_reg_num = dwarf_fp; uint32_t sp_reg_num = dwarf_sp; uint32_t pc_reg_num = dwarf_pc; @@ -337,11 +332,12 @@ bool ABISysV_msp430::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true); row->SetRegisterLocationToUnspecified(fp_reg_num, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("msp430 default unwind plan"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("msp430 default unwind plan"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); + return plan_sp; } bool ABISysV_msp430::RegisterIsVolatile(const RegisterInfo *reg_info) { diff --git a/lldb/source/Plugins/ABI/MSP430/ABISysV_msp430.h b/lldb/source/Plugins/ABI/MSP430/ABISysV_msp430.h index 8ef39e7aa1bb7..3a383e43a765a 100644 --- a/lldb/source/Plugins/ABI/MSP430/ABISysV_msp430.h +++ b/lldb/source/Plugins/ABI/MSP430/ABISysV_msp430.h @@ -35,10 +35,9 @@ class ABISysV_msp430 : public lldb_private::RegInfoBasedABI { GetReturnValueObjectImpl(lldb_private::Thread &thread, lldb_private::CompilerType &type) const override; - bool - CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override; - bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateDefaultUnwindPlan() override; bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; diff --git a/lldb/source/Plugins/ABI/Mips/ABISysV_mips.cpp b/lldb/source/Plugins/ABI/Mips/ABISysV_mips.cpp index 9c7312b975c4b..d7ebe22c90261 100644 --- a/lldb/source/Plugins/ABI/Mips/ABISysV_mips.cpp +++ b/lldb/source/Plugins/ABI/Mips/ABISysV_mips.cpp @@ -954,31 +954,24 @@ ValueObjectSP ABISysV_mips::GetReturnValueObjectImpl( return return_valobj_sp; } -bool ABISysV_mips::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_mips::CreateFunctionEntryUnwindPlan() { UnwindPlan::RowSP row(new UnwindPlan::Row); // Our Call Frame Address is the stack pointer value row->GetCFAValue().SetIsRegisterPlusOffset(dwarf_r29, 0); - // The previous PC is in the RA + // The previous PC is in the RA, all other registers are the same. row->SetRegisterLocationToRegister(dwarf_pc, dwarf_r31, true); - unwind_plan.AppendRow(row); - - // All other registers are the same. - unwind_plan.SetSourceName("mips at-func-entry default"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetReturnAddressRegister(dwarf_r31); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("mips at-func-entry default"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetReturnAddressRegister(dwarf_r31); + return plan_sp; } -bool ABISysV_mips::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_mips::CreateDefaultUnwindPlan() { UnwindPlan::RowSP row(new UnwindPlan::Row); row->SetUnspecifiedRegistersAreUndefined(true); @@ -986,12 +979,13 @@ bool ABISysV_mips::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { row->SetRegisterLocationToRegister(dwarf_pc, dwarf_r31, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("mips default unwind plan"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); - unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("mips default unwind plan"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); + plan_sp->SetUnwindPlanForSignalTrap(eLazyBoolNo); + return plan_sp; } bool ABISysV_mips::RegisterIsVolatile(const RegisterInfo *reg_info) { diff --git a/lldb/source/Plugins/ABI/Mips/ABISysV_mips.h b/lldb/source/Plugins/ABI/Mips/ABISysV_mips.h index e77a8bfc0ab64..0cab96559a64c 100644 --- a/lldb/source/Plugins/ABI/Mips/ABISysV_mips.h +++ b/lldb/source/Plugins/ABI/Mips/ABISysV_mips.h @@ -34,10 +34,9 @@ class ABISysV_mips : public lldb_private::RegInfoBasedABI { GetReturnValueObjectImpl(lldb_private::Thread &thread, lldb_private::CompilerType &type) const override; - bool - CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override; - bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateDefaultUnwindPlan() override; bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; diff --git a/lldb/source/Plugins/ABI/Mips/ABISysV_mips64.cpp b/lldb/source/Plugins/ABI/Mips/ABISysV_mips64.cpp index 4cc37dd7acf09..dcaef20b1a036 100644 --- a/lldb/source/Plugins/ABI/Mips/ABISysV_mips64.cpp +++ b/lldb/source/Plugins/ABI/Mips/ABISysV_mips64.cpp @@ -1127,31 +1127,24 @@ ValueObjectSP ABISysV_mips64::GetReturnValueObjectImpl( return return_valobj_sp; } -bool ABISysV_mips64::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_mips64::CreateFunctionEntryUnwindPlan() { UnwindPlan::RowSP row(new UnwindPlan::Row); // Our Call Frame Address is the stack pointer value row->GetCFAValue().SetIsRegisterPlusOffset(dwarf_r29, 0); - // The previous PC is in the RA + // The previous PC is in the RA, all other registers are the same. row->SetRegisterLocationToRegister(dwarf_pc, dwarf_r31, true); - unwind_plan.AppendRow(row); - - // All other registers are the same. - unwind_plan.SetSourceName("mips64 at-func-entry default"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetReturnAddressRegister(dwarf_r31); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("mips64 at-func-entry default"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetReturnAddressRegister(dwarf_r31); + return plan_sp; } -bool ABISysV_mips64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_mips64::CreateDefaultUnwindPlan() { UnwindPlan::RowSP row(new UnwindPlan::Row); row->SetUnspecifiedRegistersAreUndefined(true); @@ -1159,12 +1152,13 @@ bool ABISysV_mips64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { row->SetRegisterLocationToRegister(dwarf_pc, dwarf_r31, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("mips64 default unwind plan"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); - unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("mips64 default unwind plan"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); + plan_sp->SetUnwindPlanForSignalTrap(eLazyBoolNo); + return plan_sp; } bool ABISysV_mips64::RegisterIsVolatile(const RegisterInfo *reg_info) { diff --git a/lldb/source/Plugins/ABI/Mips/ABISysV_mips64.h b/lldb/source/Plugins/ABI/Mips/ABISysV_mips64.h index 3eda3992e65e9..82d3c81fb0af7 100644 --- a/lldb/source/Plugins/ABI/Mips/ABISysV_mips64.h +++ b/lldb/source/Plugins/ABI/Mips/ABISysV_mips64.h @@ -34,10 +34,9 @@ class ABISysV_mips64 : public lldb_private::RegInfoBasedABI { GetReturnValueObjectImpl(lldb_private::Thread &thread, lldb_private::CompilerType &type) const override; - bool - CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override; - bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateDefaultUnwindPlan() override; bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; diff --git a/lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc.cpp b/lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc.cpp index e482b8d4c4c46..405ba57deba83 100644 --- a/lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc.cpp +++ b/lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc.cpp @@ -857,10 +857,7 @@ ValueObjectSP ABISysV_ppc::GetReturnValueObjectImpl( return return_valobj_sp; } -bool ABISysV_ppc::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_ppc::CreateFunctionEntryUnwindPlan() { uint32_t lr_reg_num = dwarf_lr; uint32_t sp_reg_num = dwarf_r1; uint32_t pc_reg_num = dwarf_pc; @@ -870,21 +867,17 @@ bool ABISysV_ppc::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { // Our Call Frame Address is the stack pointer value row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0); - // The previous PC is in the LR + // The previous PC is in the LR, all other registers are the same. row->SetRegisterLocationToRegister(pc_reg_num, lr_reg_num, true); - unwind_plan.AppendRow(row); - - // All other registers are the same. - - unwind_plan.SetSourceName("ppc at-func-entry default"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("ppc at-func-entry default"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + return plan_sp; } -bool ABISysV_ppc::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); +UnwindPlanSP ABISysV_ppc::CreateDefaultUnwindPlan() { uint32_t sp_reg_num = dwarf_r1; uint32_t pc_reg_num = dwarf_lr; @@ -898,13 +891,14 @@ bool ABISysV_ppc::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * 1, true); row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("ppc default unwind plan"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); - unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo); - unwind_plan.SetReturnAddressRegister(dwarf_lr); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("ppc default unwind plan"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); + plan_sp->SetUnwindPlanForSignalTrap(eLazyBoolNo); + plan_sp->SetReturnAddressRegister(dwarf_lr); + return plan_sp; } bool ABISysV_ppc::RegisterIsVolatile(const RegisterInfo *reg_info) { diff --git a/lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc.h b/lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc.h index 21b970f87934a..1f736f15e1113 100644 --- a/lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc.h +++ b/lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc.h @@ -34,10 +34,9 @@ class ABISysV_ppc : public lldb_private::RegInfoBasedABI { GetReturnValueObjectImpl(lldb_private::Thread &thread, lldb_private::CompilerType &type) const override; - bool - CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override; - bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateDefaultUnwindPlan() override; bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; diff --git a/lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc64.cpp b/lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc64.cpp index 0aa51ef654274..0392dab3f118b 100644 --- a/lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc64.cpp +++ b/lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc64.cpp @@ -954,9 +954,7 @@ ValueObjectSP ABISysV_ppc64::GetReturnValueObjectImpl( return GetReturnValueObjectSimple(thread, return_compiler_type); } -bool ABISysV_ppc64::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); +UnwindPlanSP ABISysV_ppc64::CreateFunctionEntryUnwindPlan() { uint32_t lr_reg_num; uint32_t sp_reg_num; @@ -977,22 +975,17 @@ bool ABISysV_ppc64::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { // Our Call Frame Address is the stack pointer value row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0); - // The previous PC is in the LR + // The previous PC is in the LR. All other registers are the same. row->SetRegisterLocationToRegister(pc_reg_num, lr_reg_num, true); - unwind_plan.AppendRow(row); - // All other registers are the same. - - unwind_plan.SetSourceName("ppc64 at-func-entry default"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("ppc64 at-func-entry default"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + return plan_sp; } -bool ABISysV_ppc64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_ppc64::CreateDefaultUnwindPlan() { uint32_t sp_reg_num; uint32_t pc_reg_num; uint32_t cr_reg_num; @@ -1016,13 +1009,14 @@ bool ABISysV_ppc64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true); row->SetRegisterLocationToAtCFAPlusOffset(cr_reg_num, ptr_size, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("ppc64 default unwind plan"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); - unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo); - unwind_plan.SetReturnAddressRegister(pc_reg_num); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("ppc64 default unwind plan"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); + plan_sp->SetUnwindPlanForSignalTrap(eLazyBoolNo); + plan_sp->SetReturnAddressRegister(pc_reg_num); + return plan_sp; } bool ABISysV_ppc64::RegisterIsVolatile(const RegisterInfo *reg_info) { diff --git a/lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc64.h b/lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc64.h index bfa96cc0df703..c7885eb7bb100 100644 --- a/lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc64.h +++ b/lldb/source/Plugins/ABI/PowerPC/ABISysV_ppc64.h @@ -10,6 +10,7 @@ #define LLDB_SOURCE_PLUGINS_ABI_POWERPC_ABISYSV_PPC64_H #include "lldb/Target/ABI.h" +#include "lldb/lldb-forward.h" #include "lldb/lldb-private.h" class ABISysV_ppc64 : public lldb_private::RegInfoBasedABI { @@ -34,10 +35,9 @@ class ABISysV_ppc64 : public lldb_private::RegInfoBasedABI { GetReturnValueObjectImpl(lldb_private::Thread &thread, lldb_private::CompilerType &type) const override; - bool - CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override; - bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateDefaultUnwindPlan() override; bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; diff --git a/lldb/source/Plugins/ABI/RISCV/ABISysV_riscv.cpp b/lldb/source/Plugins/ABI/RISCV/ABISysV_riscv.cpp index c463bd006b3db..06415a6e7f52c 100644 --- a/lldb/source/Plugins/ABI/RISCV/ABISysV_riscv.cpp +++ b/lldb/source/Plugins/ABI/RISCV/ABISysV_riscv.cpp @@ -718,10 +718,7 @@ ValueObjectSP ABISysV_riscv::GetReturnValueObjectImpl( return GetReturnValueObjectSimple(thread, return_compiler_type); } -bool ABISysV_riscv::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_riscv::CreateFunctionEntryUnwindPlan() { uint32_t pc_reg_num = riscv_dwarf::dwarf_gpr_pc; uint32_t sp_reg_num = riscv_dwarf::dwarf_gpr_sp; uint32_t ra_reg_num = riscv_dwarf::dwarf_gpr_ra; @@ -732,19 +729,16 @@ bool ABISysV_riscv::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 0); // Previous frame's pc is in ra - row->SetRegisterLocationToRegister(pc_reg_num, ra_reg_num, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("riscv function-entry unwind plan"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("riscv function-entry unwind plan"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + return plan_sp; } -bool ABISysV_riscv::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindGeneric); - +UnwindPlanSP ABISysV_riscv::CreateDefaultUnwindPlan() { uint32_t pc_reg_num = LLDB_REGNUM_GENERIC_PC; uint32_t fp_reg_num = LLDB_REGNUM_GENERIC_FP; @@ -763,11 +757,12 @@ bool ABISysV_riscv::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { row->SetRegisterLocationToAtCFAPlusOffset(fp_reg_num, reg_size * -2, true); row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, reg_size * -1, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("riscv default unwind plan"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindGeneric); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("riscv default unwind plan"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); + return plan_sp; } bool ABISysV_riscv::RegisterIsVolatile(const RegisterInfo *reg_info) { diff --git a/lldb/source/Plugins/ABI/RISCV/ABISysV_riscv.h b/lldb/source/Plugins/ABI/RISCV/ABISysV_riscv.h index d8cf008dbb0bf..539a45de5ee77 100644 --- a/lldb/source/Plugins/ABI/RISCV/ABISysV_riscv.h +++ b/lldb/source/Plugins/ABI/RISCV/ABISysV_riscv.h @@ -51,10 +51,9 @@ class ABISysV_riscv : public lldb_private::RegInfoBasedABI { lldb::ValueObjectSP GetReturnValueObjectImpl(lldb_private::Thread &thread, llvm::Type &type) const override; - bool - CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override; - bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateDefaultUnwindPlan() override; bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; diff --git a/lldb/source/Plugins/ABI/SystemZ/ABISysV_s390x.cpp b/lldb/source/Plugins/ABI/SystemZ/ABISysV_s390x.cpp index 82853c96a0f74..a88a3b0e0825d 100644 --- a/lldb/source/Plugins/ABI/SystemZ/ABISysV_s390x.cpp +++ b/lldb/source/Plugins/ABI/SystemZ/ABISysV_s390x.cpp @@ -617,10 +617,7 @@ ValueObjectSP ABISysV_s390x::GetReturnValueObjectImpl( return return_valobj_sp; } -bool ABISysV_s390x::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_s390x::CreateFunctionEntryUnwindPlan() { UnwindPlan::RowSP row(new UnwindPlan::Row); // Our Call Frame Address is the stack pointer value + 160 @@ -630,16 +627,17 @@ bool ABISysV_s390x::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { row->SetRegisterLocationToRegister(dwarf_pswa_s390x, dwarf_r14_s390x, true); // All other registers are the same. - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("s390x at-func-entry default"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("s390x at-func-entry default"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + return plan_sp; } -bool ABISysV_s390x::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { +UnwindPlanSP ABISysV_s390x::CreateDefaultUnwindPlan() { // There's really no default way to unwind on s390x. Trust the .eh_frame CFI, // which should always be good. - return false; + return nullptr; } bool ABISysV_s390x::GetFallbackRegisterLocation( diff --git a/lldb/source/Plugins/ABI/SystemZ/ABISysV_s390x.h b/lldb/source/Plugins/ABI/SystemZ/ABISysV_s390x.h index ecf3e3906dd7b..318be99dd7012 100644 --- a/lldb/source/Plugins/ABI/SystemZ/ABISysV_s390x.h +++ b/lldb/source/Plugins/ABI/SystemZ/ABISysV_s390x.h @@ -34,10 +34,9 @@ class ABISysV_s390x : public lldb_private::RegInfoBasedABI { GetReturnValueObjectImpl(lldb_private::Thread &thread, lldb_private::CompilerType &type) const override; - bool - CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override; - bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateDefaultUnwindPlan() override; bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; diff --git a/lldb/source/Plugins/ABI/X86/ABIMacOSX_i386.cpp b/lldb/source/Plugins/ABI/X86/ABIMacOSX_i386.cpp index f03acbcedb351..d484b781a5136 100644 --- a/lldb/source/Plugins/ABI/X86/ABIMacOSX_i386.cpp +++ b/lldb/source/Plugins/ABI/X86/ABIMacOSX_i386.cpp @@ -356,10 +356,7 @@ ABIMacOSX_i386::GetReturnValueObjectImpl(Thread &thread, // the saved pc is at CFA-4 (i.e. esp+0) // The saved esp is CFA+0 -bool ABIMacOSX_i386::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABIMacOSX_i386::CreateFunctionEntryUnwindPlan() { uint32_t sp_reg_num = dwarf_esp; uint32_t pc_reg_num = dwarf_eip; @@ -367,10 +364,12 @@ bool ABIMacOSX_i386::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 4); row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, -4, false); row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("i386 at-func-entry default"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - return true; + + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("i386 at-func-entry default"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + return plan_sp; } // This defines the CFA as ebp+8 @@ -378,10 +377,7 @@ bool ABIMacOSX_i386::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { // The saved ebp is at CFA-8 (i.e. ebp+0) // The saved esp is CFA+0 -bool ABIMacOSX_i386::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABIMacOSX_i386::CreateDefaultUnwindPlan() { uint32_t fp_reg_num = dwarf_ebp; uint32_t sp_reg_num = dwarf_esp; uint32_t pc_reg_num = dwarf_eip; @@ -397,12 +393,13 @@ bool ABIMacOSX_i386::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true); row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("i386 default unwind plan"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); - unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("i386 default unwind plan"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); + plan_sp->SetUnwindPlanForSignalTrap(eLazyBoolNo); + return plan_sp; } bool ABIMacOSX_i386::RegisterIsVolatile(const RegisterInfo *reg_info) { diff --git a/lldb/source/Plugins/ABI/X86/ABIMacOSX_i386.h b/lldb/source/Plugins/ABI/X86/ABIMacOSX_i386.h index 8c637b7671f6b..a72ee8ba17847 100644 --- a/lldb/source/Plugins/ABI/X86/ABIMacOSX_i386.h +++ b/lldb/source/Plugins/ABI/X86/ABIMacOSX_i386.h @@ -30,10 +30,9 @@ class ABIMacOSX_i386 : public ABIX86_i386 { SetReturnValueObject(lldb::StackFrameSP &frame_sp, lldb::ValueObjectSP &new_value) override; - bool - CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override; - bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateDefaultUnwindPlan() override; bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; diff --git a/lldb/source/Plugins/ABI/X86/ABISysV_i386.cpp b/lldb/source/Plugins/ABI/X86/ABISysV_i386.cpp index 19ec5fa49bbea..f6b3666632728 100644 --- a/lldb/source/Plugins/ABI/X86/ABISysV_i386.cpp +++ b/lldb/source/Plugins/ABI/X86/ABISysV_i386.cpp @@ -623,10 +623,7 @@ ValueObjectSP ABISysV_i386::GetReturnValueObjectImpl( // The saved pc is at CFA-4 (i.e. esp+0) // The saved esp is CFA+0 -bool ABISysV_i386::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_i386::CreateFunctionEntryUnwindPlan() { uint32_t sp_reg_num = dwarf_esp; uint32_t pc_reg_num = dwarf_eip; @@ -634,10 +631,12 @@ bool ABISysV_i386::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 4); row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, -4, false); row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("i386 at-func-entry default"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - return true; + + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("i386 at-func-entry default"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + return plan_sp; } // This defines CFA as ebp+8 @@ -645,10 +644,7 @@ bool ABISysV_i386::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { // The saved ebp is at CFA-8 (i.e. ebp+0) // The saved esp is CFA+0 -bool ABISysV_i386::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_i386::CreateDefaultUnwindPlan() { uint32_t fp_reg_num = dwarf_ebp; uint32_t sp_reg_num = dwarf_esp; uint32_t pc_reg_num = dwarf_eip; @@ -664,12 +660,13 @@ bool ABISysV_i386::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true); row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("i386 default unwind plan"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); - unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("i386 default unwind plan"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); + plan_sp->SetUnwindPlanForSignalTrap(eLazyBoolNo); + return plan_sp; } // According to "Register Usage" in reference document (specified on top of diff --git a/lldb/source/Plugins/ABI/X86/ABISysV_i386.h b/lldb/source/Plugins/ABI/X86/ABISysV_i386.h index a19c8ddb5b645..b602729ebb6e6 100644 --- a/lldb/source/Plugins/ABI/X86/ABISysV_i386.h +++ b/lldb/source/Plugins/ABI/X86/ABISysV_i386.h @@ -36,10 +36,9 @@ class ABISysV_i386 : public ABIX86_i386 { GetReturnValueObjectImpl(lldb_private::Thread &thread, lldb_private::CompilerType &type) const override; - bool - CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override; - bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateDefaultUnwindPlan() override; bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override { return !RegisterIsCalleeSaved(reg_info); diff --git a/lldb/source/Plugins/ABI/X86/ABISysV_x86_64.cpp b/lldb/source/Plugins/ABI/X86/ABISysV_x86_64.cpp index 83b01b14aedc5..a224b3b9d4c23 100644 --- a/lldb/source/Plugins/ABI/X86/ABISysV_x86_64.cpp +++ b/lldb/source/Plugins/ABI/X86/ABISysV_x86_64.cpp @@ -858,10 +858,7 @@ ValueObjectSP ABISysV_x86_64::GetReturnValueObjectImpl( // the saved pc is at CFA-8 (i.e. rsp+0) // The saved rsp is CFA+0 -bool ABISysV_x86_64::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_x86_64::CreateFunctionEntryUnwindPlan() { uint32_t sp_reg_num = dwarf_rsp; uint32_t pc_reg_num = dwarf_rip; @@ -869,10 +866,12 @@ bool ABISysV_x86_64::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 8); row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, -8, false); row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("x86_64 at-func-entry default"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - return true; + + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("x86_64 at-func-entry default"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + return plan_sp; } // This defines the CFA as rbp+16 @@ -880,10 +879,7 @@ bool ABISysV_x86_64::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { // The saved rbp is at CFA-16 (i.e. rbp+0) // The saved rsp is CFA+0 -bool ABISysV_x86_64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABISysV_x86_64::CreateDefaultUnwindPlan() { uint32_t fp_reg_num = dwarf_rbp; uint32_t sp_reg_num = dwarf_rsp; uint32_t pc_reg_num = dwarf_rip; @@ -899,12 +895,13 @@ bool ABISysV_x86_64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true); row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("x86_64 default unwind plan"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); - unwind_plan.SetUnwindPlanForSignalTrap(eLazyBoolNo); - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("x86_64 default unwind plan"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); + plan_sp->SetUnwindPlanForSignalTrap(eLazyBoolNo); + return plan_sp; } bool ABISysV_x86_64::RegisterIsVolatile(const RegisterInfo *reg_info) { diff --git a/lldb/source/Plugins/ABI/X86/ABISysV_x86_64.h b/lldb/source/Plugins/ABI/X86/ABISysV_x86_64.h index ce0357dfa331f..efc493a38f1a5 100644 --- a/lldb/source/Plugins/ABI/X86/ABISysV_x86_64.h +++ b/lldb/source/Plugins/ABI/X86/ABISysV_x86_64.h @@ -33,10 +33,9 @@ class ABISysV_x86_64 : public ABIX86_64 { GetReturnValueObjectImpl(lldb_private::Thread &thread, lldb_private::CompilerType &type) const override; - bool - CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override; - bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateDefaultUnwindPlan() override; bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; diff --git a/lldb/source/Plugins/ABI/X86/ABIWindows_x86_64.cpp b/lldb/source/Plugins/ABI/X86/ABIWindows_x86_64.cpp index 098293c1d6046..8c6cea679fbd2 100644 --- a/lldb/source/Plugins/ABI/X86/ABIWindows_x86_64.cpp +++ b/lldb/source/Plugins/ABI/X86/ABIWindows_x86_64.cpp @@ -738,10 +738,7 @@ ValueObjectSP ABIWindows_x86_64::GetReturnValueObjectImpl( // the saved pc is at CFA-8 (i.e. rsp+0) // The saved rsp is CFA+0 -bool ABIWindows_x86_64::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABIWindows_x86_64::CreateFunctionEntryUnwindPlan() { uint32_t sp_reg_num = dwarf_rsp; uint32_t pc_reg_num = dwarf_rip; @@ -749,19 +746,18 @@ bool ABIWindows_x86_64::CreateFunctionEntryUnwindPlan(UnwindPlan &unwind_plan) { row->GetCFAValue().SetIsRegisterPlusOffset(sp_reg_num, 8); row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, -8, false); row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("x86_64 at-func-entry default"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - return true; + + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("x86_64 at-func-entry default"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + return plan_sp; } // Windows-x86_64 doesn't use %rbp // No available Unwind information for Windows-x86_64 (section .pdata) // Let's use SysV-x86_64 one for now -bool ABIWindows_x86_64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { - unwind_plan.Clear(); - unwind_plan.SetRegisterKind(eRegisterKindDWARF); - +UnwindPlanSP ABIWindows_x86_64::CreateDefaultUnwindPlan() { uint32_t fp_reg_num = dwarf_rbp; uint32_t sp_reg_num = dwarf_rsp; uint32_t pc_reg_num = dwarf_rip; @@ -777,12 +773,12 @@ bool ABIWindows_x86_64::CreateDefaultUnwindPlan(UnwindPlan &unwind_plan) { row->SetRegisterLocationToAtCFAPlusOffset(pc_reg_num, ptr_size * -1, true); row->SetRegisterLocationToIsCFAPlusOffset(sp_reg_num, 0, true); - unwind_plan.AppendRow(row); - unwind_plan.SetSourceName("x86_64 default unwind plan"); - unwind_plan.SetSourcedFromCompiler(eLazyBoolNo); - unwind_plan.SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); - - return true; + auto plan_sp = std::make_shared<UnwindPlan>(eRegisterKindDWARF); + plan_sp->AppendRow(row); + plan_sp->SetSourceName("x86_64 default unwind plan"); + plan_sp->SetSourcedFromCompiler(eLazyBoolNo); + plan_sp->SetUnwindPlanValidAtAllInstructions(eLazyBoolNo); + return plan_sp; } bool ABIWindows_x86_64::RegisterIsVolatile(const RegisterInfo *reg_info) { diff --git a/lldb/source/Plugins/ABI/X86/ABIWindows_x86_64.h b/lldb/source/Plugins/ABI/X86/ABIWindows_x86_64.h index 2fab0fd61ea3e..2485e4dd20909 100644 --- a/lldb/source/Plugins/ABI/X86/ABIWindows_x86_64.h +++ b/lldb/source/Plugins/ABI/X86/ABIWindows_x86_64.h @@ -33,10 +33,9 @@ class ABIWindows_x86_64 : public ABIX86_64 { GetReturnValueObjectImpl(lldb_private::Thread &thread, lldb_private::CompilerType &type) const override; - bool - CreateFunctionEntryUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateFunctionEntryUnwindPlan() override; - bool CreateDefaultUnwindPlan(lldb_private::UnwindPlan &unwind_plan) override; + lldb::UnwindPlanSP CreateDefaultUnwindPlan() override; bool RegisterIsVolatile(const lldb_private::RegisterInfo *reg_info) override; diff --git a/lldb/source/Plugins/UnwindAssembly/x86/UnwindAssembly-x86.cpp b/lldb/source/Plugins/UnwindAssembly/x86/UnwindAssembly-x86.cpp index 89a20ee38c334..5f0a863e936d4 100644 --- a/lldb/source/Plugins/UnwindAssembly/x86/UnwindAssembly-x86.cpp +++ b/lldb/source/Plugins/UnwindAssembly/x86/UnwindAssembly-x86.cpp @@ -193,9 +193,11 @@ bool UnwindAssembly_x86::GetFastUnwindPlan(AddressRange &func, Thread &thread, 0 || memcmp(opcode_data.data(), x86_64_push_mov, sizeof(x86_64_push_mov)) == 0) { - ABISP abi_sp = process_sp->GetABI(); - if (abi_sp) { - return abi_sp->CreateDefaultUnwindPlan(unwind_plan); + if (ABISP abi_sp = process_sp->GetABI()) { + if (UnwindPlanSP plan_sp = abi_sp->CreateDefaultUnwindPlan()) { + unwind_plan = std::move(*plan_sp); + return true; + } } } } diff --git a/lldb/source/Symbol/FuncUnwinders.cpp b/lldb/source/Symbol/FuncUnwinders.cpp index 0695f0d599140..2449c82812696 100644 --- a/lldb/source/Symbol/FuncUnwinders.cpp +++ b/lldb/source/Symbol/FuncUnwinders.cpp @@ -468,17 +468,10 @@ UnwindPlanSP FuncUnwinders::GetUnwindPlanArchitectureDefault(Thread &thread) { m_tried_unwind_arch_default = true; - Address current_pc; ProcessSP process_sp(thread.CalculateProcess()); if (process_sp) { - ABI *abi = process_sp->GetABI().get(); - if (abi) { - m_unwind_plan_arch_default_sp = - std::make_shared<UnwindPlan>(lldb::eRegisterKindGeneric); - if (!abi->CreateDefaultUnwindPlan(*m_unwind_plan_arch_default_sp)) { - m_unwind_plan_arch_default_sp.reset(); - } - } + if (ABI *abi = process_sp->GetABI().get()) + m_unwind_plan_arch_default_sp = abi->CreateDefaultUnwindPlan(); } return m_unwind_plan_arch_default_sp; @@ -496,14 +489,9 @@ FuncUnwinders::GetUnwindPlanArchitectureDefaultAtFunctionEntry(Thread &thread) { Address current_pc; ProcessSP process_sp(thread.CalculateProcess()); if (process_sp) { - ABI *abi = process_sp->GetABI().get(); - if (abi) { + if (ABI *abi = process_sp->GetABI().get()) { m_unwind_plan_arch_default_at_func_entry_sp = - std::make_shared<UnwindPlan>(lldb::eRegisterKindGeneric); - if (!abi->CreateFunctionEntryUnwindPlan( - *m_unwind_plan_arch_default_at_func_entry_sp)) { - m_unwind_plan_arch_default_at_func_entry_sp.reset(); - } + abi->CreateFunctionEntryUnwindPlan(); } } diff --git a/lldb/source/Target/RegisterContextUnwind.cpp b/lldb/source/Target/RegisterContextUnwind.cpp index b970cb7961ab0..a035c57fbfc1c 100644 --- a/lldb/source/Target/RegisterContextUnwind.cpp +++ b/lldb/source/Target/RegisterContextUnwind.cpp @@ -431,9 +431,7 @@ void RegisterContextUnwind::InitializeNonZerothFrame() { if (abi_sp) { m_fast_unwind_plan_sp.reset(); - m_full_unwind_plan_sp = - std::make_shared<UnwindPlan>(lldb::eRegisterKindGeneric); - abi_sp->CreateDefaultUnwindPlan(*m_full_unwind_plan_sp); + m_full_unwind_plan_sp = abi_sp->CreateDefaultUnwindPlan(); if (m_frame_type != eSkipFrame) // don't override eSkipFrame { m_frame_type = eNormalFrame; @@ -801,9 +799,7 @@ UnwindPlanSP RegisterContextUnwind::GetFullUnwindPlanForFrame() { Process *process = exe_ctx.GetProcessPtr(); ABI *abi = process ? process->GetABI().get() : nullptr; if (abi) { - arch_default_unwind_plan_sp = - std::make_shared<UnwindPlan>(lldb::eRegisterKindGeneric); - abi->CreateDefaultUnwindPlan(*arch_default_unwind_plan_sp); + arch_default_unwind_plan_sp = abi->CreateDefaultUnwindPlan(); } else { UnwindLogMsg( "unable to get architectural default UnwindPlan from ABI plugin"); @@ -836,9 +832,7 @@ UnwindPlanSP RegisterContextUnwind::GetFullUnwindPlanForFrame() { process->GetLoadAddressPermissions(current_pc_addr, permissions) && (permissions & ePermissionsExecutable) == 0)) { if (abi) { - unwind_plan_sp = - std::make_shared<UnwindPlan>(lldb::eRegisterKindGeneric); - abi->CreateFunctionEntryUnwindPlan(*unwind_plan_sp); + unwind_plan_sp = abi->CreateFunctionEntryUnwindPlan(); m_frame_type = eNormalFrame; return unwind_plan_sp; } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits