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