[Lldb-commits] [lldb] r125541 - in /lldb/trunk: include/lldb/ include/lldb/Symbol/ include/lldb/Utility/ source/ source/Plugins/Process/Utility/ source/Plugins/Process/gdb-remote/ source/Plugins/SymbolFile/DWARF/ source/Symbol/ source/Utility/
Greg Clayton
gclayton at apple.com
Mon Feb 14 16:19:15 PST 2011
Author: gclayton
Date: Mon Feb 14 18:19:15 2011
New Revision: 125541
URL: http://llvm.org/viewvc/llvm-project?rev=125541&view=rev
Log:
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.
Modified:
lldb/trunk/include/lldb/Symbol/FuncUnwinders.h
lldb/trunk/include/lldb/Utility/ArchDefaultUnwindPlan.h
lldb/trunk/include/lldb/lldb-forward-rtti.h
lldb/trunk/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.cpp
lldb/trunk/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.h
lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.h
lldb/trunk/source/Plugins/Process/Utility/UnwindLLDB.cpp
lldb/trunk/source/Plugins/Process/Utility/UnwindLLDB.h
lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp
lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h
lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp
lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.h
lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
lldb/trunk/source/Symbol/FuncUnwinders.cpp
lldb/trunk/source/Utility/ArchDefaultUnwindPlan.cpp
lldb/trunk/source/lldb.cpp
Modified: lldb/trunk/include/lldb/Symbol/FuncUnwinders.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Symbol/FuncUnwinders.h?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Symbol/FuncUnwinders.h (original)
+++ lldb/trunk/include/lldb/Symbol/FuncUnwinders.h Mon Feb 14 18:19:15 2011
@@ -43,16 +43,16 @@
// On architectures where the pc points to the next instruction that will execute, this
// offset value will have already been decremented by 1 to stay within the bounds of the
// correct function body.
- UnwindPlan*
+ lldb::UnwindPlanSP
GetUnwindPlanAtCallSite (int current_offset);
- UnwindPlan*
+ lldb::UnwindPlanSP
GetUnwindPlanAtNonCallSite (lldb_private::Thread& thread);
- UnwindPlan*
+ lldb::UnwindPlanSP
GetUnwindPlanFastUnwind (lldb_private::Thread& Thread);
- UnwindPlan*
+ lldb::UnwindPlanSP
GetUnwindPlanArchitectureDefault (lldb_private::Thread& thread);
Address&
@@ -74,10 +74,10 @@
AddressRange m_range;
Mutex m_mutex;
- std::auto_ptr<UnwindPlan> m_unwind_at_call_site_ap;
- std::auto_ptr<UnwindPlan> m_unwind_at_non_call_site_ap;
- std::auto_ptr<UnwindPlan> m_unwind_fast_ap;
- UnwindPlan *m_unwind_arch_default;
+ lldb::UnwindPlanSP m_unwind_plan_call_site_sp;
+ lldb::UnwindPlanSP m_unwind_plan_non_call_site_sp;
+ lldb::UnwindPlanSP m_unwind_plan_fast_sp;
+ lldb::UnwindPlanSP m_unwind_plan_arch_default_sp;
bool m_tried_unwind_at_call_site:1,
m_tried_unwind_at_non_call_site:1,
Modified: lldb/trunk/include/lldb/Utility/ArchDefaultUnwindPlan.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Utility/ArchDefaultUnwindPlan.h?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Utility/ArchDefaultUnwindPlan.h (original)
+++ lldb/trunk/include/lldb/Utility/ArchDefaultUnwindPlan.h Mon Feb 14 18:19:15 2011
@@ -23,10 +23,10 @@
virtual
~ArchDefaultUnwindPlan();
- virtual lldb_private::UnwindPlan*
+ virtual lldb::UnwindPlanSP
GetArchDefaultUnwindPlan (Thread& thread, Address current_pc) = 0;
- static ArchDefaultUnwindPlan*
+ static lldb::ArchDefaultUnwindPlanSP
FindPlugin (const ArchSpec &arch);
protected:
Modified: lldb/trunk/include/lldb/lldb-forward-rtti.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-forward-rtti.h?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/include/lldb/lldb-forward-rtti.h (original)
+++ lldb/trunk/include/lldb/lldb-forward-rtti.h Mon Feb 14 18:19:15 2011
@@ -21,6 +21,7 @@
typedef SharedPtr<lldb_private::ABI>::Type ABISP;
typedef SharedPtr<lldb_private::AddressResolver>::Type AddressResolverSP;
+ typedef SharedPtr<lldb_private::ArchDefaultUnwindPlan>::Type ArchDefaultUnwindPlanSP;
typedef SharedPtr<lldb_private::Baton>::Type BatonSP;
typedef SharedPtr<lldb_private::Block>::Type BlockSP;
typedef SharedPtr<lldb_private::Breakpoint>::Type BreakpointSP;
@@ -66,6 +67,7 @@
typedef SharedPtr<lldb_private::Type>::Type TypeSP;
typedef SharedPtr<lldb_private::FuncUnwinders>::Type FuncUnwindersSP;
typedef SharedPtr<lldb_private::UserSettingsController>::Type UserSettingsControllerSP;
+ typedef SharedPtr<lldb_private::UnwindPlan>::Type UnwindPlanSP;
typedef SharedPtr<lldb_private::ValueObject>::Type ValueObjectSP;
typedef SharedPtr<lldb_private::Variable>::Type VariableSP;
typedef SharedPtr<lldb_private::VariableList>::Type VariableListSP;
Modified: lldb/trunk/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.cpp?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.cpp Mon Feb 14 18:19:15 2011
@@ -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
+//------------------------------------------------------------------
- row.Clear();
+const char *
+ArchDefaultUnwindPlan_x86_64::GetPluginName()
+{
+ return "ArchDefaultUnwindPlan_x86_64";
+}
- m_64bit_default.SetRegisterKind (eRegisterKindGeneric);
+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;
+}
+
+ArchDefaultUnwindPlan_i386::ArchDefaultUnwindPlan_i386() :
+ lldb_private::ArchDefaultUnwindPlan(),
+ m_unwind_plan_sp (new UnwindPlan)
+{
+ UnwindPlan::Row row;
+ UnwindPlan::Row::RegisterLocation regloc;
+
+ 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 @@
}
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 @@
}
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;
}
+
Modified: lldb/trunk/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.h?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.h (original)
+++ lldb/trunk/source/Plugins/Process/Utility/ArchDefaultUnwindPlan-x86.h Mon Feb 14 18:19:15 2011
@@ -17,13 +17,13 @@
namespace lldb_private {
-class ArchDefaultUnwindPlan_x86 : public lldb_private::ArchDefaultUnwindPlan
+class ArchDefaultUnwindPlan_x86_64 : public lldb_private::ArchDefaultUnwindPlan
{
public:
- ~ArchDefaultUnwindPlan_x86 () { }
+ ~ArchDefaultUnwindPlan_x86_64 () { }
- virtual lldb_private::UnwindPlan*
+ virtual lldb::UnwindPlanSP
GetArchDefaultUnwindPlan (Thread& thread, Address current_pc);
static lldb_private::ArchDefaultUnwindPlan *
@@ -63,11 +63,60 @@
EnablePluginLogging (lldb_private::Stream *strm, lldb_private::Args &command);
private:
- ArchDefaultUnwindPlan_x86(int cpu); // Call CreateInstance instead.
+ ArchDefaultUnwindPlan_x86_64(); // Call CreateInstance instead.
- int m_cpu;
- lldb_private::UnwindPlan m_32bit_default;
- lldb_private::UnwindPlan m_64bit_default;
+ lldb::UnwindPlanSP m_unwind_plan_sp;
+};
+
+class ArchDefaultUnwindPlan_i386 : public lldb_private::ArchDefaultUnwindPlan
+{
+public:
+
+ ~ArchDefaultUnwindPlan_i386 () { }
+
+ virtual lldb::UnwindPlanSP
+ GetArchDefaultUnwindPlan (Thread& thread, Address current_pc);
+
+ static lldb_private::ArchDefaultUnwindPlan *
+ CreateInstance (const lldb_private::ArchSpec &arch);
+
+ //------------------------------------------------------------------
+ // PluginInterface protocol
+ //------------------------------------------------------------------
+ static void
+ Initialize();
+
+ static void
+ Terminate();
+
+ static const char *
+ GetPluginNameStatic();
+
+ static const char *
+ GetPluginDescriptionStatic();
+
+ virtual const char *
+ GetPluginName();
+
+ virtual const char *
+ GetShortPluginName();
+
+ virtual uint32_t
+ GetPluginVersion();
+
+ virtual void
+ GetPluginCommandHelp (const char *command, lldb_private::Stream *strm);
+
+ virtual lldb_private::Error
+ ExecutePluginCommand (lldb_private::Args &command, lldb_private::Stream *strm);
+
+ virtual lldb_private::Log *
+ EnablePluginLogging (lldb_private::Stream *strm, lldb_private::Args &command);
+
+private:
+ ArchDefaultUnwindPlan_i386(); // Call CreateInstance instead.
+
+ lldb::UnwindPlanSP m_unwind_plan_sp;
};
Modified: lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.cpp?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.cpp Mon Feb 14 18:19:15 2011
@@ -34,7 +34,7 @@
RegisterContextLLDB::RegisterContextLLDB
(
Thread& thread,
- const RegisterContextSP &next_frame,
+ const SharedPtr &next_frame,
SymbolContext& sym_ctx,
uint32_t frame_number
) :
@@ -48,8 +48,8 @@
m_start_pc (),
m_current_pc (),
m_frame_number (frame_number),
- m_full_unwind_plan(NULL),
- m_fast_unwind_plan(NULL),
+ m_full_unwind_plan_sp (),
+ m_fast_unwind_plan_sp (),
m_frame_type (-1),
m_current_offset (0),
m_current_offset_backed_up_one (0),
@@ -68,20 +68,9 @@
}
// This same code exists over in the GetFullUnwindPlanForFrame() but it may not have been executed yet
- bool behaves_like_zeroth_frame = false;
- if (IsFrameZero())
- {
- behaves_like_zeroth_frame = true;
- }
- if (!IsFrameZero() && ((RegisterContextLLDB*) m_next_frame.get())->m_frame_type == eSigtrampFrame)
- {
- behaves_like_zeroth_frame = true;
- }
- if (!IsFrameZero() && ((RegisterContextLLDB*) m_next_frame.get())->m_frame_type == eDebuggerFrame)
- {
- behaves_like_zeroth_frame = true;
- }
- if (behaves_like_zeroth_frame)
+ if (IsFrameZero()
+ || m_next_frame->m_frame_type == eSigtrampFrame
+ || m_next_frame->m_frame_type == eDebuggerFrame)
{
m_all_registers_available = true;
}
@@ -124,6 +113,7 @@
if (addr_range.GetBaseAddress().IsValid())
{
m_start_pc = addr_range.GetBaseAddress();
+ assert (frame_sp->GetFrameCodeAddress().GetSection() == m_start_pc.GetSection());
m_current_offset = frame_sp->GetFrameCodeAddress().GetOffset() - m_start_pc.GetOffset();
m_current_offset_backed_up_one = m_current_offset;
}
@@ -136,16 +126,16 @@
// We've set m_frame_type and m_sym_ctx before these calls.
- m_fast_unwind_plan = GetFastUnwindPlanForFrame ();
- m_full_unwind_plan = GetFullUnwindPlanForFrame ();
-
+ m_fast_unwind_plan_sp = GetFastUnwindPlanForFrame ();
+ m_full_unwind_plan_sp = GetFullUnwindPlanForFrame ();
+
const UnwindPlan::Row *active_row = NULL;
int cfa_offset = 0;
int row_register_kind;
- if (m_full_unwind_plan && m_full_unwind_plan->PlanValidAtAddress (m_current_pc))
+ if (m_full_unwind_plan_sp && m_full_unwind_plan_sp->PlanValidAtAddress (m_current_pc))
{
- active_row = m_full_unwind_plan->GetRowForFunctionOffset (m_current_offset);
- row_register_kind = m_full_unwind_plan->GetRegisterKind ();
+ active_row = m_full_unwind_plan_sp->GetRowForFunctionOffset (m_current_offset);
+ row_register_kind = m_full_unwind_plan_sp->GetRegisterKind ();
}
if (active_row == NULL)
@@ -189,7 +179,7 @@
m_frame_number,
(uint64_t) m_current_pc.GetLoadAddress (&m_thread.GetProcess().GetTarget()),
(uint64_t) m_cfa,
- m_full_unwind_plan->GetSourceName().GetCString());
+ m_full_unwind_plan_sp->GetSourceName().GetCString());
}
}
@@ -205,7 +195,8 @@
m_frame_type = eNotAValidFrame;
return;
}
- if (!((RegisterContextLLDB*)m_next_frame.get())->IsValid())
+
+ if (!m_next_frame->IsValid())
{
m_frame_type = eNotAValidFrame;
return;
@@ -244,20 +235,20 @@
log->Printf("%*sFrame %u using architectural default unwind method",
m_frame_number < 100 ? m_frame_number : 100, "", m_frame_number);
}
- ArchSpec arch = m_thread.GetProcess().GetTarget().GetArchitecture ();
- ArchDefaultUnwindPlan *arch_default = ArchDefaultUnwindPlan::FindPlugin (arch);
- if (arch_default)
+ const ArchSpec &arch = m_thread.GetProcess().GetTarget().GetArchitecture ();
+ ArchDefaultUnwindPlanSP arch_default_sp (ArchDefaultUnwindPlan::FindPlugin (arch));
+ if (arch_default_sp)
{
- m_fast_unwind_plan = NULL;
- m_full_unwind_plan = arch_default->GetArchDefaultUnwindPlan (m_thread, m_current_pc);
+ m_fast_unwind_plan_sp.reset();
+ m_full_unwind_plan_sp = arch_default_sp->GetArchDefaultUnwindPlan (m_thread, m_current_pc);
m_frame_type = eNormalFrame;
m_all_registers_available = false;
m_current_offset = -1;
m_current_offset_backed_up_one = -1;
addr_t cfa_regval;
- int row_register_kind = m_full_unwind_plan->GetRegisterKind ();
- uint32_t cfa_regnum = m_full_unwind_plan->GetRowForFunctionOffset(0)->GetCFARegister();
- int cfa_offset = m_full_unwind_plan->GetRowForFunctionOffset(0)->GetCFAOffset();
+ int row_register_kind = m_full_unwind_plan_sp->GetRegisterKind ();
+ uint32_t cfa_regnum = m_full_unwind_plan_sp->GetRowForFunctionOffset(0)->GetCFARegister();
+ int cfa_offset = m_full_unwind_plan_sp->GetRowForFunctionOffset(0)->GetCFAOffset();
if (!ReadGPRValue (row_register_kind, cfa_regnum, cfa_regval))
{
if (log)
@@ -315,8 +306,8 @@
// Or if we're in the middle of the stack (and not "above" an asynchronous event like sigtramp),
// and our "current" pc is the start of a function...
if (m_sym_ctx_valid
- && ((RegisterContextLLDB*) m_next_frame.get())->m_frame_type != eSigtrampFrame
- && ((RegisterContextLLDB*) m_next_frame.get())->m_frame_type != eDebuggerFrame
+ && m_next_frame->m_frame_type != eSigtrampFrame
+ && m_next_frame->m_frame_type != eDebuggerFrame
&& addr_range.GetBaseAddress().IsValid()
&& addr_range.GetBaseAddress().GetSection() == m_current_pc.GetSection()
&& addr_range.GetBaseAddress().GetOffset() == m_current_pc.GetOffset())
@@ -374,7 +365,7 @@
}
// We've set m_frame_type and m_sym_ctx before this call.
- m_fast_unwind_plan = GetFastUnwindPlanForFrame ();
+ m_fast_unwind_plan_sp = GetFastUnwindPlanForFrame ();
const UnwindPlan::Row *active_row = NULL;
int cfa_offset = 0;
@@ -383,18 +374,18 @@
// Try to get by with just the fast UnwindPlan if possible - the full UnwindPlan may be expensive to get
// (e.g. if we have to parse the entire eh_frame section of an ObjectFile for the first time.)
- if (m_fast_unwind_plan && m_fast_unwind_plan->PlanValidAtAddress (m_current_pc))
+ if (m_fast_unwind_plan_sp && m_fast_unwind_plan_sp->PlanValidAtAddress (m_current_pc))
{
- active_row = m_fast_unwind_plan->GetRowForFunctionOffset (m_current_offset);
- row_register_kind = m_fast_unwind_plan->GetRegisterKind ();
+ active_row = m_fast_unwind_plan_sp->GetRowForFunctionOffset (m_current_offset);
+ row_register_kind = m_fast_unwind_plan_sp->GetRegisterKind ();
}
else
{
- m_full_unwind_plan = GetFullUnwindPlanForFrame ();
- if (m_full_unwind_plan && m_full_unwind_plan->PlanValidAtAddress (m_current_pc))
+ m_full_unwind_plan_sp = GetFullUnwindPlanForFrame ();
+ if (m_full_unwind_plan_sp && m_full_unwind_plan_sp->PlanValidAtAddress (m_current_pc))
{
- active_row = m_full_unwind_plan->GetRowForFunctionOffset (m_current_offset);
- row_register_kind = m_full_unwind_plan->GetRegisterKind ();
+ active_row = m_full_unwind_plan_sp->GetRowForFunctionOffset (m_current_offset);
+ row_register_kind = m_full_unwind_plan_sp->GetRegisterKind ();
}
}
@@ -460,49 +451,47 @@
// 3. m_current_pc should have the current pc value for this frame
// 4. m_current_offset_backed_up_one should have the current byte offset into the function, maybe backed up by 1, -1 if unknown
-UnwindPlan *
+UnwindPlanSP
RegisterContextLLDB::GetFastUnwindPlanForFrame ()
{
+ UnwindPlanSP unwind_plan_sp;
if (!m_current_pc.IsValid() || m_current_pc.GetModule() == NULL || m_current_pc.GetModule()->GetObjectFile() == NULL)
- {
- return NULL;
- }
+ return unwind_plan_sp;
if (IsFrameZero ())
- {
- return NULL;
- }
+ return unwind_plan_sp;
- FuncUnwindersSP fu;
- fu = m_current_pc.GetModule()->GetObjectFile()->GetUnwindTable().GetFuncUnwindersContainingAddress (m_current_pc, m_sym_ctx);
- if (fu.get() == NULL)
- {
- return NULL;
- }
+ FuncUnwindersSP func_unwinders_sp (m_current_pc.GetModule()->GetObjectFile()->GetUnwindTable().GetFuncUnwindersContainingAddress (m_current_pc, m_sym_ctx));
+ if (!func_unwinders_sp)
+ return unwind_plan_sp;
// If we're in _sigtramp(), unwinding past this frame requires special knowledge.
if (m_frame_type == eSigtrampFrame || m_frame_type == eDebuggerFrame)
- {
- return NULL;
- }
+ return unwind_plan_sp;
- if (fu->GetUnwindPlanFastUnwind (m_thread)
- && fu->GetUnwindPlanFastUnwind (m_thread)->PlanValidAtAddress (m_current_pc))
+ unwind_plan_sp = func_unwinders_sp->GetUnwindPlanFastUnwind (m_thread);
+ if (unwind_plan_sp)
{
- LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_UNWIND));
- if (log && IsLogVerbose())
+ if (unwind_plan_sp->PlanValidAtAddress (m_current_pc))
{
- const char *has_fast = "";
- if (m_fast_unwind_plan)
- has_fast = ", and has a fast UnwindPlan";
- log->Printf("%*sFrame %u frame has a fast UnwindPlan",
- m_frame_number < 100 ? m_frame_number : 100, "", m_frame_number);
+ LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_UNWIND));
+ if (log && IsLogVerbose())
+ {
+ const char *has_fast = "";
+ if (m_fast_unwind_plan_sp)
+ has_fast = ", and has a fast UnwindPlan";
+ log->Printf("%*sFrame %u frame has a fast UnwindPlan",
+ m_frame_number < 100 ? m_frame_number : 100, "", m_frame_number);
+ }
+ m_frame_type = eNormalFrame;
+ return unwind_plan_sp;
+ }
+ else
+ {
+ unwind_plan_sp.reset();
}
- m_frame_type = eNormalFrame;
- return fu->GetUnwindPlanFastUnwind (m_thread);
}
-
- return NULL;
+ return unwind_plan_sp;
}
// On entry to this method,
@@ -512,37 +501,25 @@
// 3. m_current_pc should have the current pc value for this frame
// 4. m_current_offset_backed_up_one should have the current byte offset into the function, maybe backed up by 1, -1 if unknown
-UnwindPlan *
+UnwindPlanSP
RegisterContextLLDB::GetFullUnwindPlanForFrame ()
{
+ UnwindPlanSP unwind_plan_sp;
LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_UNWIND));
- UnwindPlan *up;
- UnwindPlan *arch_default_up = NULL;
- ArchSpec arch = m_thread.GetProcess().GetTarget().GetArchitecture ();
- ArchDefaultUnwindPlan *arch_default = ArchDefaultUnwindPlan::FindPlugin (arch);
- if (arch_default)
- {
- arch_default_up = arch_default->GetArchDefaultUnwindPlan (m_thread, m_current_pc);
- }
+ UnwindPlanSP arch_default_unwind_plan_sp;
+ const ArchSpec &arch = m_thread.GetProcess().GetTarget().GetArchitecture ();
+ ArchDefaultUnwindPlanSP arch_default_sp (ArchDefaultUnwindPlan::FindPlugin (arch));
+ if (arch_default_sp)
+ arch_default_unwind_plan_sp = arch_default_sp->GetArchDefaultUnwindPlan (m_thread, m_current_pc);
bool behaves_like_zeroth_frame = false;
- if (IsFrameZero ())
- {
- behaves_like_zeroth_frame = true;
- }
- if (!IsFrameZero () && ((RegisterContextLLDB*) m_next_frame.get())->m_frame_type == eSigtrampFrame)
+ if (IsFrameZero ()
+ || m_next_frame->m_frame_type == eSigtrampFrame
+ || m_next_frame->m_frame_type == eDebuggerFrame)
{
behaves_like_zeroth_frame = true;
- }
- if (!IsFrameZero () && ((RegisterContextLLDB*) m_next_frame.get())->m_frame_type == eDebuggerFrame)
- {
- behaves_like_zeroth_frame = true;
- }
-
- // If this frame behaves like a 0th frame (currently executing or interrupted asynchronously), all registers
- // can be retrieved.
- if (behaves_like_zeroth_frame)
- {
+ // If this frame behaves like a 0th frame (currently executing or
+ // interrupted asynchronously), all registers can be retrieved.
m_all_registers_available = true;
}
@@ -550,20 +527,20 @@
if (!m_current_pc.IsValid() || m_current_pc.GetModule() == NULL || m_current_pc.GetModule()->GetObjectFile() == NULL)
{
m_frame_type = eNormalFrame;
- return arch_default_up;
+ return arch_default_unwind_plan_sp;
}
- FuncUnwindersSP fu;
+ FuncUnwindersSP func_unwinders_sp;
if (m_sym_ctx_valid)
{
- fu = m_current_pc.GetModule()->GetObjectFile()->GetUnwindTable().GetFuncUnwindersContainingAddress (m_current_pc, m_sym_ctx);
+ func_unwinders_sp = m_current_pc.GetModule()->GetObjectFile()->GetUnwindTable().GetFuncUnwindersContainingAddress (m_current_pc, m_sym_ctx);
}
// No FuncUnwinders available for this pc, try using architectural default unwind.
- if (fu.get() == NULL)
+ if (!func_unwinders_sp)
{
m_frame_type = eNormalFrame;
- return arch_default_up;
+ return arch_default_unwind_plan_sp;
}
// If we're in _sigtramp(), unwinding past this frame requires special knowledge. On Mac OS X this knowledge
@@ -572,53 +549,54 @@
// how to unwind out of sigtramp.
if (m_frame_type == eSigtrampFrame)
{
- m_fast_unwind_plan = NULL;
- up = fu->GetUnwindPlanAtCallSite (m_current_offset_backed_up_one);
- if (up && up->PlanValidAtAddress (m_current_pc))
- {
- return up;
- }
+ m_fast_unwind_plan_sp.reset();
+ unwind_plan_sp = func_unwinders_sp->GetUnwindPlanAtCallSite (m_current_offset_backed_up_one);
+ if (unwind_plan_sp && unwind_plan_sp->PlanValidAtAddress (m_current_pc))
+ return unwind_plan_sp;
}
// Typically the NonCallSite UnwindPlan is the unwind created by inspecting the assembly language instructions
- up = fu->GetUnwindPlanAtNonCallSite (m_thread);
- if (behaves_like_zeroth_frame && up && up->PlanValidAtAddress (m_current_pc))
+ if (behaves_like_zeroth_frame)
{
- if (log && IsLogVerbose())
+ unwind_plan_sp = func_unwinders_sp->GetUnwindPlanAtNonCallSite (m_thread);
+ if (unwind_plan_sp && unwind_plan_sp->PlanValidAtAddress (m_current_pc))
{
- log->Printf("%*sFrame %u frame uses %s for full UnwindPlan",
- m_frame_number < 100 ? m_frame_number : 100, "", m_frame_number,
- up->GetSourceName().GetCString());
+ if (log && IsLogVerbose())
+ {
+ log->Printf("%*sFrame %u frame uses %s for full UnwindPlan",
+ m_frame_number < 100 ? m_frame_number : 100, "", m_frame_number,
+ unwind_plan_sp->GetSourceName().GetCString());
+ }
+ return unwind_plan_sp;
}
- return up;
}
// Typically this is unwind info from an eh_frame section intended for exception handling; only valid at call sites
- up = fu->GetUnwindPlanAtCallSite (m_current_offset_backed_up_one);
- if (up && up->PlanValidAtAddress (m_current_pc))
+ unwind_plan_sp = func_unwinders_sp->GetUnwindPlanAtCallSite (m_current_offset_backed_up_one);
+ if (unwind_plan_sp && unwind_plan_sp->PlanValidAtAddress (m_current_pc))
{
if (log && IsLogVerbose())
{
log->Printf("%*sFrame %u frame uses %s for full UnwindPlan",
m_frame_number < 100 ? m_frame_number : 100, "", m_frame_number,
- up->GetSourceName().GetCString());
+ unwind_plan_sp->GetSourceName().GetCString());
}
- return up;
+ return unwind_plan_sp;
}
// We'd prefer to use an UnwindPlan intended for call sites when we're at a call site but if we've
// struck out on that, fall back to using the non-call-site assembly inspection UnwindPlan if possible.
- up = fu->GetUnwindPlanAtNonCallSite (m_thread);
- if (up && up->PlanValidAtAddress (m_current_pc))
+ unwind_plan_sp = func_unwinders_sp->GetUnwindPlanAtNonCallSite (m_thread);
+ if (unwind_plan_sp && unwind_plan_sp->PlanValidAtAddress (m_current_pc))
{
if (log && IsLogVerbose())
{
log->Printf("%*sFrame %u frame uses %s for full UnwindPlan",
m_frame_number < 100 ? m_frame_number : 100, "", m_frame_number,
- up->GetSourceName().GetCString());
+ unwind_plan_sp->GetSourceName().GetCString());
}
- return up;
+ return unwind_plan_sp;
}
// If nothing else, use the architectural default UnwindPlan and hope that does the job.
@@ -626,9 +604,9 @@
{
log->Printf("%*sFrame %u frame uses %s for full UnwindPlan",
m_frame_number < 100 ? m_frame_number : 100, "", m_frame_number,
- arch_default_up->GetSourceName().GetCString());
+ arch_default_unwind_plan_sp->GetSourceName().GetCString());
}
- return arch_default_up;
+ return arch_default_unwind_plan_sp;
}
@@ -812,9 +790,9 @@
LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_UNWIND));
// Have we already found this register location?
- std::map<uint32_t, RegisterLocation>::const_iterator iterator;
- if (m_registers.size() > 0)
+ if (!m_registers.empty())
{
+ std::map<uint32_t, RegisterLocation>::const_iterator iterator;
iterator = m_registers.find (lldb_regnum);
if (iterator != m_registers.end())
{
@@ -843,10 +821,10 @@
bool have_unwindplan_regloc = false;
int unwindplan_registerkind = -1;
- if (m_fast_unwind_plan)
+ if (m_fast_unwind_plan_sp)
{
- const UnwindPlan::Row *active_row = m_fast_unwind_plan->GetRowForFunctionOffset (m_current_offset);
- unwindplan_registerkind = m_fast_unwind_plan->GetRegisterKind ();
+ const UnwindPlan::Row *active_row = m_fast_unwind_plan_sp->GetRowForFunctionOffset (m_current_offset);
+ unwindplan_registerkind = m_fast_unwind_plan_sp->GetRegisterKind ();
uint32_t row_regnum;
if (!m_thread.GetRegisterContext()->ConvertBetweenRegisterKinds (eRegisterKindLLDB, lldb_regnum, unwindplan_registerkind, row_regnum))
{
@@ -872,15 +850,14 @@
if (!have_unwindplan_regloc)
{
- // m_full_unwind_plan being NULL means that we haven't tried to find a full UnwindPlan yet
- if (m_full_unwind_plan == NULL)
- {
- m_full_unwind_plan = GetFullUnwindPlanForFrame ();
- }
- if (m_full_unwind_plan)
+ // m_full_unwind_plan_sp being NULL means that we haven't tried to find a full UnwindPlan yet
+ if (!m_full_unwind_plan_sp)
+ m_full_unwind_plan_sp = GetFullUnwindPlanForFrame ();
+
+ if (m_full_unwind_plan_sp)
{
- const UnwindPlan::Row *active_row = m_full_unwind_plan->GetRowForFunctionOffset (m_current_offset);
- unwindplan_registerkind = m_full_unwind_plan->GetRegisterKind ();
+ const UnwindPlan::Row *active_row = m_full_unwind_plan_sp->GetRowForFunctionOffset (m_current_offset);
+ unwindplan_registerkind = m_full_unwind_plan_sp->GetRegisterKind ();
uint32_t row_regnum;
if (!m_thread.GetRegisterContext()->ConvertBetweenRegisterKinds (eRegisterKindLLDB, lldb_regnum, unwindplan_registerkind, row_regnum))
{
@@ -905,7 +882,7 @@
{
log->Printf("%*sFrame %u supplying caller's saved reg %d's location using %s UnwindPlan",
m_frame_number < 100 ? m_frame_number : 100, "", m_frame_number,
- lldb_regnum, m_full_unwind_plan->GetSourceName().GetCString());
+ lldb_regnum, m_full_unwind_plan_sp->GetSourceName().GetCString());
}
}
}
@@ -915,7 +892,7 @@
{
// If a volatile register is being requested, we don't want to forward m_next_frame's register contents
// up the stack -- the register is not retrievable at this frame.
- ArchSpec arch = m_thread.GetProcess().GetTarget().GetArchitecture ();
+ const ArchSpec &arch = m_thread.GetProcess().GetTarget().GetArchitecture ();
ArchVolatileRegs *volatile_regs = ArchVolatileRegs::FindPlugin (arch);
if (volatile_regs && volatile_regs->RegisterIsVolatile (m_thread, lldb_regnum))
{
@@ -928,11 +905,7 @@
return false;
}
- if (!IsFrameZero ())
- {
- return ((RegisterContextLLDB*)m_next_frame.get())->SavedLocationForRegister (lldb_regnum, regloc);
- }
- else
+ if (IsFrameZero ())
{
// This is frame 0 - we should return the actual live register context value
RegisterLocation new_regloc;
@@ -942,6 +915,10 @@
regloc = new_regloc;
return true;
}
+ else
+ {
+ return m_next_frame->SavedLocationForRegister (lldb_regnum, regloc);
+ }
if (log)
{
log->Printf("%*sFrame %u could not supply caller's reg %d location",
@@ -968,11 +945,7 @@
if (unwindplan_regloc.IsSame())
{
- if (!IsFrameZero ())
- {
- return ((RegisterContextLLDB*)m_next_frame.get())->SavedLocationForRegister (lldb_regnum, regloc);
- }
- else
+ if (IsFrameZero ())
{
if (log)
{
@@ -982,6 +955,10 @@
}
return false;
}
+ else
+ {
+ return m_next_frame->SavedLocationForRegister (lldb_regnum, regloc);
+ }
}
if (unwindplan_regloc.IsCFAPlusOffset())
@@ -1116,14 +1093,11 @@
value = data.GetAddress (&offset);
return true;
}
- else
- {
- return false;
- }
+ return false;
}
RegisterLocation regloc;
- if (!((RegisterContextLLDB*)m_next_frame.get())->SavedLocationForRegister (lldb_regnum, regloc))
+ if (!m_next_frame->SavedLocationForRegister (lldb_regnum, regloc))
{
return false;
}
@@ -1166,7 +1140,7 @@
RegisterLocation regloc;
// Find out where the NEXT frame saved THIS frame's register contents
- if (!((RegisterContextLLDB*)m_next_frame.get())->SavedLocationForRegister (lldb_reg, regloc))
+ if (!m_next_frame->SavedLocationForRegister (lldb_reg, regloc))
return false;
return ReadRegisterBytesFromRegisterLocation (lldb_reg, regloc, data);
@@ -1200,7 +1174,7 @@
RegisterLocation regloc;
// Find out where the NEXT frame saved THIS frame's register contents
- if (!((RegisterContextLLDB*)m_next_frame.get())->SavedLocationForRegister (lldb_reg, regloc))
+ if (!m_next_frame->SavedLocationForRegister (lldb_reg, regloc))
return false;
return WriteRegisterBytesToRegisterLocation (lldb_reg, regloc, data, data_offset);
Modified: lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.h?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.h (original)
+++ lldb/trunk/source/Plugins/Process/Utility/RegisterContextLLDB.h Mon Feb 14 18:19:15 2011
@@ -20,8 +20,10 @@
class RegisterContextLLDB : public lldb_private::RegisterContext
{
public:
+ typedef lldb::SharedPtr<RegisterContextLLDB>::Type SharedPtr;
+
RegisterContextLLDB (lldb_private::Thread &thread,
- const lldb::RegisterContextSP& next_frame,
+ const SharedPtr& next_frame,
lldb_private::SymbolContext& sym_ctx,
uint32_t frame_number);
@@ -147,22 +149,23 @@
bool
ReadGPRValue (int register_kind, uint32_t regnum, lldb::addr_t &value);
- lldb_private::UnwindPlan *
+ lldb::UnwindPlanSP
GetFastUnwindPlanForFrame ();
- lldb_private::UnwindPlan *
+ lldb::UnwindPlanSP
GetFullUnwindPlanForFrame ();
lldb_private::Thread& m_thread;
- lldb::RegisterContextSP m_next_frame;
+
+ SharedPtr m_next_frame;
///
// The following tell us how to retrieve the CALLER's register values (ie the "previous" frame, aka the frame above)
// i.e. where THIS frame saved them
///
- lldb_private::UnwindPlan *m_fast_unwind_plan; // may be NULL
- lldb_private::UnwindPlan *m_full_unwind_plan;
+ lldb::UnwindPlanSP m_fast_unwind_plan_sp; // may be NULL
+ lldb::UnwindPlanSP m_full_unwind_plan_sp;
bool m_all_registers_available; // Can we retrieve all regs or just nonvolatile regs?
int m_frame_type; // enum FrameType
Modified: lldb/trunk/source/Plugins/Process/Utility/UnwindLLDB.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/UnwindLLDB.cpp?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/UnwindLLDB.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Utility/UnwindLLDB.cpp Mon Feb 14 18:19:15 2011
@@ -15,10 +15,12 @@
#include "lldb/Symbol/FuncUnwinders.h"
#include "lldb/Symbol/Function.h"
#include "lldb/Utility/ArchDefaultUnwindPlan.h"
-#include "UnwindLLDB.h"
#include "lldb/Symbol/UnwindPlan.h"
#include "lldb/Core/Log.h"
+#include "UnwindLLDB.h"
+#include "RegisterContextLLDB.h"
+
using namespace lldb;
using namespace lldb_private;
@@ -65,8 +67,10 @@
{
// First, set up the 0th (initial) frame
CursorSP first_cursor_sp(new Cursor ());
- RegisterContextSP no_frame;
- std::auto_ptr<RegisterContextLLDB> first_register_ctx_ap (new RegisterContextLLDB(m_thread, no_frame, first_cursor_sp->sctx, 0));
+ std::auto_ptr<RegisterContextLLDB> first_register_ctx_ap (new RegisterContextLLDB (m_thread,
+ RegisterContextLLDB::SharedPtr(),
+ first_cursor_sp->sctx,
+ 0));
if (first_register_ctx_ap.get() == NULL)
return false;
@@ -150,8 +154,8 @@
return false;
}
}
- RegisterContextSP register_ctx_sp(register_ctx_ap.release());
- cursor_sp->reg_ctx = register_ctx_sp;
+ RegisterContextLLDB::SharedPtr reg_ctx_sp(register_ctx_ap.release());
+ cursor_sp->reg_ctx = reg_ctx_sp;
m_frames.push_back (cursor_sp);
return true;
}
Modified: lldb/trunk/source/Plugins/Process/Utility/UnwindLLDB.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Utility/UnwindLLDB.h?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Utility/UnwindLLDB.h (original)
+++ lldb/trunk/source/Plugins/Process/Utility/UnwindLLDB.h Mon Feb 14 18:19:15 2011
@@ -10,15 +10,15 @@
#ifndef lldb_UnwindLLDB_h_
#define lldb_UnwindLLDB_h_
-#include "lldb/lldb-private.h"
-#include "lldb/lldb-types.h"
-#include "lldb/Target/Unwind.h"
+#include <vector>
+
+#include "lldb/lldb-include.h"
#include "lldb/Symbol/FuncUnwinders.h"
#include "lldb/Symbol/UnwindPlan.h"
-#include "RegisterContextLLDB.h"
#include "lldb/Target/RegisterContext.h"
-#include <vector>
+#include "lldb/Target/Unwind.h"
+#include "RegisterContextLLDB.h"
namespace lldb_private {
@@ -53,7 +53,7 @@
lldb::addr_t start_pc; // The start address of the function/symbol for this frame - current pc if unknown
lldb::addr_t cfa; // The canonical frame address for this stack frame
lldb_private::SymbolContext sctx; // A symbol context we'll contribute to & provide to the StackFrame creation
- lldb::RegisterContextSP reg_ctx; // These are all RegisterContextLLDB's
+ RegisterContextLLDB::SharedPtr reg_ctx; // These are all RegisterContextLLDB's
Cursor () : start_pc (LLDB_INVALID_ADDRESS), cfa (LLDB_INVALID_ADDRESS), sctx(), reg_ctx() { }
private:
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.cpp Mon Feb 14 18:19:15 2011
@@ -178,11 +178,12 @@
return false;
}
-void
+bool
GDBRemoteRegisterContext::PrivateSetRegisterValue (uint32_t reg, StringExtractor &response)
{
const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg);
- assert (reg_info);
+ if (reg_info == NULL)
+ return false;
// Invalidate if needed
InvalidateIfNeeded(false);
@@ -200,6 +201,7 @@
// leave it as it was.
m_reg_valid[reg] = false;
}
+ return success;
}
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/GDBRemoteRegisterContext.h Mon Feb 14 18:19:15 2011
@@ -228,7 +228,7 @@
protected:
friend class ThreadGDBRemote;
- void
+ bool
PrivateSetRegisterValue (uint32_t reg, StringExtractor &response);
void
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ProcessGDBRemote.cpp Mon Feb 14 18:19:15 2011
@@ -642,7 +642,6 @@
StreamString strm;
- ;
// See if the GDB server supports the qHostInfo information
const char *vendor = m_gdb_comm.GetVendorString().AsCString();
const char *os_type = m_gdb_comm.GetOSString().AsCString();
@@ -1176,6 +1175,18 @@
case 'T':
case 'S':
{
+ if (GetStopID() == 0)
+ {
+ // Our first stop, make sure we have a process ID, and also make
+ // sure we know about our registers
+ if (GetID() == LLDB_INVALID_PROCESS_ID)
+ {
+ lldb::pid_t pid = m_gdb_comm.GetCurrentProcessID (1);
+ if (pid != LLDB_INVALID_PROCESS_ID)
+ SetID (pid);
+ }
+ BuildDynamicRegisterInfo (true);
+ }
// Stop with signal and thread info
const uint8_t signo = stop_packet.GetHexU8();
std::string name;
@@ -1209,7 +1220,14 @@
{
// thread in big endian hex
tid = Args::StringToUInt32 (value.c_str(), 0, 16);
+ Mutex::Locker locker (m_thread_list.GetMutex ());
thread_sp = m_thread_list.FindThreadByID(tid, false);
+ if (!thread_sp)
+ {
+ // Create the thread if we need to
+ thread_sp.reset (new ThreadGDBRemote (*this, tid));
+ m_thread_list.AddThread(thread_sp);
+ }
}
else if (name.compare("hexname") == 0)
{
@@ -1242,7 +1260,15 @@
StringExtractor reg_value_extractor;
// Swap "value" over into "reg_value_extractor"
reg_value_extractor.GetStringRef().swap(value);
- static_cast<ThreadGDBRemote *> (thread_sp.get())->PrivateSetRegisterValue (reg, reg_value_extractor);
+ if (!static_cast<ThreadGDBRemote *> (thread_sp.get())->PrivateSetRegisterValue (reg, reg_value_extractor))
+ {
+ Host::SetCrashDescriptionWithFormat("Setting thread register '%s' (decoded to %u (0x%x)) with value '%s' for stop packet: '%s'",
+ name.c_str(),
+ reg,
+ reg,
+ reg_value_extractor.GetStringRef().c_str(),
+ stop_packet.GetStringRef().c_str());
+ }
}
}
}
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.cpp Mon Feb 14 18:19:15 2011
@@ -26,7 +26,7 @@
#include "Plugins/Process/Utility/UnwindLLDB.h"
#include "Utility/StringExtractorGDBRemote.h"
-#ifdef __APPLE__
+#if defined(__APPLE__)
#include "UnwindMacOSXFrameBackchain.h"
#endif
@@ -98,6 +98,7 @@
{
case eStateSuspended:
case eStateStopped:
+ // Don't append anything for threads that should stay stopped.
break;
case eStateRunning:
@@ -145,7 +146,7 @@
{
m_unwinder_ap.reset (new UnwindLLDB (*this));
}
-#ifdef __APPLE__
+#if defined(__APPLE__)
else
{
m_unwinder_ap.reset (new UnwindMacOSXFrameBackchain (*this));
@@ -207,12 +208,12 @@
return reg_ctx_sp;
}
-void
+bool
ThreadGDBRemote::PrivateSetRegisterValue (uint32_t reg, StringExtractor &response)
{
GDBRemoteRegisterContext *gdb_reg_ctx = static_cast<GDBRemoteRegisterContext *>(GetRegisterContext ().get());
assert (gdb_reg_ctx);
- gdb_reg_ctx->PrivateSetRegisterValue (reg, response);
+ return gdb_reg_ctx->PrivateSetRegisterValue (reg, response);
}
bool
Modified: lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.h?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.h (original)
+++ lldb/trunk/source/Plugins/Process/gdb-remote/ThreadGDBRemote.h Mon Feb 14 18:19:15 2011
@@ -105,7 +105,7 @@
virtual bool
RestoreSaveFrameZero (const RegisterCheckpoint &checkpoint);
- void
+ bool
PrivateSetRegisterValue (uint32_t reg,
StringExtractor &response);
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp Mon Feb 14 18:19:15 2011
@@ -197,6 +197,14 @@
return g_dwarf_section_name;
}
+UniqueDWARFASTTypeMap &
+SymbolFileDWARF::GetUniqueDWARFASTTypeMap ()
+{
+ if (m_debug_map_symfile)
+ return m_debug_map_symfile->GetUniqueDWARFASTTypeMap ();
+ return m_unique_ast_type_map;
+}
+
ClangASTContext &
SymbolFileDWARF::GetClangASTContext ()
{
@@ -3172,10 +3180,10 @@
UniqueDWARFASTType unique_ast_entry;
if (decl.IsValid())
{
- if (m_unique_ast_type_map.Find (type_name_const_str,
- die,
- decl,
- unique_ast_entry))
+ if (GetUniqueDWARFASTTypeMap().Find (type_name_const_str,
+ die,
+ decl,
+ unique_ast_entry))
{
// We have already parsed this type or from another
// compile unit. GCC loves to use the "one definition
@@ -3273,8 +3281,8 @@
unique_ast_entry.m_type_sp = type_sp;
unique_ast_entry.m_die = die;
unique_ast_entry.m_declaration = decl;
- m_unique_ast_type_map.Insert (type_name_const_str,
- unique_ast_entry);
+ GetUniqueDWARFASTTypeMap().Insert (type_name_const_str,
+ unique_ast_entry);
if (die->HasChildren() == false && is_forward_declaration == false)
{
@@ -3824,14 +3832,6 @@
type_sp->SetSymbolContextScope(symbol_context_scope);
}
-// if (udt_sp.get())
-// {
-// if (is_forward_declaration)
-// udt_sp->GetFlags().Set(UserDefType::flagIsForwardDefinition);
-// type_sp->SetUserDefinedType(udt_sp);
-// }
-
- //printf ("Adding type to map: 0x%8.8x for %s\n", die->GetOffset(), type_sp->GetName().GetCString());
// We are ready to put this type into the uniqued list up at the module level
type_list->Insert (type_sp);
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h Mon Feb 14 18:19:15 2011
@@ -321,6 +321,9 @@
clang::NamespaceDecl *
ResolveNamespaceDIE (DWARFCompileUnit *curr_cu, const DWARFDebugInfoEntry *die);
+ UniqueDWARFASTTypeMap &
+ GetUniqueDWARFASTTypeMap ();
+
SymbolFileDWARFDebugMap * m_debug_map_symfile;
clang::TranslationUnitDecl * m_clang_tu_decl;
lldb_private::Flags m_flags;
Modified: lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h Mon Feb 14 18:19:15 2011
@@ -15,6 +15,8 @@
#include <bitset>
#include "lldb/Symbol/SymbolFile.h"
+#include "UniqueDWARFASTType.h"
+
class SymbolFileDWARF;
class DWARFCompileUnit;
class DWARFDebugInfoEntry;
@@ -211,6 +213,11 @@
const DWARFDebugInfoEntry *die,
const lldb_private::ConstString &type_name);
+ UniqueDWARFASTTypeMap &
+ GetUniqueDWARFASTTypeMap ()
+ {
+ return m_unique_ast_type_map;
+ }
//------------------------------------------------------------------
// Member Variables
//------------------------------------------------------------------
@@ -218,6 +225,7 @@
std::vector<CompileUnitInfo> m_compile_unit_infos;
std::vector<uint32_t> m_func_indexes; // Sorted by address
std::vector<uint32_t> m_glob_indexes;
+ UniqueDWARFASTTypeMap m_unique_ast_type_map;
};
#endif // #ifndef liblldb_SymbolFileDWARFDebugMap_h_
Modified: lldb/trunk/source/Symbol/FuncUnwinders.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Symbol/FuncUnwinders.cpp?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/source/Symbol/FuncUnwinders.cpp (original)
+++ lldb/trunk/source/Symbol/FuncUnwinders.cpp Mon Feb 14 18:19:15 2011
@@ -34,10 +34,10 @@
m_assembly_profiler(assembly_profiler),
m_range(range),
m_mutex (Mutex::eMutexTypeNormal),
- m_unwind_at_call_site_ap (),
- m_unwind_at_non_call_site_ap (),
- m_unwind_fast_ap (),
- m_unwind_arch_default (NULL),
+ m_unwind_plan_call_site_sp (),
+ m_unwind_plan_non_call_site_sp (),
+ m_unwind_plan_fast_sp (),
+ m_unwind_plan_arch_default_sp (),
m_tried_unwind_at_call_site (false),
m_tried_unwind_at_non_call_site (false),
m_tried_unwind_fast (false),
@@ -50,15 +50,15 @@
{
}
-UnwindPlan*
+UnwindPlanSP
FuncUnwinders::GetUnwindPlanAtCallSite (int current_offset)
{
// Lock the mutex to ensure we can always give out the most appropriate
// information. We want to make sure if someone requests a call site unwind
// plan, that they get one and don't run into a race condition where one
// thread has started to create the unwind plan and has put it into
- // m_unwind_at_call_site_ap, and have another thread enter this function
- // and return the partially filled in m_unwind_at_call_site_ap pointer.
+ // m_unwind_plan_call_site_sp, and have another thread enter this function
+ // and return the partially filled in m_unwind_plan_call_site_sp pointer.
// We also want to make sure that we lock out other unwind plans from
// being accessed until this one is done creating itself in case someone
// had some code like:
@@ -66,7 +66,7 @@
// if (best_unwind_plan == NULL)
// best_unwind_plan = GetUnwindPlanAtNonCallSite (...)
Mutex::Locker locker (m_mutex);
- if (m_tried_unwind_at_call_site == false && m_unwind_at_call_site_ap.get() == NULL)
+ if (m_tried_unwind_at_call_site == false && m_unwind_plan_call_site_sp.get() == NULL)
{
m_tried_unwind_at_call_site = true;
// We have cases (e.g. with _sigtramp on Mac OS X) where the hand-written eh_frame unwind info for a
@@ -84,16 +84,16 @@
DWARFCallFrameInfo *eh_frame = m_unwind_table.GetEHFrameInfo();
if (eh_frame)
{
- m_unwind_at_call_site_ap.reset (new UnwindPlan);
- if (!eh_frame->GetUnwindPlan (current_pc, *m_unwind_at_call_site_ap))
- m_unwind_at_call_site_ap.reset();
+ m_unwind_plan_call_site_sp.reset (new UnwindPlan);
+ if (!eh_frame->GetUnwindPlan (current_pc, *m_unwind_plan_call_site_sp))
+ m_unwind_plan_call_site_sp.reset();
}
}
}
- return m_unwind_at_call_site_ap.get();
+ return m_unwind_plan_call_site_sp;
}
-UnwindPlan*
+UnwindPlanSP
FuncUnwinders::GetUnwindPlanAtNonCallSite (Thread& thread)
{
// Lock the mutex to ensure we can always give out the most appropriate
@@ -109,17 +109,17 @@
// if (best_unwind_plan == NULL)
// best_unwind_plan = GetUnwindPlanAtNonCallSite (...)
Mutex::Locker locker (m_mutex);
- if (m_tried_unwind_at_non_call_site == false && m_unwind_at_non_call_site_ap.get() == NULL)
+ if (m_tried_unwind_at_non_call_site == false && m_unwind_plan_non_call_site_sp.get() == NULL)
{
m_tried_unwind_at_non_call_site = true;
- m_unwind_at_non_call_site_ap.reset (new UnwindPlan);
- if (!m_assembly_profiler->GetNonCallSiteUnwindPlanFromAssembly (m_range, thread, *m_unwind_at_non_call_site_ap))
- m_unwind_at_non_call_site_ap.reset();
+ m_unwind_plan_non_call_site_sp.reset (new UnwindPlan);
+ if (!m_assembly_profiler->GetNonCallSiteUnwindPlanFromAssembly (m_range, thread, *m_unwind_plan_non_call_site_sp))
+ m_unwind_plan_non_call_site_sp.reset();
}
- return m_unwind_at_non_call_site_ap.get();
+ return m_unwind_plan_non_call_site_sp;
}
-UnwindPlan*
+UnwindPlanSP
FuncUnwinders::GetUnwindPlanFastUnwind (Thread& thread)
{
// Lock the mutex to ensure we can always give out the most appropriate
@@ -135,17 +135,17 @@
// if (best_unwind_plan == NULL)
// best_unwind_plan = GetUnwindPlanAtNonCallSite (...)
Mutex::Locker locker (m_mutex);
- if (m_tried_unwind_fast == false && m_unwind_fast_ap.get() == NULL)
+ if (m_tried_unwind_fast == false && m_unwind_plan_fast_sp.get() == NULL)
{
m_tried_unwind_fast = true;
- m_unwind_fast_ap.reset (new UnwindPlan);
- if (!m_assembly_profiler->GetFastUnwindPlan (m_range, thread, *m_unwind_fast_ap))
- m_unwind_fast_ap.reset();
+ m_unwind_plan_fast_sp.reset (new UnwindPlan);
+ if (!m_assembly_profiler->GetFastUnwindPlan (m_range, thread, *m_unwind_plan_fast_sp))
+ m_unwind_plan_fast_sp.reset();
}
- return m_unwind_fast_ap.get();
+ return m_unwind_plan_fast_sp;
}
-UnwindPlan*
+UnwindPlanSP
FuncUnwinders::GetUnwindPlanArchitectureDefault (Thread& thread)
{
// Lock the mutex to ensure we can always give out the most appropriate
@@ -161,21 +161,20 @@
// if (best_unwind_plan == NULL)
// best_unwind_plan = GetUnwindPlanAtNonCallSite (...)
Mutex::Locker locker (m_mutex);
- if (m_tried_unwind_arch_default == false && m_unwind_arch_default == NULL)
+ if (m_tried_unwind_arch_default == false && m_unwind_plan_arch_default_sp.get() == NULL)
{
m_tried_unwind_arch_default = true;
Address current_pc;
Target *target = thread.CalculateTarget();
if (target)
{
- ArchSpec arch = target->GetArchitecture ();
- ArchDefaultUnwindPlan *arch_default = ArchDefaultUnwindPlan::FindPlugin (arch);
- if (arch_default)
- m_unwind_arch_default = arch_default->GetArchDefaultUnwindPlan (thread, current_pc);
+ ArchDefaultUnwindPlanSP arch_default_sp (ArchDefaultUnwindPlan::FindPlugin (target->GetArchitecture ()));
+ if (arch_default_sp)
+ m_unwind_plan_arch_default_sp = arch_default_sp->GetArchDefaultUnwindPlan (thread, current_pc);
}
}
- return m_unwind_arch_default;
+ return m_unwind_plan_arch_default_sp;
}
Address&
Modified: lldb/trunk/source/Utility/ArchDefaultUnwindPlan.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Utility/ArchDefaultUnwindPlan.cpp?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/source/Utility/ArchDefaultUnwindPlan.cpp (original)
+++ lldb/trunk/source/Utility/ArchDefaultUnwindPlan.cpp Mon Feb 14 18:19:15 2011
@@ -7,28 +7,42 @@
//
//===----------------------------------------------------------------------===//
-#include "lldb/lldb-private.h"
#include "lldb/Core/PluginManager.h"
+
+#include <map>
+
+#include "lldb/Core/ArchSpec.h"
#include "lldb/Core/PluginInterface.h"
+#include "lldb/Host/Mutex.h"
#include "lldb/Utility/ArchDefaultUnwindPlan.h"
using namespace lldb;
using namespace lldb_private;
-ArchDefaultUnwindPlan*
+ArchDefaultUnwindPlanSP
ArchDefaultUnwindPlan::FindPlugin (const ArchSpec &arch)
{
ArchDefaultUnwindPlanCreateInstance create_callback;
+ typedef std::map <const ArchSpec, ArchDefaultUnwindPlanSP> ArchDefaultUnwindPlanMap;
+ static ArchDefaultUnwindPlanMap g_plugin_map;
+ static Mutex g_plugin_map_mutex (Mutex::eMutexTypeRecursive);
+ Mutex::Locker locker (g_plugin_map_mutex);
+ ArchDefaultUnwindPlanMap::iterator pos = g_plugin_map.find (arch);
+ if (pos != g_plugin_map.end())
+ return pos->second;
for (uint32_t idx = 0;
(create_callback = PluginManager::GetArchDefaultUnwindPlanCreateCallbackAtIndex(idx)) != NULL;
++idx)
{
- std::auto_ptr<ArchDefaultUnwindPlan> default_unwind_plan_ap (create_callback (arch));
- if (default_unwind_plan_ap.get ())
- return default_unwind_plan_ap.release ();
+ ArchDefaultUnwindPlanSP default_unwind_plan_sp (create_callback (arch));
+ if (default_unwind_plan_sp)
+ {
+ g_plugin_map[arch] = default_unwind_plan_sp;
+ return default_unwind_plan_sp;
+ }
}
- return NULL;
+ return ArchDefaultUnwindPlanSP();
}
ArchDefaultUnwindPlan::ArchDefaultUnwindPlan ()
Modified: lldb/trunk/source/lldb.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/lldb.cpp?rev=125541&r1=125540&r2=125541&view=diff
==============================================================================
--- lldb/trunk/source/lldb.cpp (original)
+++ lldb/trunk/source/lldb.cpp Mon Feb 14 18:19:15 2011
@@ -76,7 +76,8 @@
SymbolFileDWARF::Initialize();
SymbolFileSymtab::Initialize();
UnwindAssemblyProfiler_x86::Initialize();
- ArchDefaultUnwindPlan_x86::Initialize();
+ ArchDefaultUnwindPlan_x86_64::Initialize();
+ ArchDefaultUnwindPlan_i386::Initialize();
ArchVolatileRegs_x86::Initialize();
ScriptInterpreter::Initialize ();
@@ -123,7 +124,8 @@
SymbolFileDWARF::Terminate();
SymbolFileSymtab::Terminate();
UnwindAssemblyProfiler_x86::Terminate();
- ArchDefaultUnwindPlan_x86::Terminate();
+ ArchDefaultUnwindPlan_i386::Terminate();
+ ArchDefaultUnwindPlan_x86_64::Terminate();
ArchVolatileRegs_x86::Terminate();
ScriptInterpreter::Terminate ();
More information about the lldb-commits
mailing list