ThreadPlanCallFunction.cpp revision 574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9
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, 40989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t arg, 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads, 423c9c5eb466869ede185e879d14a47335fb43194dSean Callanan bool discard_on_error, 43989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t *this_arg, 44989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t *cmd_arg) : 455a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham ThreadPlan (ThreadPlan::eKindCallFunction, "Call function plan", thread, eVoteNoOpinion, eVoteNoOpinion), 4636a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_valid (false), 4736a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_stop_other_threads (stop_other_threads), 48574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham m_function_addr (function), 49abb53e5708c9d880441017a6d7d89172fc233e3ePeter Collingbourne m_function_sp (NULL), 5036a08102b10e39274b291e03a959016ff017694aBenjamin Kramer m_process (thread.GetProcess()), 512f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham m_thread (thread), 52abb53e5708c9d880441017a6d7d89172fc233e3ePeter Collingbourne m_takedown_done (false) 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetOkayToDiscard (discard_on_error); 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process& process = thread.GetProcess(); 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Target& target = process.GetTarget(); 5875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton const ABI *abi = process.GetABI().get(); 5907f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!abi) 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 6207f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 6315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 6415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 6507f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan SetBreakpoints(); 6607f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 670ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan m_function_sp = thread.GetRegisterContext()->GetSP() - abi->GetRedZoneSize(); 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 695beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton Module *exe_module = target.GetExecutableModulePointer(); 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 715beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton if (exe_module == NULL) 722877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham { 739d56ba96d520710c55874132d44a64de1257d2faJohnny Chen if (log) 749d56ba96d520710c55874132d44a64de1257d2faJohnny Chen log->Printf ("Can't execute code without an executable module."); 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 762877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham } 772877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham else 782877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham { 795beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton ObjectFile *objectFile = exe_module->GetObjectFile(); 802877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham if (!objectFile) 812877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham { 829d56ba96d520710c55874132d44a64de1257d2faJohnny Chen if (log) 839d56ba96d520710c55874132d44a64de1257d2faJohnny Chen log->Printf ("Could not find object file for module \"%s\".", 84b01760c1bc2b35c1e54cd4c95bda066023f361d8Greg Clayton exe_module->GetFileSpec().GetFilename().AsCString()); 852877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham return; 862877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham } 872877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham m_start_addr = objectFile->GetEntryPointAddress(); 882877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham if (!m_start_addr.IsValid()) 892877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham { 909d56ba96d520710c55874132d44a64de1257d2faJohnny Chen if (log) 919d56ba96d520710c55874132d44a64de1257d2faJohnny Chen log->Printf ("Could not find entry point address for executable module \"%s\".", 92b01760c1bc2b35c1e54cd4c95bda066023f361d8Greg Clayton exe_module->GetFileSpec().GetFilename().AsCString()); 932877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham return; 942877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham } 952877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham } 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t start_load_addr = m_start_addr.GetLoadAddress(&target); 982877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham 9915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham // Checkpoint the thread state so we can restore it later. 1002f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham if (log && log->GetVerbose()) 1012f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham ReportRegisterState ("About to checkpoint thread before function call. Original register state was:"); 1022f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham 10315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham if (!thread.CheckpointThreadState (m_stored_thread_state)) 10415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham { 10515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham if (log) 10615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham log->Printf ("Setting up ThreadPlanCallFunction, failed to checkpoint thread state."); 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 10815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham } 10915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham // Now set the thread state to "no reason" so we don't run with whatever signal was outstanding... 11015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham thread.SetStopInfoToNothing(); 11115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 112989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t FunctionLoadAddr = m_function_addr.GetLoadAddress(&target); 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11461d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton if (this_arg && cmd_arg) 11561d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton { 11661d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton if (!abi->PrepareTrivialCall (thread, 11761d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton m_function_sp, 11861d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton FunctionLoadAddr, 119989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton start_load_addr, 12061d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton this_arg, 12161d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton cmd_arg, 122989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton &arg)) 12361d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton return; 12461d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton } 12561d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton else if (this_arg) 12661d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton { 12761d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton if (!abi->PrepareTrivialCall (thread, 12861d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton m_function_sp, 12961d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton FunctionLoadAddr, 130989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton start_load_addr, 13161d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton this_arg, 132989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton &arg)) 13361d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton return; 13461d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton } 13561d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton else 13661d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton { 13761d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton if (!abi->PrepareTrivialCall (thread, 13861d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton m_function_sp, 13961d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton FunctionLoadAddr, 140989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton start_load_addr, 141989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton &arg)) 142989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton return; 143989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton } 144989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 145989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton ReportRegisterState ("Function call was set up. Register state was:"); 146989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 147989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton m_valid = true; 148989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton} 149989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 150989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 151989816b9505219cd67ce044d655c54ac86ecf64bGreg ClaytonThreadPlanCallFunction::ThreadPlanCallFunction (Thread &thread, 152989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton Address &function, 153989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton bool stop_other_threads, 154989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton bool discard_on_error, 155989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t *arg1_ptr, 156989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t *arg2_ptr, 157989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t *arg3_ptr, 158989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t *arg4_ptr, 159989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t *arg5_ptr, 160989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t *arg6_ptr) : 161989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton ThreadPlan (ThreadPlan::eKindCallFunction, "Call function plan", thread, eVoteNoOpinion, eVoteNoOpinion), 162989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton m_valid (false), 163989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton m_stop_other_threads (stop_other_threads), 164574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham m_function_addr (function), 165abb53e5708c9d880441017a6d7d89172fc233e3ePeter Collingbourne m_function_sp(NULL), 166989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton m_process (thread.GetProcess()), 167989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton m_thread (thread), 168abb53e5708c9d880441017a6d7d89172fc233e3ePeter Collingbourne m_takedown_done (false) 169989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton{ 170989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton SetOkayToDiscard (discard_on_error); 171989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 172989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton Process& process = thread.GetProcess(); 173989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton Target& target = process.GetTarget(); 174989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton const ABI *abi = process.GetABI().get(); 175989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 176989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton if (!abi) 177989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton return; 178989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 179989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 180989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 181989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton SetBreakpoints(); 182989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 183989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton m_function_sp = thread.GetRegisterContext()->GetSP() - abi->GetRedZoneSize(); 184989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 1855beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton Module *exe_module = target.GetExecutableModulePointer(); 186989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 1875beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton if (exe_module == NULL) 188989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton { 1899d56ba96d520710c55874132d44a64de1257d2faJohnny Chen if (log) 1909d56ba96d520710c55874132d44a64de1257d2faJohnny Chen log->Printf ("Can't execute code without an executable module."); 191989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton return; 192989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton } 193989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton else 194989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton { 1955beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton ObjectFile *objectFile = exe_module->GetObjectFile(); 196989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton if (!objectFile) 197989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton { 1989d56ba96d520710c55874132d44a64de1257d2faJohnny Chen if (log) 1999d56ba96d520710c55874132d44a64de1257d2faJohnny Chen log->Printf ("Could not find object file for module \"%s\".", 200b01760c1bc2b35c1e54cd4c95bda066023f361d8Greg Clayton exe_module->GetFileSpec().GetFilename().AsCString()); 201989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton return; 202989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton } 203989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton m_start_addr = objectFile->GetEntryPointAddress(); 204989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton if (!m_start_addr.IsValid()) 205989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton { 206628cead3b4ae3d709d10389a3ab026e808dffa9bGreg Clayton if (log) 207628cead3b4ae3d709d10389a3ab026e808dffa9bGreg Clayton log->Printf ("Could not find entry point address for executable module \"%s\".", 2085beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton exe_module->GetFileSpec().GetFilename().AsCString()); 209989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton return; 210989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton } 211989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton } 212989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 213989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t start_load_addr = m_start_addr.GetLoadAddress(&target); 214989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 215989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton // Checkpoint the thread state so we can restore it later. 216989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton if (log && log->GetVerbose()) 217989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton ReportRegisterState ("About to checkpoint thread before function call. Original register state was:"); 218989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 219989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton if (!thread.CheckpointThreadState (m_stored_thread_state)) 220989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton { 221989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton if (log) 222989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton log->Printf ("Setting up ThreadPlanCallFunction, failed to checkpoint thread state."); 223989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton return; 224989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton } 225989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton // Now set the thread state to "no reason" so we don't run with whatever signal was outstanding... 226989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton thread.SetStopInfoToNothing(); 227989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 228989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton addr_t FunctionLoadAddr = m_function_addr.GetLoadAddress(&target); 229989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 230989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton if (!abi->PrepareTrivialCall (thread, 231989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton m_function_sp, 232989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton FunctionLoadAddr, 233989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton start_load_addr, 234989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton arg1_ptr, 235989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton arg2_ptr, 236989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton arg3_ptr, 237989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton arg4_ptr, 238989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton arg5_ptr, 239989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton arg6_ptr)) 240989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton { 24161d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton return; 24261d4f7adb6936a6d406dd5b20452d0843e538d76Greg Clayton } 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2442f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham ReportRegisterState ("Function call was set up. Register state was:"); 2452f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham 2462f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham m_valid = true; 2472f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham} 2482f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham 2492f6267ff7af90c14fe08fd88bac6a63a02069033Jim InghamThreadPlanCallFunction::~ThreadPlanCallFunction () 2502f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham{ 2512f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham} 2522f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham 2532f6267ff7af90c14fe08fd88bac6a63a02069033Jim Inghamvoid 2542f6267ff7af90c14fe08fd88bac6a63a02069033Jim InghamThreadPlanCallFunction::ReportRegisterState (const char *message) 2552f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham{ 256628cead3b4ae3d709d10389a3ab026e808dffa9bGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_VERBOSE)); 2576dff827fc7b73b0d1850a76b99f01448c4b98e50Sean Callanan if (log) 2586dff827fc7b73b0d1850a76b99f01448c4b98e50Sean Callanan { 259628cead3b4ae3d709d10389a3ab026e808dffa9bGreg Clayton StreamString strm; 26008d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton RegisterContext *reg_ctx = m_thread.GetRegisterContext().get(); 2612f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham 2622f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham log->PutCString(message); 2632f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham 264628cead3b4ae3d709d10389a3ab026e808dffa9bGreg Clayton RegisterValue reg_value; 265628cead3b4ae3d709d10389a3ab026e808dffa9bGreg Clayton 266628cead3b4ae3d709d10389a3ab026e808dffa9bGreg Clayton for (uint32_t reg_idx = 0, num_registers = reg_ctx->GetRegisterCount(); 267628cead3b4ae3d709d10389a3ab026e808dffa9bGreg Clayton reg_idx < num_registers; 268628cead3b4ae3d709d10389a3ab026e808dffa9bGreg Clayton ++reg_idx) 2696dff827fc7b73b0d1850a76b99f01448c4b98e50Sean Callanan { 270628cead3b4ae3d709d10389a3ab026e808dffa9bGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 271628cead3b4ae3d709d10389a3ab026e808dffa9bGreg Clayton if (reg_ctx->ReadRegister(reg_info, reg_value)) 272628cead3b4ae3d709d10389a3ab026e808dffa9bGreg Clayton { 273628cead3b4ae3d709d10389a3ab026e808dffa9bGreg Clayton reg_value.Dump(&strm, reg_info, true, false, eFormatDefault); 274628cead3b4ae3d709d10389a3ab026e808dffa9bGreg Clayton strm.EOL(); 275628cead3b4ae3d709d10389a3ab026e808dffa9bGreg Clayton } 2766dff827fc7b73b0d1850a76b99f01448c4b98e50Sean Callanan } 277628cead3b4ae3d709d10389a3ab026e808dffa9bGreg Clayton log->PutCString(strm.GetData()); 2786dff827fc7b73b0d1850a76b99f01448c4b98e50Sean Callanan } 27914a97ff7ccb8d40fee3c6ff136a2c602819174ddSean Callanan} 28014a97ff7ccb8d40fee3c6ff136a2c602819174ddSean Callanan 28114a97ff7ccb8d40fee3c6ff136a2c602819174ddSean Callananvoid 28214a97ff7ccb8d40fee3c6ff136a2c602819174ddSean CallananThreadPlanCallFunction::DoTakedown () 28314a97ff7ccb8d40fee3c6ff136a2c602819174ddSean Callanan{ 2842f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 2852f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham if (!m_takedown_done) 28615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham { 2872f085c6ca2895663687dca704589478ff040b849Greg Clayton // TODO: how do we tell if all went well? 2882f085c6ca2895663687dca704589478ff040b849Greg Clayton if (m_return_value_sp) 2892f085c6ca2895663687dca704589478ff040b849Greg Clayton { 2902f085c6ca2895663687dca704589478ff040b849Greg Clayton const ABI *abi = m_thread.GetProcess().GetABI().get(); 2912f085c6ca2895663687dca704589478ff040b849Greg Clayton if (abi) 2922f085c6ca2895663687dca704589478ff040b849Greg Clayton abi->GetReturnValue(m_thread, *m_return_value_sp); 2932f085c6ca2895663687dca704589478ff040b849Greg Clayton } 2942f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham if (log) 2952f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham log->Printf ("DoTakedown called for thread 0x%4.4x, m_valid: %d complete: %d.\n", m_thread.GetID(), m_valid, IsPlanComplete()); 2962f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham m_takedown_done = true; 2972370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham m_real_stop_info_sp = GetPrivateStopReason(); 29815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham m_thread.RestoreThreadStateFromCheckpoint(m_stored_thread_state); 29915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham SetPlanComplete(); 30015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham ClearBreakpoints(); 3012f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham if (log && log->GetVerbose()) 3022f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham ReportRegisterState ("Restoring thread state after function call. Restored register state:"); 30378108e67d0f6e7a63ee7b0a98b45f283dfd0c42aJim Ingham 3042f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham } 3052f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham else 3062f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham { 3072f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham if (log) 3082f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham log->Printf ("DoTakedown called as no-op for thread 0x%4.4x, m_valid: %d complete: %d.\n", m_thread.GetID(), m_valid, IsPlanComplete()); 30915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham } 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 3136c9662e0e5840b557fcd4bd990620e106e4a18e2Jim InghamThreadPlanCallFunction::WillPop () 3146c9662e0e5840b557fcd4bd990620e106e4a18e2Jim Ingham{ 31515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham DoTakedown(); 3166c9662e0e5840b557fcd4bd990620e106e4a18e2Jim Ingham} 3176c9662e0e5840b557fcd4bd990620e106e4a18e2Jim Ingham 3186c9662e0e5840b557fcd4bd990620e106e4a18e2Jim Inghamvoid 319989816b9505219cd67ce044d655c54ac86ecf64bGreg ClaytonThreadPlanCallFunction::GetDescription (Stream *s, DescriptionLevel level) 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 321989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton if (level == eDescriptionLevelBrief) 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("Function call thread plan"); 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 327989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton s->Printf("Thread plan to call 0x%llx", m_function_addr.GetLoadAddress(&m_process.GetTarget())); 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::ValidatePlan (Stream *error) 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_valid) 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::PlanExplainsStop () 34207f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan{ 3432370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham m_real_stop_info_sp = GetPrivateStopReason(); 3442370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham 345988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham // If our subplan knows why we stopped, even if it's done (which would forward the question to us) 346988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham // we answer yes. 3474c3fb4b50a87e6e08987096d7edacc26545f58dcEnrico Granata if (m_subplan_sp.get() != NULL && m_subplan_sp->PlanExplainsStop()) 348988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham return true; 349ba8547d98b305f7eec3fa24ddbe9a633ffe2f8f2Sean Callanan 35094fb5432f10882f8917acb7849abdba7c61277acSean Callanan // Check if the breakpoint is one of ours. 35194fb5432f10882f8917acb7849abdba7c61277acSean Callanan 35294fb5432f10882f8917acb7849abdba7c61277acSean Callanan if (BreakpointsExplainStop()) 35394fb5432f10882f8917acb7849abdba7c61277acSean Callanan return true; 35494fb5432f10882f8917acb7849abdba7c61277acSean Callanan 355988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham // If we don't want to discard this plan, than any stop we don't understand should be propagated up the stack. 356988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham if (!OkayToDiscard()) 357988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham return false; 358988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham 359988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham // Otherwise, check the case where we stopped for an internal breakpoint, in that case, continue on. 360988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham // If it is not an internal breakpoint, consult OkayToDiscard. 36107f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 3622370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham if (m_real_stop_info_sp && m_real_stop_info_sp->GetStopReason() == eStopReasonBreakpoint) 363988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham { 3642370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham uint64_t break_site_id = m_real_stop_info_sp->GetValue(); 365989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton BreakpointSiteSP bp_site_sp = m_thread.GetProcess().GetBreakpointSiteList().FindByID(break_site_id); 366988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham if (bp_site_sp) 367988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham { 368988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham uint32_t num_owners = bp_site_sp->GetNumberOfOwners(); 369988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham bool is_internal = true; 370988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham for (uint32_t i = 0; i < num_owners; i++) 371988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham { 37207f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan Breakpoint &bp = bp_site_sp->GetOwnerAtIndex(i)->GetBreakpoint(); 37307f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 37407f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan if (!bp.IsInternal()) 375988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham { 376988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham is_internal = false; 377988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham break; 378988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham } 379988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham } 380988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham if (is_internal) 381988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham return false; 382988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham } 383988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham 384988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham return OkayToDiscard(); 385988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham } 386988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham else 387988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham { 388988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham // If the subplan is running, any crashes are attributable to us. 38978108e67d0f6e7a63ee7b0a98b45f283dfd0c42aJim Ingham // If we want to discard the plan, then we say we explain the stop 39078108e67d0f6e7a63ee7b0a98b45f283dfd0c42aJim Ingham // but if we are going to be discarded, let whoever is above us 39178108e67d0f6e7a63ee7b0a98b45f283dfd0c42aJim Ingham // explain the stop. 39278108e67d0f6e7a63ee7b0a98b45f283dfd0c42aJim Ingham return ((m_subplan_sp.get() != NULL) && !OkayToDiscard()); 393988ddbcdc1a7f362968a1e3bfcd7fda39e7345eeJim Ingham } 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::ShouldStop (Event *event_ptr) 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (PlanExplainsStop()) 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4012f6267ff7af90c14fe08fd88bac6a63a02069033Jim Ingham ReportRegisterState ("Function completed. Register state was:"); 402f5857a002d1e0c5fe29b8af9f9e2fe4fac0298d8Sean Callanan 40314a97ff7ccb8d40fee3c6ff136a2c602819174ddSean Callanan DoTakedown(); 40407f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::StopOthers () 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_stop_other_threads; 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::SetStopOthers (bool new_value) 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_subplan_sp) 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadPlanRunToAddress *address_plan = static_cast<ThreadPlanRunToAddress *>(m_subplan_sp.get()); 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner address_plan->SetStopOthers(new_value); 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stop_other_threads = new_value; 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType 431745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamThreadPlanCallFunction::GetPlanRunState () 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return eStateRunning; 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::DidPush () 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 439c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan//#define SINGLE_STEP_EXPRESSIONS 440c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan 441c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan#ifndef SINGLE_STEP_EXPRESSIONS 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_subplan_sp.reset(new ThreadPlanRunToAddress(m_thread, m_start_addr, m_stop_other_threads)); 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_thread.QueueThreadPlan(m_subplan_sp, false); 44515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham m_subplan_sp->SetPrivate (true); 446c2c6f7781b6721e73ccf5ed842d00906ae27f191Sean Callanan#endif 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::WillStop () 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanCallFunction::MischiefManaged () 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (IsPlanComplete()) 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 460e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf("Completed call function plan."); 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadPlan::MischiefManaged (); 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 47307f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 47407f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callananvoid 47507f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean CallananThreadPlanCallFunction::SetBreakpoints () 47607f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan{ 47729756d452be39535ded2cff50d9db4df46fe6400Sean Callanan m_cxx_language_runtime = m_process.GetLanguageRuntime(eLanguageTypeC_plus_plus); 47829756d452be39535ded2cff50d9db4df46fe6400Sean Callanan m_objc_language_runtime = m_process.GetLanguageRuntime(eLanguageTypeObjC); 47907f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 48029756d452be39535ded2cff50d9db4df46fe6400Sean Callanan if (m_cxx_language_runtime) 48129756d452be39535ded2cff50d9db4df46fe6400Sean Callanan m_cxx_language_runtime->SetExceptionBreakpoints(); 48229756d452be39535ded2cff50d9db4df46fe6400Sean Callanan if (m_objc_language_runtime) 48329756d452be39535ded2cff50d9db4df46fe6400Sean Callanan m_objc_language_runtime->SetExceptionBreakpoints(); 48407f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan} 48507f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 48607f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callananvoid 48707f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean CallananThreadPlanCallFunction::ClearBreakpoints () 48807f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan{ 48929756d452be39535ded2cff50d9db4df46fe6400Sean Callanan if (m_cxx_language_runtime) 49029756d452be39535ded2cff50d9db4df46fe6400Sean Callanan m_cxx_language_runtime->ClearExceptionBreakpoints(); 49129756d452be39535ded2cff50d9db4df46fe6400Sean Callanan if (m_objc_language_runtime) 49229756d452be39535ded2cff50d9db4df46fe6400Sean Callanan m_objc_language_runtime->ClearExceptionBreakpoints(); 49307f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan} 49494fb5432f10882f8917acb7849abdba7c61277acSean Callanan 49594fb5432f10882f8917acb7849abdba7c61277acSean Callananbool 49694fb5432f10882f8917acb7849abdba7c61277acSean CallananThreadPlanCallFunction::BreakpointsExplainStop() 49794fb5432f10882f8917acb7849abdba7c61277acSean Callanan{ 498989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton StopInfoSP stop_info_sp = GetPrivateStopReason(); 49994fb5432f10882f8917acb7849abdba7c61277acSean Callanan 50029756d452be39535ded2cff50d9db4df46fe6400Sean Callanan if (m_cxx_language_runtime && 50129756d452be39535ded2cff50d9db4df46fe6400Sean Callanan m_cxx_language_runtime->ExceptionBreakpointsExplainStop(stop_info_sp)) 50229756d452be39535ded2cff50d9db4df46fe6400Sean Callanan return true; 50394fb5432f10882f8917acb7849abdba7c61277acSean Callanan 50429756d452be39535ded2cff50d9db4df46fe6400Sean Callanan if (m_objc_language_runtime && 50529756d452be39535ded2cff50d9db4df46fe6400Sean Callanan m_objc_language_runtime->ExceptionBreakpointsExplainStop(stop_info_sp)) 50629756d452be39535ded2cff50d9db4df46fe6400Sean Callanan return true; 50794fb5432f10882f8917acb7849abdba7c61277acSean Callanan 50894fb5432f10882f8917acb7849abdba7c61277acSean Callanan return false; 50994fb5432f10882f8917acb7849abdba7c61277acSean Callanan} 510