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();
110090f83176695d86197b0e86b67dee4160ec5003dJim Ingham            return_bp->SetBreakpointKind ("step-out");
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
1121586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
1131586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        if (immediate_return_from_sp)
1141586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        {
1151586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham            const SymbolContext &sc = immediate_return_from_sp->GetSymbolContext(eSymbolContextFunction);
1161586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham            if (sc.function)
1171586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham            {
1181586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                m_immediate_step_from_function = sc.function;
1191586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham            }
1201586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        }
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham}
12443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
12543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Inghamvoid
12643d390617a5a03ff42894fa0ad121b9335fa4dbcJim InghamThreadPlanStepOut::DidPush()
12743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham{
12843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (m_step_out_plan_sp)
12943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        m_thread.QueueThreadPlan(m_step_out_plan_sp, false);
13043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    else if (m_step_through_inline_plan_sp)
13143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        m_thread.QueueThreadPlan(m_step_through_inline_plan_sp, false);
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOut::~ThreadPlanStepOut ()
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_return_bp_id != LLDB_INVALID_BREAK_ID)
137f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        m_thread.CalculateTarget()->RemoveBreakpointByID(m_return_bp_id);
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOut::GetDescription (Stream *s, lldb::DescriptionLevel level)
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (level == lldb::eDescriptionLevelBrief)
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        s->Printf ("step out");
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
14743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        if (m_step_out_plan_sp)
148441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham            s->Printf ("Stepping out to inlined frame so we can walk through it.");
14943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        else if (m_step_through_inline_plan_sp)
15043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            s->Printf ("Stepping out by stepping through inlined function.");
15143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        else
1525f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea            s->Printf ("Stepping out from address 0x%" PRIx64 " to return address 0x%" PRIx64 " using breakpoint site %d",
15343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                       (uint64_t)m_step_from_insn,
15443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                       (uint64_t)m_return_addr,
15543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                       m_return_bp_id);
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOut::ValidatePlan (Stream *error)
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (m_step_out_plan_sp)
16343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        return m_step_out_plan_sp->ValidatePlan (error);
16443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    else if (m_step_through_inline_plan_sp)
16543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        return m_step_through_inline_plan_sp->ValidatePlan (error);
16643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    else if (m_return_bp_id == LLDB_INVALID_BREAK_ID)
16743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    {
168f6d5fea70f2d3be8c762ba398a37e9558afc28e1Sean Callanan        if (error)
169f6d5fea70f2d3be8c762ba398a37e9558afc28e1Sean Callanan            error->PutCString("Could not create return address breakpoint.");
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
17143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    }
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
1777c79a27b955432dfd3ad9439640f0af2eccf37b8Jim InghamThreadPlanStepOut::DoPlanExplainsStop (Event *event_ptr)
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    // If one of our child plans just finished, then we do explain the stop.
18043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (m_step_out_plan_sp)
18143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    {
18243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        if (m_step_out_plan_sp->MischiefManaged())
18343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        {
18443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            // If this one is done, then we are all done.
1851586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham            CalculateReturnValue();
18643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            SetPlanComplete();
18743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            return true;
18843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        }
18943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        else
19043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            return false;
19143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    }
19243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    else if (m_step_through_inline_plan_sp)
19343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    {
19443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        if (m_step_through_inline_plan_sp->MischiefManaged())
19543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            return true;
19643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        else
19743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            return false;
19843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    }
19943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // We don't explain signals or breakpoints (breakpoints that handle stepping in or
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // out will be handled by a child plan.
20243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
20304cc48eb5cff32268a822b57f87590c9dc2643f8Jim Ingham    StopInfoSP stop_info_sp = GetPrivateStopInfo ();
2046297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham    if (stop_info_sp)
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2066297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham        StopReason reason = stop_info_sp->GetStopReason();
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (reason)
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
209643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        case eStopReasonBreakpoint:
210643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        {
211643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton            // If this is OUR breakpoint, we're fine, otherwise we don't know why this happened...
212f4124deeb9532044a38c0774ced872f2709347daGreg Clayton            BreakpointSiteSP site_sp (m_thread.GetProcess()->GetBreakpointSiteList().FindByID (stop_info_sp->GetValue()));
213643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton            if (site_sp && site_sp->IsBreakpointAtThisSite (m_return_bp_id))
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
215441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                bool done;
216441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham
217441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                StackID frame_zero_id = m_thread.GetStackFrameAtIndex(0)->GetStackID();
218441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham
219441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                if (m_step_out_to_id == frame_zero_id)
220441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                    done = true;
221441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                else if (m_step_out_to_id < frame_zero_id)
222441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                {
223441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                    // Either we stepped past the breakpoint, or the stack ID calculation
224441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                    // was incorrect and we should probably stop.
225441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                    done = true;
226441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                }
227441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                else
228441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                {
229441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                    if (m_immediate_step_from_id < frame_zero_id)
230441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                        done = true;
231441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                    else
232441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                        done = false;
233441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                }
234441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham
235441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham                if (done)
2361586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                {
2371586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                    CalculateReturnValue();
2381ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                    SetPlanComplete();
2391586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                }
2401ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton
241643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton                // If there was only one owner, then we're done.  But if we also hit some
242643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton                // user breakpoint on our way out, we should mark ourselves as done, but
243643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton                // also not claim to explain the stop, since it is more important to report
244643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton                // the user breakpoint than the step out completion.
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
246643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton                if (site_sp->GetNumberOfOwners() == 1)
247643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton                    return true;
248643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
250643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton            return false;
251643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        }
252643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        case eStopReasonWatchpoint:
253643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        case eStopReasonSignal:
254643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        case eStopReasonException:
2550bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton        case eStopReasonExec:
256278f16e1dd4097bf3dd12b0f63f1fac0f11c4006Andrew Kaylor        case eStopReasonThreadExiting:
257643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton            return false;
258643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton
259643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton        default:
260643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton            return true;
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOut::ShouldStop (Event *event_ptr)
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        if (IsPlanComplete())
27043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            return true;
271441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham
272441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham        bool done;
273441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham
274441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham        StackID frame_zero_id = m_thread.GetStackFrameAtIndex(0)->GetStackID();
275441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham        if (frame_zero_id < m_step_out_to_id)
276441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham            done = false;
277441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham        else
278441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham            done = true;
279441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham
280441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham        if (done)
28143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        {
2821586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham            CalculateReturnValue();
28343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            SetPlanComplete();
28443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            return true;
28543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        }
28643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        else
28743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        {
28843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            if (m_step_out_plan_sp)
28943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            {
29043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                if (m_step_out_plan_sp->MischiefManaged())
29143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                {
29243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    // Now step through the inlined stack we are in:
29343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    if (QueueInlinedStepPlan(true))
29443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    {
29543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                        return false;
29643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    }
29743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    else
29843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    {
2991586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                        CalculateReturnValue();
30043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                        SetPlanComplete ();
30143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                        return true;
30243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    }
30343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                }
30443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                else
30543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    return m_step_out_plan_sp->ShouldStop(event_ptr);
30643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            }
30743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            else if (m_step_through_inline_plan_sp)
30843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            {
30943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                if (m_step_through_inline_plan_sp->MischiefManaged())
31043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                {
3111586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                    // We don't calculate the return value here because we don't know how to.
3121586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                    // But in case we had a return value sitting around from our process in
3131586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                    // getting here, let's clear it out.
3141586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham                    m_return_valobj_sp.reset();
31543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    SetPlanComplete();
31643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    return true;
31743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                }
31843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                else
31943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    return m_step_through_inline_plan_sp->ShouldStop(event_ptr);
32043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            }
32143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            else
32243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                return false;
32343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        }
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOut::StopOthers ()
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_stop_others;
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStateType
333745ac7a5826fe7c392007941a4046bfb1a8dff81Jim InghamThreadPlanStepOut::GetPlanRunState ()
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return eStateRunning;
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
3397c79a27b955432dfd3ad9439640f0af2eccf37b8Jim InghamThreadPlanStepOut::DoWillResume (StateType resume_state, bool current_plan)
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (m_step_out_plan_sp || m_step_through_inline_plan_sp)
34243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        return true;
34343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_return_bp_id == LLDB_INVALID_BREAK_ID)
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (current_plan)
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
349f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        Breakpoint *return_bp = m_thread.CalculateTarget()->GetBreakpointByID(m_return_bp_id).get();
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (return_bp != NULL)
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return_bp->SetEnabled (true);
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOut::WillStop ()
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (m_return_bp_id != LLDB_INVALID_BREAK_ID)
36043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    {
361f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        Breakpoint *return_bp = m_thread.CalculateTarget()->GetBreakpointByID(m_return_bp_id).get();
36243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        if (return_bp != NULL)
36343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            return_bp->SetEnabled (false);
36443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    }
36543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanStepOut::MischiefManaged ()
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (IsPlanComplete())
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Did I reach my breakpoint?  If so I'm done.
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        //
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // I also check the stack depth, since if we've blown past the breakpoint for some
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // reason and we're now stopping for some other reason altogether, then we're done
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // with this step out operation.
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
380952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton        Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (log)
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            log->Printf("Completed step out plan.");
38343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        if (m_return_bp_id != LLDB_INVALID_BREAK_ID)
38443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        {
385f4124deeb9532044a38c0774ced872f2709347daGreg Clayton            m_thread.CalculateTarget()->RemoveBreakpointByID (m_return_bp_id);
38643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            m_return_bp_id = LLDB_INVALID_BREAK_ID;
38743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        }
38843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ThreadPlan::MischiefManaged ();
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Inghambool
39943d390617a5a03ff42894fa0ad121b9335fa4dbcJim InghamThreadPlanStepOut::QueueInlinedStepPlan (bool queue_now)
40043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham{
40143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    // Now figure out the range of this inlined block, and set up a "step through range"
40243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    // plan for that.  If we've been provided with a context, then use the block in that
40343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    // context.
40443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    StackFrameSP immediate_return_from_sp (m_thread.GetStackFrameAtIndex (0));
40543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (!immediate_return_from_sp)
40643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        return false;
40743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
408952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
40943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (log)
41043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    {
41143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        StreamString s;
41243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        immediate_return_from_sp->Dump(&s, true, false);
41343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        log->Printf("Queuing inlined frame to step past: %s.", s.GetData());
41443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    }
41543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
41643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    Block *from_block = immediate_return_from_sp->GetFrameBlock();
41743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    if (from_block)
41843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    {
41943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        Block *inlined_block = from_block->GetContainingInlinedBlock();
42043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        if (inlined_block)
42143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        {
42243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            size_t num_ranges = inlined_block->GetNumRanges();
42343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            AddressRange inline_range;
42443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            if (inlined_block->GetRangeAtIndex(0, inline_range))
42543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            {
42643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                SymbolContext inlined_sc;
42743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                inlined_block->CalculateSymbolContext(&inlined_sc);
428c3ba2af1e0e1698a580d4d70be4b059ec2f991e0Jim Ingham                inlined_sc.target_sp = GetTarget().shared_from_this();
42943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                RunMode run_mode = m_stop_others ? lldb::eOnlyThisThread : lldb::eAllThreads;
43043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                ThreadPlanStepOverRange *step_through_inline_plan_ptr = new ThreadPlanStepOverRange(m_thread,
43143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                                                                                                    inline_range,
43243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                                                                                                    inlined_sc,
43343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                                                                                                    run_mode);
43443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                step_through_inline_plan_ptr->SetOkayToDiscard(true);
43543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                StreamString errors;
43643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                if (!step_through_inline_plan_ptr->ValidatePlan(&errors))
43743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                {
43843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    //FIXME: Log this failure.
43943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    delete step_through_inline_plan_ptr;
44043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    return false;
44143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                }
44243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
44343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                for (size_t i = 1; i < num_ranges; i++)
44443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                {
44543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    if (inlined_block->GetRangeAtIndex (i, inline_range))
44643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                        step_through_inline_plan_ptr->AddRange (inline_range);
44743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                }
44843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                m_step_through_inline_plan_sp.reset (step_through_inline_plan_ptr);
44943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                if (queue_now)
45043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                    m_thread.QueueThreadPlan (m_step_through_inline_plan_sp, false);
45143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                return true;
45243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham            }
45343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham        }
45443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    }
45543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
45643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    return false;
45743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham}
4581586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
4591586d9720002e407a3a097baf302de5fa4ca9c1bJim Inghamvoid
4601586d9720002e407a3a097baf302de5fa4ca9c1bJim InghamThreadPlanStepOut::CalculateReturnValue ()
4611586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham{
4621586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    if (m_return_valobj_sp)
4631586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        return;
4641586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
4651586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    if (m_immediate_step_from_function != NULL)
4661586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    {
46752f792329be5db8e38961350589e97e8f2823acdGreg Clayton        ClangASTType return_clang_type = m_immediate_step_from_function->GetClangType().GetFunctionReturnType();
46852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        if (return_clang_type)
4691586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        {
470f4124deeb9532044a38c0774ced872f2709347daGreg Clayton            lldb::ABISP abi_sp = m_thread.GetProcess()->GetABI();
4711586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham            if (abi_sp)
47252f792329be5db8e38961350589e97e8f2823acdGreg Clayton                m_return_valobj_sp = abi_sp->GetReturnValueObject(m_thread, return_clang_type);
4731586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        }
4741586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    }
4751586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham}
47688e3de205708f14431559072ca258899b5ac31ccJim Ingham
47788e3de205708f14431559072ca258899b5ac31ccJim Inghambool
47888e3de205708f14431559072ca258899b5ac31ccJim InghamThreadPlanStepOut::IsPlanStale()
47988e3de205708f14431559072ca258899b5ac31ccJim Ingham{
48088e3de205708f14431559072ca258899b5ac31ccJim Ingham    // If we are still lower on the stack than the frame we are returning to, then
48188e3de205708f14431559072ca258899b5ac31ccJim Ingham    // there's something for us to do.  Otherwise, we're stale.
48288e3de205708f14431559072ca258899b5ac31ccJim Ingham
48388e3de205708f14431559072ca258899b5ac31ccJim Ingham    StackID frame_zero_id = m_thread.GetStackFrameAtIndex(0)->GetStackID();
48488e3de205708f14431559072ca258899b5ac31ccJim Ingham    if (frame_zero_id < m_step_out_to_id)
48588e3de205708f14431559072ca258899b5ac31ccJim Ingham        return false;
48688e3de205708f14431559072ca258899b5ac31ccJim Ingham    else
48788e3de205708f14431559072ca258899b5ac31ccJim Ingham        return true;
48888e3de205708f14431559072ca258899b5ac31ccJim Ingham}
48988e3de205708f14431559072ca258899b5ac31ccJim Ingham
490