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