diff options
author | Chris Lattner <sabre@nondot.org> | 2010-06-08 16:52:24 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-06-08 16:52:24 +0000 |
commit | 30fdc8d841c9d24ac5f3d452b6ece84ee0ac991c (patch) | |
tree | f70013106f6a461a14abcd71c65f48a95a2979a6 /lldb/source/Target/ThreadPlanRunToAddress.cpp | |
parent | 312c4c799da215b337f790fda330f70c4aa757cf (diff) | |
download | bcm5719-llvm-30fdc8d841c9d24ac5f3d452b6ece84ee0ac991c.tar.gz bcm5719-llvm-30fdc8d841c9d24ac5f3d452b6ece84ee0ac991c.zip |
Initial checkin of lldb code from internal Apple repo.
llvm-svn: 105619
Diffstat (limited to 'lldb/source/Target/ThreadPlanRunToAddress.cpp')
-rw-r--r-- | lldb/source/Target/ThreadPlanRunToAddress.cpp | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/lldb/source/Target/ThreadPlanRunToAddress.cpp b/lldb/source/Target/ThreadPlanRunToAddress.cpp new file mode 100644 index 00000000000..0544ea5bcbe --- /dev/null +++ b/lldb/source/Target/ThreadPlanRunToAddress.cpp @@ -0,0 +1,176 @@ +//===-- ThreadPlanRunToAddress.cpp ------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Target/ThreadPlanRunToAddress.h" + +// C Includes +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/lldb-private-log.h" +#include "lldb/Core/Log.h" +#include "lldb/Core/Stream.h" +#include "lldb/Target/Target.h" +#include "lldb/Target/Process.h" +#include "lldb/Target/Thread.h" +#include "lldb/Target/RegisterContext.h" + +using namespace lldb; +using namespace lldb_private; + +//---------------------------------------------------------------------- +// ThreadPlanRunToAddress: Continue plan +//---------------------------------------------------------------------- + +ThreadPlanRunToAddress::ThreadPlanRunToAddress +( + Thread &thread, + Address &address, + bool stop_others +) : + ThreadPlan ("Run to breakpoint plan", thread, eVoteNoOpinion, eVoteNoOpinion), + m_stop_others (stop_others), + m_address (LLDB_INVALID_ADDRESS), + m_break_id (LLDB_INVALID_BREAK_ID) +{ + m_address = address.GetLoadAddress(&m_thread.GetProcess()); + SetInitialBreakpoint(); +} + +ThreadPlanRunToAddress::ThreadPlanRunToAddress +( + Thread &thread, + lldb::addr_t address, + bool stop_others +) : + ThreadPlan ("Run to breakpoint plan", thread, eVoteNoOpinion, eVoteNoOpinion), + m_stop_others (stop_others), + m_address (address), + m_break_id (LLDB_INVALID_BREAK_ID) +{ + SetInitialBreakpoint(); +} + +void +ThreadPlanRunToAddress::SetInitialBreakpoint () +{ + Breakpoint *breakpoint; + breakpoint = m_thread.GetProcess().GetTarget().CreateBreakpoint (m_address, true).get(); + if (breakpoint != NULL) + { + m_break_id = breakpoint->GetID(); + breakpoint->SetThreadID(m_thread.GetID()); + } +} + +ThreadPlanRunToAddress::~ThreadPlanRunToAddress () +{ + if (m_break_id != LLDB_INVALID_BREAK_ID) + { + m_thread.GetProcess().GetTarget().RemoveBreakpointByID (m_break_id); + } +} + +void +ThreadPlanRunToAddress::GetDescription (Stream *s, lldb::DescriptionLevel level) +{ + if (level == lldb::eDescriptionLevelBrief) + { + s->Printf ("run to address: "); + s->Address (m_address, sizeof (addr_t)); + } + else + { + s->Printf ("Run to address: "); + s->Address(m_address, sizeof (addr_t)); + s->Printf (" using breakpoint: %d - ", m_break_id); + Breakpoint *breakpoint = m_thread.GetProcess().GetTarget().GetBreakpointByID (m_break_id).get(); + if (breakpoint) + breakpoint->Dump (s); + else + s->Printf ("but the breakpoint has been deleted."); + } +} + +bool +ThreadPlanRunToAddress::ValidatePlan (Stream *error) +{ + // If we couldn't set the breakpoint for some reason, then this won't + // work. + if(m_break_id == LLDB_INVALID_BREAK_ID) + return false; + else + return true; +} + +bool +ThreadPlanRunToAddress::PlanExplainsStop () +{ + return AtOurAddress(); +} + +bool +ThreadPlanRunToAddress::ShouldStop (Event *event_ptr) +{ + return false; +} + +bool +ThreadPlanRunToAddress::StopOthers () +{ + return m_stop_others; +} + +void +ThreadPlanRunToAddress::SetStopOthers (bool new_value) +{ + m_stop_others = new_value; +} + +StateType +ThreadPlanRunToAddress::RunState () +{ + return eStateRunning; +} + +bool +ThreadPlanRunToAddress::WillStop () +{ + return true; +} + +bool +ThreadPlanRunToAddress::MischiefManaged () +{ + Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP); + + if (AtOurAddress()) + { + // Remove the breakpoint + if (m_break_id != LLDB_INVALID_BREAK_ID) + { + m_thread.GetProcess().GetTarget().RemoveBreakpointByID (m_break_id); + m_break_id = LLDB_INVALID_BREAK_ID; + } + + if (log) + log->Printf("Completed run to address plan."); + ThreadPlan::MischiefManaged (); + return true; + } + else + return false; +} + +bool +ThreadPlanRunToAddress::AtOurAddress () +{ + lldb::addr_t current_address = m_thread.GetRegisterContext()->GetPC(); + return m_address == current_address; +} |