ThreadPlanCallFunction.cpp revision f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ThreadPlanCallFunction.cpp ------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanCallFunction.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanRunToAddress.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ThreadPlanCallFunction: Plan to call a single function 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::ThreadPlanCallFunction (Thread &thread, 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address &function, 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t arg, 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads, 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool discard_on_error) : 385a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham ThreadPlan (ThreadPlan::eKindCallFunction, "Call function plan", thread, eVoteNoOpinion, eVoteNoOpinion), 3936a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_valid (false), 4036a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_stop_other_threads (stop_other_threads), 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_arg_addr (arg), 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_args (NULL), 4336a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_process (thread.GetProcess()), 4436a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_thread (thread) 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetOkayToDiscard (discard_on_error); 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process& process = thread.GetProcess(); 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Target& target = process.GetTarget(); 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ABI *abi = process.GetABI(); 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!abi) 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t spBelowRedZone = thread.GetRegisterContext()->GetSP() - abi->GetRedZoneSize(); 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContextList contexts; 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext context; 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ModuleSP executableModuleSP (target.GetExecutableModule()); 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!executableModuleSP || 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner !executableModuleSP->FindSymbolsWithNameAndType(ConstString ("start"), eSymbolTypeCode, contexts)) 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner contexts.GetContextAtIndex(0, context); 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_start_addr = context.symbol->GetValue(); 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t StartLoadAddr = m_start_addr.GetLoadAddress(&process); 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!thread.SaveFrameZeroState(m_register_backup)) 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_function_addr = function; 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t FunctionLoadAddr = m_function_addr.GetLoadAddress(&process); 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!abi->PrepareTrivialCall(thread, 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner spBelowRedZone, 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FunctionLoadAddr, 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StartLoadAddr, 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_arg_addr)) 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_valid = true; 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::ThreadPlanCallFunction (Thread &thread, 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address &function, 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueList &args, 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads, 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool discard_on_error) : 925a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham ThreadPlan (ThreadPlan::eKindCallFunction, "Call function plan", thread, eVoteNoOpinion, eVoteNoOpinion), 9336a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_valid (false), 9436a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_stop_other_threads (stop_other_threads), 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_arg_addr (0), 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_args (&args), 9736a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_process (thread.GetProcess()), 9836a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_thread (thread) 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetOkayToDiscard (discard_on_error); 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process& process = thread.GetProcess(); 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Target& target = process.GetTarget(); 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ABI *abi = process.GetABI(); 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if(!abi) 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t spBelowRedZone = thread.GetRegisterContext()->GetSP() - abi->GetRedZoneSize(); 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContextList contexts; 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext context; 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ModuleSP executableModuleSP (target.GetExecutableModule()); 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!executableModuleSP || 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner !executableModuleSP->FindSymbolsWithNameAndType(ConstString ("start"), eSymbolTypeCode, contexts)) 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner contexts.GetContextAtIndex(0, context); 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_start_addr = context.symbol->GetValue(); 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t StartLoadAddr = m_start_addr.GetLoadAddress(&process); 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if(!thread.SaveFrameZeroState(m_register_backup)) 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_function_addr = function; 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t FunctionLoadAddr = m_function_addr.GetLoadAddress(&process); 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!abi->PrepareNormalCall(thread, 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner spBelowRedZone, 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FunctionLoadAddr, 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StartLoadAddr, 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *m_args)) 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_valid = true; 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::~ThreadPlanCallFunction () 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::GetDescription (Stream *s, lldb::DescriptionLevel level) 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (level == lldb::eDescriptionLevelBrief) 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("Function call thread plan"); 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_args) 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("Thread plan to call 0x%llx with parsed arguments", m_function_addr.GetLoadAddress(&m_process), m_arg_addr); 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("Thread plan to call 0x%llx void * argument at: 0x%llx", m_function_addr.GetLoadAddress(&m_process), m_arg_addr); 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::ValidatePlan (Stream *error) 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_valid) 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::PlanExplainsStop () 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_subplan_sp) 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_subplan_sp->PlanExplainsStop(); 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::ShouldStop (Event *event_ptr) 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (PlanExplainsStop()) 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 184f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP); 185f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 186f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan if (log) 187f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan { 188f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan RegisterContext *reg_ctx = m_thread.GetRegisterContext(); 189f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 190f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan log->PutCString("Function completed. Register state was:"); 191f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 192f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan for (uint32_t register_index = 0, num_registers = reg_ctx->GetRegisterCount(); 193f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan register_index < num_registers; 194f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan ++register_index) 195f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan { 196f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan const char *register_name = reg_ctx->GetRegisterName(register_index); 197f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan uint64_t register_value = reg_ctx->ReadRegisterAsUnsigned(register_index, LLDB_INVALID_ADDRESS); 198f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 199f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan log->Printf(" %s = 0x%llx", register_name, register_value); 200f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan } 201f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan } 202f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread.RestoreSaveFrameZero(m_register_backup); 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread.ClearStackFrames(); 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetPlanComplete(); 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::StopOthers () 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_stop_other_threads; 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::SetStopOthers (bool new_value) 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_subplan_sp) 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadPlanRunToAddress *address_plan = static_cast<ThreadPlanRunToAddress *>(m_subplan_sp.get()); 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner address_plan->SetStopOthers(new_value); 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stop_other_threads = new_value; 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::RunState () 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return eStateRunning; 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::DidPush () 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_subplan_sp.reset(new ThreadPlanRunToAddress(m_thread, m_start_addr, m_stop_other_threads)); 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread.QueueThreadPlan(m_subplan_sp, false); 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::WillStop () 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::MischiefManaged () 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsPlanComplete()) 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP); 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Completed call function plan."); 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadPlan::MischiefManaged (); 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 270