summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.cpp
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2011-02-15 00:19:15 +0000
committerGreg Clayton <gclayton@apple.com>2011-02-15 00:19:15 +0000
commite576ab2996b5fa4facf2bf7e73cc4679cb17c133 (patch)
treebdcafd5e6a9f09adf5a3e9d3b7e92f9d693b939c /lldb/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.cpp
parent91c08ad14a81cc40769442c19a23addfba28371e (diff)
downloadbcm5719-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.cpp188
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;
}
+
OpenPOWER on IntegriCloud