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