diff options
author | Greg Clayton <gclayton@apple.com> | 2011-02-15 00:19:15 +0000 |
---|---|---|
committer | Greg Clayton <gclayton@apple.com> | 2011-02-15 00:19:15 +0000 |
commit | e576ab2996b5fa4facf2bf7e73cc4679cb17c133 (patch) | |
tree | bdcafd5e6a9f09adf5a3e9d3b7e92f9d693b939c /lldb/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.cpp | |
parent | 91c08ad14a81cc40769442c19a23addfba28371e (diff) | |
download | bcm5719-llvm-e576ab2996b5fa4facf2bf7e73cc4679cb17c133.tar.gz bcm5719-llvm-e576ab2996b5fa4facf2bf7e73cc4679cb17c133.zip |
All UnwindPlan objects are now passed around as shared pointers.
ArchDefaultUnwindPlan plug-in interfaces are now cached per architecture
instead of being leaked for every frame.
Split the ArchDefaultUnwindPlan_x86 into ArchDefaultUnwindPlan_x86_64 and
ArchDefaultUnwindPlan_i386 interfaces.
There were sporadic crashes that were due to something leaking or being
destroyed when doing stack crawls. This patch should clear up these issues.
llvm-svn: 125541
Diffstat (limited to 'lldb/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.cpp')
-rw-r--r-- | lldb/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.cpp | 188 |
1 files changed, 131 insertions, 57 deletions
diff --git a/lldb/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.cpp b/lldb/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.cpp index 289429d0c25..6824b799dd7 100644 --- a/lldb/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.cpp +++ b/lldb/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.cpp @@ -8,115 +8,182 @@ //===----------------------------------------------------------------------===// #include "ArchDefaultUnwindPlan-x86.h" -#include "llvm/Support/MachO.h" -#include "lldb/lldb-private.h" -#include "lldb/Utility/ArchDefaultUnwindPlan.h" #include "lldb/Core/ArchSpec.h" #include "lldb/Core/PluginManager.h" -#include "lldb/lldb-enumerations.h" +#include "lldb/Utility/ArchDefaultUnwindPlan.h" using namespace lldb; using namespace lldb_private; -lldb_private::UnwindPlan* -ArchDefaultUnwindPlan_x86::GetArchDefaultUnwindPlan (Thread& thread, Address current_pc) -{ - if (m_cpu == llvm::MachO::CPUTypeX86_64) - { - return &m_64bit_default; - } - if (m_cpu == llvm::MachO::CPUTypeI386) - { - return &m_32bit_default; - } - return NULL; -} - lldb_private::ArchDefaultUnwindPlan * -ArchDefaultUnwindPlan_x86::CreateInstance (const lldb_private::ArchSpec &arch) +ArchDefaultUnwindPlan_x86_64::CreateInstance (const lldb_private::ArchSpec &arch) { - uint32_t cpu = arch.GetCPUType (); - if (cpu != llvm::MachO::CPUTypeX86_64 && cpu != llvm::MachO::CPUTypeI386) - return NULL; - - return new ArchDefaultUnwindPlan_x86 (cpu); + if (arch.GetGenericCPUType () == ArchSpec::eCPU_x86_64) + return new ArchDefaultUnwindPlan_x86_64 (); + return NULL; } -ArchDefaultUnwindPlan_x86::ArchDefaultUnwindPlan_x86(int cpu) : +ArchDefaultUnwindPlan_x86_64::ArchDefaultUnwindPlan_x86_64() : lldb_private::ArchDefaultUnwindPlan(), - m_cpu(cpu), - m_32bit_default(), - m_64bit_default() + m_unwind_plan_sp (new UnwindPlan) { UnwindPlan::Row row; UnwindPlan::Row::RegisterLocation regloc; - m_32bit_default.SetRegisterKind (eRegisterKindGeneric); + m_unwind_plan_sp->SetRegisterKind (eRegisterKindGeneric); row.SetCFARegister (LLDB_REGNUM_GENERIC_FP); - row.SetCFAOffset (2 * 4); + row.SetCFAOffset (2 * 8); row.SetOffset (0); - regloc.SetAtCFAPlusOffset (2 * -4); + regloc.SetAtCFAPlusOffset (2 * -8); row.SetRegisterInfo (LLDB_REGNUM_GENERIC_FP, regloc); - regloc.SetAtCFAPlusOffset (1 * -4); + regloc.SetAtCFAPlusOffset (1 * -8); row.SetRegisterInfo (LLDB_REGNUM_GENERIC_PC, regloc); regloc.SetIsCFAPlusOffset (0); row.SetRegisterInfo (LLDB_REGNUM_GENERIC_SP, regloc); - m_32bit_default.AppendRow (row); - m_32bit_default.SetSourceName ("architectural default"); + m_unwind_plan_sp->AppendRow (row); + m_unwind_plan_sp->SetSourceName ("x86_64 architectural default"); +} + +//------------------------------------------------------------------ +// PluginInterface protocol in UnwindAssemblyParser_x86 +//------------------------------------------------------------------ + +const char * +ArchDefaultUnwindPlan_x86_64::GetPluginName() +{ + return "ArchDefaultUnwindPlan_x86_64"; +} + +const char * +ArchDefaultUnwindPlan_x86_64::GetShortPluginName() +{ + return "lldb.arch-default-unwind-plan.x86-64"; +} + + +uint32_t +ArchDefaultUnwindPlan_x86_64::GetPluginVersion() +{ + return 1; +} + +void +ArchDefaultUnwindPlan_x86_64::GetPluginCommandHelp (const char *command, Stream *strm) +{ +} + +Error +ArchDefaultUnwindPlan_x86_64::ExecutePluginCommand (Args &command, Stream *strm) +{ + Error error; + error.SetErrorString("No plug-in command are currently supported."); + return error; +} + +Log * +ArchDefaultUnwindPlan_x86_64::EnablePluginLogging (Stream *strm, Args &command) +{ + return NULL; +} + +void +ArchDefaultUnwindPlan_x86_64::Initialize() +{ + PluginManager::RegisterPlugin (GetPluginNameStatic(), + GetPluginDescriptionStatic(), + CreateInstance); +} + +void +ArchDefaultUnwindPlan_x86_64::Terminate() +{ + PluginManager::UnregisterPlugin (CreateInstance); +} + + +const char * +ArchDefaultUnwindPlan_x86_64::GetPluginNameStatic() +{ + return "ArchDefaultUnwindPlan_x86_64"; +} + +const char * +ArchDefaultUnwindPlan_x86_64::GetPluginDescriptionStatic() +{ + return "x86_64 architecture default unwind plan assembly plugin."; +} + +UnwindPlanSP +ArchDefaultUnwindPlan_x86_64::GetArchDefaultUnwindPlan (Thread& thread, Address current_pc) +{ + return m_unwind_plan_sp; +} + + + +lldb_private::ArchDefaultUnwindPlan * +ArchDefaultUnwindPlan_i386::CreateInstance (const lldb_private::ArchSpec &arch) +{ + if (arch.GetGenericCPUType () == ArchSpec::eCPU_i386) + return new ArchDefaultUnwindPlan_i386 (); + return NULL; +} - row.Clear(); +ArchDefaultUnwindPlan_i386::ArchDefaultUnwindPlan_i386() : + lldb_private::ArchDefaultUnwindPlan(), + m_unwind_plan_sp (new UnwindPlan) +{ + UnwindPlan::Row row; + UnwindPlan::Row::RegisterLocation regloc; - m_64bit_default.SetRegisterKind (eRegisterKindGeneric); + m_unwind_plan_sp->SetRegisterKind (eRegisterKindGeneric); row.SetCFARegister (LLDB_REGNUM_GENERIC_FP); - row.SetCFAOffset (2 * 8); + row.SetCFAOffset (2 * 4); row.SetOffset (0); - regloc.SetAtCFAPlusOffset (2 * -8); + regloc.SetAtCFAPlusOffset (2 * -4); row.SetRegisterInfo (LLDB_REGNUM_GENERIC_FP, regloc); - regloc.SetAtCFAPlusOffset (1 * -8); + regloc.SetAtCFAPlusOffset (1 * -4); row.SetRegisterInfo (LLDB_REGNUM_GENERIC_PC, regloc); regloc.SetIsCFAPlusOffset (0); row.SetRegisterInfo (LLDB_REGNUM_GENERIC_SP, regloc); - m_64bit_default.AppendRow (row); - m_64bit_default.SetSourceName ("architectural default"); + m_unwind_plan_sp->AppendRow (row); + m_unwind_plan_sp->SetSourceName ("i386 architectural default"); } - - - //------------------------------------------------------------------ // PluginInterface protocol in UnwindAssemblyParser_x86 //------------------------------------------------------------------ const char * -ArchDefaultUnwindPlan_x86::GetPluginName() +ArchDefaultUnwindPlan_i386::GetPluginName() { - return "ArchDefaultUnwindPlan_x86"; + return "ArchDefaultUnwindPlan_i386"; } const char * -ArchDefaultUnwindPlan_x86::GetShortPluginName() +ArchDefaultUnwindPlan_i386::GetShortPluginName() { return "archdefaultunwindplan.x86"; } uint32_t -ArchDefaultUnwindPlan_x86::GetPluginVersion() +ArchDefaultUnwindPlan_i386::GetPluginVersion() { return 1; } void -ArchDefaultUnwindPlan_x86::GetPluginCommandHelp (const char *command, Stream *strm) +ArchDefaultUnwindPlan_i386::GetPluginCommandHelp (const char *command, Stream *strm) { } Error -ArchDefaultUnwindPlan_x86::ExecutePluginCommand (Args &command, Stream *strm) +ArchDefaultUnwindPlan_i386::ExecutePluginCommand (Args &command, Stream *strm) { Error error; error.SetErrorString("No plug-in command are currently supported."); @@ -124,13 +191,13 @@ ArchDefaultUnwindPlan_x86::ExecutePluginCommand (Args &command, Stream *strm) } Log * -ArchDefaultUnwindPlan_x86::EnablePluginLogging (Stream *strm, Args &command) +ArchDefaultUnwindPlan_i386::EnablePluginLogging (Stream *strm, Args &command) { return NULL; } void -ArchDefaultUnwindPlan_x86::Initialize() +ArchDefaultUnwindPlan_i386::Initialize() { PluginManager::RegisterPlugin (GetPluginNameStatic(), GetPluginDescriptionStatic(), @@ -138,20 +205,27 @@ ArchDefaultUnwindPlan_x86::Initialize() } void -ArchDefaultUnwindPlan_x86::Terminate() +ArchDefaultUnwindPlan_i386::Terminate() { PluginManager::UnregisterPlugin (CreateInstance); } const char * -ArchDefaultUnwindPlan_x86::GetPluginNameStatic() +ArchDefaultUnwindPlan_i386::GetPluginNameStatic() { - return "ArchDefaultUnwindPlan_x86"; + return "ArchDefaultUnwindPlan_i386"; } const char * -ArchDefaultUnwindPlan_x86::GetPluginDescriptionStatic() +ArchDefaultUnwindPlan_i386::GetPluginDescriptionStatic() +{ + return "i386 architecture default unwind plan assembly plugin."; +} + +UnwindPlanSP +ArchDefaultUnwindPlan_i386::GetArchDefaultUnwindPlan (Thread& thread, Address current_pc) { - return "i386 and x86_64 architecture default unwind plan assembly plugin."; + return m_unwind_plan_sp; } + |