ThreadPlanStepOut.cpp revision 5f35a4be95aed0e5b2cb36f7d785bcbfc67284ae
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ThreadPlanStepOut.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/ThreadPlanStepOut.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/Breakpoint/Breakpoint.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h"
191586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham#include "lldb/Core/Value.h"
201586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham#include "lldb/Core/ValueObjectConstResult.h"
2149ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Block.h"
2249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Function.h"
2349ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Type.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h"
26643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton#include "lldb/Target/StopInfo.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h"
2843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham#include "lldb/Target/ThreadPlanStepOverRange.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ThreadPlanStepOut: Step out of the current frame
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOut::ThreadPlanStepOut
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Thread &thread,
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContext *context,
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool first_insn,
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool stop_others,
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Vote stop_vote,
431ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    Vote run_vote,
441ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    uint32_t frame_idx
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) :
465a47e8bcc7277dc3683f2af2aeb9717184e8360cJim Ingham    ThreadPlan (ThreadPlan::eKindStepOut, "Step out", thread, stop_vote, run_vote),
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_step_from_context (context),
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_step_from_insn (LLDB_INVALID_ADDRESS),
4936a08102b10e39274b291e03a959016ff017694aBenjamin Kramer    m_return_bp_id (LLDB_INVALID_BREAK_ID),
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_return_addr (LLDB_INVALID_ADDRESS),
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_first_insn (first_insn),
5243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    m_stop_others (stop_others),
5343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    m_step_through_inline_plan_sp(),
541586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    m_step_out_plan_sp (),
551586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    m_immediate_step_from_function(NULL)
5643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_step_from_insn = m_thread.GetRegisterContext()->GetPC(0);
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
601ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    StackFrameSP return_frame_sp (m_thread.GetStackFrameAtIndex(frame_idx + 1));
6143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    StackFrameSP immediate_return_from_sp (m_thread.GetStackFrameAtIndex (frame_idx));
6243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
63cebfad111fd71cb2f58a8d4b38123a5c8b9be1a3Sean Callanan    if (!return_frame_sp || !immediate_return_from_sp)
64cebfad111fd71cb2f58a8d4b38123a5c8b9be1a3Sean Callanan        return; // we can't do anything here.  ValidatePlan() will return false.
65cebfad111fd71cb2f58a8d4b38123a5c8b9be1a3Sean Callanan
66441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham    m_step_out_to_id = return_frame_sp->GetStackID();
67441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham    m_immediate_step_from_id = immediate_return_from_sp->GetStackID();
68441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham
69441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham    StackID frame_zero_id = m_thread.GetStackFrameAtIndex(0)->GetStackID();
7043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
7143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    // If the frame directly below the one we are returning to is inlined, we have to be
7243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    // a little more careful.  It is non-trivial to determine the real "return code address" for
7343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    // an inlined frame, so we have to work our way to that frame and then step out.
7443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (immediate_return_from_sp && immediate_return_from_sp->IsInlined())
7543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    {
7643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        if (frame_idx > 0)
7743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        {
7843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            // First queue a plan that gets us to this inlined frame, and when we get there we'll queue a second
7943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            // plan that walks us out of this frame.
80441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham            m_step_out_plan_sp.reset (new ThreadPlanStepOut(m_thread,
81441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                                                            NULL,
82441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                                                            false,
83441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                                                            stop_others,
84441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                                                            eVoteNoOpinion,
85441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                                                            eVoteNoOpinion,
86441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                                                            frame_idx - 1));
8743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        }
8843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        else
8943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        {
9043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            // If we're already at the inlined frame we're stepping through, then just do that now.
9143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            QueueInlinedStepPlan(false);
9243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        }
9343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
9443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    }
9543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    else if (return_frame_sp)
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        // Find the return address and set a breakpoint there:
9843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        // FIXME - can we do this more securely if we know first_insn?
9943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
100f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        m_return_addr = return_frame_sp->GetFrameCodeAddress().GetLoadAddress(&m_thread.GetProcess()->GetTarget());
101f6d5fea70f2d3be8c762ba398a37e9558afc28e1Sean Callanan
102f6d5fea70f2d3be8c762ba398a37e9558afc28e1Sean Callanan        if (m_return_addr == LLDB_INVALID_ADDRESS)
103f6d5fea70f2d3be8c762ba398a37e9558afc28e1Sean Callanan            return;
104f6d5fea70f2d3be8c762ba398a37e9558afc28e1Sean Callanan
105f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        Breakpoint *return_bp = m_thread.CalculateTarget()->CreateBreakpoint (m_return_addr, true).get();
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (return_bp != NULL)
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return_bp->SetThreadID(m_thread.GetID());
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_return_bp_id = return_bp->GetID();
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
1111586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
1121586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        if (immediate_return_from_sp)
1131586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        {
1141586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham            const SymbolContext &sc = immediate_return_from_sp->GetSymbolContext(eSymbolContextFunction);
1151586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham            if (sc.function)
1161586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham            {
1171586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                m_immediate_step_from_function = sc.function;
1181586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham            }
1191586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        }
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham}
12343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
12443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Inghamvoid
12543d390617a5a03ff42894fa0ad121b9335fa4dbcJim InghamThreadPlanStepOut::DidPush()
12643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham{
12743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (m_step_out_plan_sp)
12843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        m_thread.QueueThreadPlan(m_step_out_plan_sp, false);
12943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    else if (m_step_through_inline_plan_sp)
13043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        m_thread.QueueThreadPlan(m_step_through_inline_plan_sp, false);
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOut::~ThreadPlanStepOut ()
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_return_bp_id != LLDB_INVALID_BREAK_ID)
136f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        m_thread.CalculateTarget()->RemoveBreakpointByID(m_return_bp_id);
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOut::GetDescription (Stream *s, lldb::DescriptionLevel level)
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (level == lldb::eDescriptionLevelBrief)
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->Printf ("step out");
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
14643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        if (m_step_out_plan_sp)
147441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham            s->Printf ("Stepping out to inlined frame so we can walk through it.");
14843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        else if (m_step_through_inline_plan_sp)
14943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            s->Printf ("Stepping out by stepping through inlined function.");
15043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        else
1515f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea            s->Printf ("Stepping out from address 0x%" PRIx64 " to return address 0x%" PRIx64 " using breakpoint site %d",
15243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                       (uint64_t)m_step_from_insn,
15343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                       (uint64_t)m_return_addr,
15443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                       m_return_bp_id);
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOut::ValidatePlan (Stream *error)
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (m_step_out_plan_sp)
16243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        return m_step_out_plan_sp->ValidatePlan (error);
16343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    else if (m_step_through_inline_plan_sp)
16443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        return m_step_through_inline_plan_sp->ValidatePlan (error);
16543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    else if (m_return_bp_id == LLDB_INVALID_BREAK_ID)
16643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    {
167f6d5fea70f2d3be8c762ba398a37e9558afc28e1Sean Callanan        if (error)
168f6d5fea70f2d3be8c762ba398a37e9558afc28e1Sean Callanan            error->PutCString("Could not create return address breakpoint.");
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
17043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    }
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOut::PlanExplainsStop ()
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    // If one of our child plans just finished, then we do explain the stop.
17943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (m_step_out_plan_sp)
18043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    {
18143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        if (m_step_out_plan_sp->MischiefManaged())
18243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        {
18343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            // If this one is done, then we are all done.
1841586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham            CalculateReturnValue();
18543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            SetPlanComplete();
18643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            return true;
18743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        }
18843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        else
18943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            return false;
19043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    }
19143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    else if (m_step_through_inline_plan_sp)
19243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    {
19343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        if (m_step_through_inline_plan_sp->MischiefManaged())
19443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            return true;
19543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        else
19643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            return false;
19743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    }
19843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // We don't explain signals or breakpoints (breakpoints that handle stepping in or
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // out will be handled by a child plan.
20143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
2026297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham    StopInfoSP stop_info_sp = GetPrivateStopReason();
2036297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham    if (stop_info_sp)
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2056297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham        StopReason reason = stop_info_sp->GetStopReason();
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (reason)
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
208643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        case eStopReasonBreakpoint:
209643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        {
210643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton            // If this is OUR breakpoint, we're fine, otherwise we don't know why this happened...
211f4124deeb9532044a38c0774ced872f2709347daGreg Clayton            BreakpointSiteSP site_sp (m_thread.GetProcess()->GetBreakpointSiteList().FindByID (stop_info_sp->GetValue()));
212643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton            if (site_sp && site_sp->IsBreakpointAtThisSite (m_return_bp_id))
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
214441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                bool done;
215441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham
216441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                StackID frame_zero_id = m_thread.GetStackFrameAtIndex(0)->GetStackID();
217441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham
218441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                if (m_step_out_to_id == frame_zero_id)
219441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                    done = true;
220441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                else if (m_step_out_to_id < frame_zero_id)
221441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                {
222441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                    // Either we stepped past the breakpoint, or the stack ID calculation
223441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                    // was incorrect and we should probably stop.
224441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                    done = true;
225441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                }
226441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                else
227441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                {
228441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                    if (m_immediate_step_from_id < frame_zero_id)
229441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                        done = true;
230441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                    else
231441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                        done = false;
232441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                }
233441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham
234441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                if (done)
2351586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                {
2361586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                    CalculateReturnValue();
2371ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                    SetPlanComplete();
2381586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                }
2391ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton
240643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton                // If there was only one owner, then we're done.  But if we also hit some
241643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton                // user breakpoint on our way out, we should mark ourselves as done, but
242643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton                // also not claim to explain the stop, since it is more important to report
243643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton                // the user breakpoint than the step out completion.
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
245643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton                if (site_sp->GetNumberOfOwners() == 1)
246643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton                    return true;
247643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
249643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton            return false;
250643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        }
251643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        case eStopReasonWatchpoint:
252643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        case eStopReasonSignal:
253643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        case eStopReasonException:
254643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton            return false;
255643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
256643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        default:
257643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton            return true;
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOut::ShouldStop (Event *event_ptr)
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        if (IsPlanComplete())
26743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            return true;
268441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham
269441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham        bool done;
270441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham
271441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham        StackID frame_zero_id = m_thread.GetStackFrameAtIndex(0)->GetStackID();
272441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham        if (frame_zero_id < m_step_out_to_id)
273441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham            done = false;
274441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham        else
275441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham            done = true;
276441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham
277441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham        if (done)
27843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        {
2791586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham            CalculateReturnValue();
28043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            SetPlanComplete();
28143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            return true;
28243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        }
28343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        else
28443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        {
28543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            if (m_step_out_plan_sp)
28643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            {
28743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                if (m_step_out_plan_sp->MischiefManaged())
28843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                {
28943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    // Now step through the inlined stack we are in:
29043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    if (QueueInlinedStepPlan(true))
29143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    {
29243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                        return false;
29343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    }
29443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    else
29543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    {
2961586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                        CalculateReturnValue();
29743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                        SetPlanComplete ();
29843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                        return true;
29943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    }
30043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                }
30143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                else
30243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    return m_step_out_plan_sp->ShouldStop(event_ptr);
30343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            }
30443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            else if (m_step_through_inline_plan_sp)
30543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            {
30643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                if (m_step_through_inline_plan_sp->MischiefManaged())
30743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                {
3081586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                    // We don't calculate the return value here because we don't know how to.
3091586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                    // But in case we had a return value sitting around from our process in
3101586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                    // getting here, let's clear it out.
3111586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                    m_return_valobj_sp.reset();
31243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    SetPlanComplete();
31343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    return true;
31443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                }
31543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                else
31643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    return m_step_through_inline_plan_sp->ShouldStop(event_ptr);
31743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            }
31843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            else
31943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                return false;
32043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        }
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOut::StopOthers ()
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_stop_others;
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType
330745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamThreadPlanStepOut::GetPlanRunState ()
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return eStateRunning;
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOut::WillResume (StateType resume_state, bool current_plan)
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ThreadPlan::WillResume (resume_state, current_plan);
33943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (m_step_out_plan_sp || m_step_through_inline_plan_sp)
34043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        return true;
34143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_return_bp_id == LLDB_INVALID_BREAK_ID)
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (current_plan)
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
347f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        Breakpoint *return_bp = m_thread.CalculateTarget()->GetBreakpointByID(m_return_bp_id).get();
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (return_bp != NULL)
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return_bp->SetEnabled (true);
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOut::WillStop ()
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (m_return_bp_id != LLDB_INVALID_BREAK_ID)
35843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    {
359f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        Breakpoint *return_bp = m_thread.CalculateTarget()->GetBreakpointByID(m_return_bp_id).get();
36043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        if (return_bp != NULL)
36143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            return_bp->SetEnabled (false);
36243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    }
36343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOut::MischiefManaged ()
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (IsPlanComplete())
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Did I reach my breakpoint?  If so I'm done.
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        //
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // I also check the stack depth, since if we've blown past the breakpoint for some
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // reason and we're now stopping for some other reason altogether, then we're done
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // with this step out operation.
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
378e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton        LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (log)
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf("Completed step out plan.");
38143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        if (m_return_bp_id != LLDB_INVALID_BREAK_ID)
38243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        {
383f4124deeb9532044a38c0774ced872f2709347daGreg Clayton            m_thread.CalculateTarget()->RemoveBreakpointByID (m_return_bp_id);
38443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            m_return_bp_id = LLDB_INVALID_BREAK_ID;
38543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        }
38643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ThreadPlan::MischiefManaged ();
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Inghambool
39743d390617a5a03ff42894fa0ad121b9335fa4dbcJim InghamThreadPlanStepOut::QueueInlinedStepPlan (bool queue_now)
39843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham{
39943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    // Now figure out the range of this inlined block, and set up a "step through range"
40043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    // plan for that.  If we've been provided with a context, then use the block in that
40143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    // context.
40243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    StackFrameSP immediate_return_from_sp (m_thread.GetStackFrameAtIndex (0));
40343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (!immediate_return_from_sp)
40443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        return false;
40543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
40643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
40743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (log)
40843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    {
40943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        StreamString s;
41043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        immediate_return_from_sp->Dump(&s, true, false);
41143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        log->Printf("Queuing inlined frame to step past: %s.", s.GetData());
41243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    }
41343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
41443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    Block *from_block = immediate_return_from_sp->GetFrameBlock();
41543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (from_block)
41643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    {
41743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        Block *inlined_block = from_block->GetContainingInlinedBlock();
41843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        if (inlined_block)
41943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        {
42043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            size_t num_ranges = inlined_block->GetNumRanges();
42143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            AddressRange inline_range;
42243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            if (inlined_block->GetRangeAtIndex(0, inline_range))
42343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            {
42443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                SymbolContext inlined_sc;
42543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                inlined_block->CalculateSymbolContext(&inlined_sc);
426c3ba2af1e0e1698a580d4d70be4b059ec2f991e0Jim Ingham                inlined_sc.target_sp = GetTarget().shared_from_this();
42743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                RunMode run_mode = m_stop_others ? lldb::eOnlyThisThread : lldb::eAllThreads;
42843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                ThreadPlanStepOverRange *step_through_inline_plan_ptr = new ThreadPlanStepOverRange(m_thread,
42943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                                                                                                    inline_range,
43043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                                                                                                    inlined_sc,
43143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                                                                                                    run_mode);
43243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                step_through_inline_plan_ptr->SetOkayToDiscard(true);
43343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                StreamString errors;
43443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                if (!step_through_inline_plan_ptr->ValidatePlan(&errors))
43543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                {
43643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    //FIXME: Log this failure.
43743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    delete step_through_inline_plan_ptr;
43843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    return false;
43943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                }
44043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
44143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                for (size_t i = 1; i < num_ranges; i++)
44243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                {
44343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    if (inlined_block->GetRangeAtIndex (i, inline_range))
44443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                        step_through_inline_plan_ptr->AddRange (inline_range);
44543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                }
44643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                m_step_through_inline_plan_sp.reset (step_through_inline_plan_ptr);
44743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                if (queue_now)
44843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    m_thread.QueueThreadPlan (m_step_through_inline_plan_sp, false);
44943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                return true;
45043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            }
45143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        }
45243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    }
45343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
45443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    return false;
45543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham}
4561586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
4571586d9720002e407a3a097baf302de5fa4ca9c1bJim Inghamvoid
4581586d9720002e407a3a097baf302de5fa4ca9c1bJim InghamThreadPlanStepOut::CalculateReturnValue ()
4591586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham{
4601586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    if (m_return_valobj_sp)
4611586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        return;
4621586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
4631586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    if (m_immediate_step_from_function != NULL)
4641586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    {
4651586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        Type *return_type = m_immediate_step_from_function->GetType();
4661586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        lldb::clang_type_t return_clang_type = m_immediate_step_from_function->GetReturnClangType();
4671586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        if (return_type && return_clang_type)
4681586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        {
4691586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham            ClangASTType ast_type (return_type->GetClangAST(), return_clang_type);
4701586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
471f4124deeb9532044a38c0774ced872f2709347daGreg Clayton            lldb::ABISP abi_sp = m_thread.GetProcess()->GetABI();
4721586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham            if (abi_sp)
4731586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham            {
4741586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                m_return_valobj_sp = abi_sp->GetReturnValueObject(m_thread, ast_type);
4751586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham            }
4761586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        }
4771586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    }
4781586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham}
47988e3de205708f14431559072ca258899b5ac31ccJim Ingham
48088e3de205708f14431559072ca258899b5ac31ccJim Inghambool
48188e3de205708f14431559072ca258899b5ac31ccJim InghamThreadPlanStepOut::IsPlanStale()
48288e3de205708f14431559072ca258899b5ac31ccJim Ingham{
48388e3de205708f14431559072ca258899b5ac31ccJim Ingham    // If we are still lower on the stack than the frame we are returning to, then
48488e3de205708f14431559072ca258899b5ac31ccJim Ingham    // there's something for us to do.  Otherwise, we're stale.
48588e3de205708f14431559072ca258899b5ac31ccJim Ingham
48688e3de205708f14431559072ca258899b5ac31ccJim Ingham    StackID frame_zero_id = m_thread.GetStackFrameAtIndex(0)->GetStackID();
48788e3de205708f14431559072ca258899b5ac31ccJim Ingham    if (frame_zero_id < m_step_out_to_id)
48888e3de205708f14431559072ca258899b5ac31ccJim Ingham        return false;
48988e3de205708f14431559072ca258899b5ac31ccJim Ingham    else
49088e3de205708f14431559072ca258899b5ac31ccJim Ingham        return true;
49188e3de205708f14431559072ca258899b5ac31ccJim Ingham}
49288e3de205708f14431559072ca258899b5ac31ccJim Ingham
493