ThreadPlanCallFunction.cpp revision e005f2ce03c489ebde9110678a29cbfe8488d5b4
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 1507f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan#include "llvm/Support/MachO.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h" 18988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham#include "lldb/Breakpoint/Breakpoint.h" 19988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham#include "lldb/Breakpoint/BreakpointLocation.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h" 2329756d452be39535ded2cff50d9db4df46fe6400Sean Callanan#include "lldb/Target/LanguageRuntime.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h" 26988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham#include "lldb/Target/StopInfo.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h" 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanRunToAddress.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ThreadPlanCallFunction: Plan to call a single function 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::ThreadPlanCallFunction (Thread &thread, 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address &function, 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t arg, 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads, 423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan bool discard_on_error, 433c9c5eb466869ede185e879d14a47335fb43194dSean Callanan lldb::addr_t *this_arg) : 445a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham ThreadPlan (ThreadPlan::eKindCallFunction, "Call function plan", thread, eVoteNoOpinion, eVoteNoOpinion), 4536a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_valid (false), 4636a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_stop_other_threads (stop_other_threads), 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_arg_addr (arg), 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_args (NULL), 4936a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_process (thread.GetProcess()), 5036a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_thread (thread) 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetOkayToDiscard (discard_on_error); 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process& process = thread.GetProcess(); 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Target& target = process.GetTarget(); 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ABI *abi = process.GetABI(); 5707f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!abi) 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 6007f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 6107f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan SetBreakpoints(); 6207f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t spBelowRedZone = thread.GetRegisterContext()->GetSP() - abi->GetRedZoneSize(); 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContextList contexts; 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext context; 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ModuleSP executableModuleSP (target.GetExecutableModule()); 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!executableModuleSP || 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner !executableModuleSP->FindSymbolsWithNameAndType(ConstString ("start"), eSymbolTypeCode, contexts)) 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner contexts.GetContextAtIndex(0, context); 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_start_addr = context.symbol->GetValue(); 76eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton lldb::addr_t StartLoadAddr = m_start_addr.GetLoadAddress(&target); 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!thread.SaveFrameZeroState(m_register_backup)) 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_function_addr = function; 82eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton lldb::addr_t FunctionLoadAddr = m_function_addr.GetLoadAddress(&target); 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!abi->PrepareTrivialCall(thread, 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner spBelowRedZone, 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FunctionLoadAddr, 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StartLoadAddr, 883c9c5eb466869ede185e879d14a47335fb43194dSean Callanan m_arg_addr, 893c9c5eb466869ede185e879d14a47335fb43194dSean Callanan this_arg)) 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_valid = true; 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::ThreadPlanCallFunction (Thread &thread, 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address &function, 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValueList &args, 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads, 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool discard_on_error) : 1005a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham ThreadPlan (ThreadPlan::eKindCallFunction, "Call function plan", thread, eVoteNoOpinion, eVoteNoOpinion), 10136a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_valid (false), 10236a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_stop_other_threads (stop_other_threads), 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_arg_addr (0), 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_args (&args), 10536a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_process (thread.GetProcess()), 10636a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_thread (thread) 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetOkayToDiscard (discard_on_error); 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process& process = thread.GetProcess(); 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Target& target = process.GetTarget(); 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ABI *abi = process.GetABI(); 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if(!abi) 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11807f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan SetBreakpoints(); 11907f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t spBelowRedZone = thread.GetRegisterContext()->GetSP() - abi->GetRedZoneSize(); 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContextList contexts; 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext context; 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ModuleSP executableModuleSP (target.GetExecutableModule()); 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!executableModuleSP || 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner !executableModuleSP->FindSymbolsWithNameAndType(ConstString ("start"), eSymbolTypeCode, contexts)) 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner contexts.GetContextAtIndex(0, context); 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_start_addr = context.symbol->GetValue(); 133eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton lldb::addr_t StartLoadAddr = m_start_addr.GetLoadAddress(&target); 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if(!thread.SaveFrameZeroState(m_register_backup)) 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_function_addr = function; 139eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton lldb::addr_t FunctionLoadAddr = m_function_addr.GetLoadAddress(&target); 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!abi->PrepareNormalCall(thread, 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner spBelowRedZone, 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FunctionLoadAddr, 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StartLoadAddr, 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *m_args)) 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_valid = true; 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::~ThreadPlanCallFunction () 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15314a97ff7ccb8d40fee3c6ff136a2c602819174ddSean Callanan if (m_valid && !IsPlanComplete()) 15414a97ff7ccb8d40fee3c6ff136a2c602819174ddSean Callanan DoTakedown(); 15514a97ff7ccb8d40fee3c6ff136a2c602819174ddSean Callanan} 15614a97ff7ccb8d40fee3c6ff136a2c602819174ddSean Callanan 15714a97ff7ccb8d40fee3c6ff136a2c602819174ddSean Callananvoid 15814a97ff7ccb8d40fee3c6ff136a2c602819174ddSean CallananThreadPlanCallFunction::DoTakedown () 15914a97ff7ccb8d40fee3c6ff136a2c602819174ddSean Callanan{ 16014a97ff7ccb8d40fee3c6ff136a2c602819174ddSean Callanan m_thread.RestoreSaveFrameZero(m_register_backup); 16114a97ff7ccb8d40fee3c6ff136a2c602819174ddSean Callanan m_thread.ClearStackFrames(); 16214a97ff7ccb8d40fee3c6ff136a2c602819174ddSean Callanan SetPlanComplete(); 16314a97ff7ccb8d40fee3c6ff136a2c602819174ddSean Callanan ClearBreakpoints(); 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::GetDescription (Stream *s, lldb::DescriptionLevel level) 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (level == lldb::eDescriptionLevelBrief) 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("Function call thread plan"); 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_args) 176eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton s->Printf("Thread plan to call 0x%llx with parsed arguments", m_function_addr.GetLoadAddress(&m_process.GetTarget()), m_arg_addr); 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 178eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton s->Printf("Thread plan to call 0x%llx void * argument at: 0x%llx", m_function_addr.GetLoadAddress(&m_process.GetTarget()), m_arg_addr); 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::ValidatePlan (Stream *error) 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_valid) 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::PlanExplainsStop () 19307f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan{ 194988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham // If our subplan knows why we stopped, even if it's done (which would forward the question to us) 195988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham // we answer yes. 196988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham if(m_subplan_sp.get() != NULL && m_subplan_sp->PlanExplainsStop()) 197988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham return true; 198ba8547d98b305f7eec3fa24ddbe9a633ffe2f8f2Sean Callanan 19994fb5432f10882f8917acb7849abdba7c61277acSean Callanan // Check if the breakpoint is one of ours. 20094fb5432f10882f8917acb7849abdba7c61277acSean Callanan 20194fb5432f10882f8917acb7849abdba7c61277acSean Callanan if (BreakpointsExplainStop()) 20294fb5432f10882f8917acb7849abdba7c61277acSean Callanan return true; 20394fb5432f10882f8917acb7849abdba7c61277acSean Callanan 204988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham // If we don't want to discard this plan, than any stop we don't understand should be propagated up the stack. 205988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham if (!OkayToDiscard()) 206988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham return false; 207988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham 208988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham // Otherwise, check the case where we stopped for an internal breakpoint, in that case, continue on. 209988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham // If it is not an internal breakpoint, consult OkayToDiscard. 210988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham lldb::StopInfoSP stop_info_sp = GetPrivateStopReason(); 21107f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 212988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham if (stop_info_sp && stop_info_sp->GetStopReason() == eStopReasonBreakpoint) 213988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham { 214988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham uint64_t break_site_id = stop_info_sp->GetValue(); 215988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham lldb::BreakpointSiteSP bp_site_sp = m_thread.GetProcess().GetBreakpointSiteList().FindByID(break_site_id); 216988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham if (bp_site_sp) 217988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham { 218988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham uint32_t num_owners = bp_site_sp->GetNumberOfOwners(); 219988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham bool is_internal = true; 220988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham for (uint32_t i = 0; i < num_owners; i++) 221988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham { 22207f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan Breakpoint &bp = bp_site_sp->GetOwnerAtIndex(i)->GetBreakpoint(); 22307f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 22407f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan if (!bp.IsInternal()) 225988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham { 226988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham is_internal = false; 227988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham break; 228988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham } 229988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham } 230988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham if (is_internal) 231988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham return false; 232988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham } 233988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham 234988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham return OkayToDiscard(); 235988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham } 236988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham else 237988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham { 238988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham // If the subplan is running, any crashes are attributable to us. 239988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham return (m_subplan_sp.get() != NULL); 240988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham } 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::ShouldStop (Event *event_ptr) 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (PlanExplainsStop()) 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 248e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 249f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 250f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan if (log) 251f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan { 252f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan RegisterContext *reg_ctx = m_thread.GetRegisterContext(); 253f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 254f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan log->PutCString("Function completed. Register state was:"); 255f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 256f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan for (uint32_t register_index = 0, num_registers = reg_ctx->GetRegisterCount(); 257f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan register_index < num_registers; 258f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan ++register_index) 259f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan { 260f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan const char *register_name = reg_ctx->GetRegisterName(register_index); 261f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan uint64_t register_value = reg_ctx->ReadRegisterAsUnsigned(register_index, LLDB_INVALID_ADDRESS); 262f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 263f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan log->Printf(" %s = 0x%llx", register_name, register_value); 264f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan } 265f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan } 266f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 26714a97ff7ccb8d40fee3c6ff136a2c602819174ddSean Callanan DoTakedown(); 26807f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::StopOthers () 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_stop_other_threads; 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::SetStopOthers (bool new_value) 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_subplan_sp) 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadPlanRunToAddress *address_plan = static_cast<ThreadPlanRunToAddress *>(m_subplan_sp.get()); 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner address_plan->SetStopOthers(new_value); 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stop_other_threads = new_value; 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::RunState () 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return eStateRunning; 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::DidPush () 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 303c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan//#define SINGLE_STEP_EXPRESSIONS 304c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan 305c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_subplan_sp.reset(new ThreadPlanRunToAddress(m_thread, m_start_addr, m_stop_other_threads)); 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread.QueueThreadPlan(m_subplan_sp, false); 309c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan#endif 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::WillStop () 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::MischiefManaged () 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsPlanComplete()) 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 323e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Completed call function plan."); 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadPlan::MischiefManaged (); 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33607f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 33707f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callananvoid 33807f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean CallananThreadPlanCallFunction::SetBreakpoints () 33907f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan{ 34029756d452be39535ded2cff50d9db4df46fe6400Sean Callanan m_cxx_language_runtime = m_process.GetLanguageRuntime(eLanguageTypeC_plus_plus); 34129756d452be39535ded2cff50d9db4df46fe6400Sean Callanan m_objc_language_runtime = m_process.GetLanguageRuntime(eLanguageTypeObjC); 34207f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 34329756d452be39535ded2cff50d9db4df46fe6400Sean Callanan if (m_cxx_language_runtime) 34429756d452be39535ded2cff50d9db4df46fe6400Sean Callanan m_cxx_language_runtime->SetExceptionBreakpoints(); 34529756d452be39535ded2cff50d9db4df46fe6400Sean Callanan if (m_objc_language_runtime) 34629756d452be39535ded2cff50d9db4df46fe6400Sean Callanan m_objc_language_runtime->SetExceptionBreakpoints(); 34707f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan} 34807f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 34907f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callananvoid 35007f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean CallananThreadPlanCallFunction::ClearBreakpoints () 35107f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan{ 35229756d452be39535ded2cff50d9db4df46fe6400Sean Callanan if (m_cxx_language_runtime) 35329756d452be39535ded2cff50d9db4df46fe6400Sean Callanan m_cxx_language_runtime->ClearExceptionBreakpoints(); 35429756d452be39535ded2cff50d9db4df46fe6400Sean Callanan if (m_objc_language_runtime) 35529756d452be39535ded2cff50d9db4df46fe6400Sean Callanan m_objc_language_runtime->ClearExceptionBreakpoints(); 35607f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan} 35794fb5432f10882f8917acb7849abdba7c61277acSean Callanan 35894fb5432f10882f8917acb7849abdba7c61277acSean Callananbool 35994fb5432f10882f8917acb7849abdba7c61277acSean CallananThreadPlanCallFunction::BreakpointsExplainStop() 36094fb5432f10882f8917acb7849abdba7c61277acSean Callanan{ 36194fb5432f10882f8917acb7849abdba7c61277acSean Callanan lldb::StopInfoSP stop_info_sp = GetPrivateStopReason(); 36294fb5432f10882f8917acb7849abdba7c61277acSean Callanan 36329756d452be39535ded2cff50d9db4df46fe6400Sean Callanan if (m_cxx_language_runtime && 36429756d452be39535ded2cff50d9db4df46fe6400Sean Callanan m_cxx_language_runtime->ExceptionBreakpointsExplainStop(stop_info_sp)) 36529756d452be39535ded2cff50d9db4df46fe6400Sean Callanan return true; 36694fb5432f10882f8917acb7849abdba7c61277acSean Callanan 36729756d452be39535ded2cff50d9db4df46fe6400Sean Callanan if (m_objc_language_runtime && 36829756d452be39535ded2cff50d9db4df46fe6400Sean Callanan m_objc_language_runtime->ExceptionBreakpointsExplainStop(stop_info_sp)) 36929756d452be39535ded2cff50d9db4df46fe6400Sean Callanan return true; 37094fb5432f10882f8917acb7849abdba7c61277acSean Callanan 37194fb5432f10882f8917acb7849abdba7c61277acSean Callanan return false; 37294fb5432f10882f8917acb7849abdba7c61277acSean Callanan} 373