ThreadPlanStepOut.cpp revision 04cc48eb5cff32268a822b57f87590c9dc2643f8
1f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson//===-- ThreadPlanStepOut.cpp -----------------------------------*- C++ -*-===//
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//                     The LLVM Compiler Infrastructure
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// This file is distributed under the University of Illinois Open Source
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// License. See LICENSE.TXT for details.
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//
8f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson//===----------------------------------------------------------------------===//
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
10f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson#include "lldb/Target/ThreadPlanStepOut.h"
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// C Includes
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// C++ Includes
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// Other libraries and framework includes
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project// Project includes
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "lldb/Breakpoint/Breakpoint.h"
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "lldb/lldb-private-log.h"
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "lldb/Core/Log.h"
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "lldb/Core/Value.h"
2057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson#include "lldb/Core/ValueObjectConstResult.h"
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "lldb/Symbol/Block.h"
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "lldb/Symbol/Function.h"
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "lldb/Symbol/Type.h"
2457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson#include "lldb/Target/Process.h"
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "lldb/Target/RegisterContext.h"
2657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson#include "lldb/Target/StopInfo.h"
2757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson#include "lldb/Target/Target.h"
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project#include "lldb/Target/ThreadPlanStepOverRange.h"
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectusing namespace lldb;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectusing namespace lldb_private;
3257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
33f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson//----------------------------------------------------------------------
3457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson// ThreadPlanStepOut: Step out of the current frame
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project//----------------------------------------------------------------------
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source ProjectThreadPlanStepOut::ThreadPlanStepOut
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project(
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    Thread &thread,
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    SymbolContext *context,
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    bool first_insn,
4157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    bool stop_others,
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    Vote stop_vote,
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    Vote run_vote,
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    uint32_t frame_idx
4557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson) :
4657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    ThreadPlan (ThreadPlan::eKindStepOut, "Step out", thread, stop_vote, run_vote),
4757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    m_step_from_context (context),
4857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    m_step_from_insn (LLDB_INVALID_ADDRESS),
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    m_return_bp_id (LLDB_INVALID_BREAK_ID),
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    m_return_addr (LLDB_INVALID_ADDRESS),
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    m_first_insn (first_insn),
5257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    m_stop_others (stop_others),
5357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    m_step_through_inline_plan_sp(),
5457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    m_step_out_plan_sp (),
5557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    m_immediate_step_from_function(NULL)
5657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
5757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson{
5857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    m_step_from_insn = m_thread.GetRegisterContext()->GetPC(0);
5957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
6057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    StackFrameSP return_frame_sp (m_thread.GetStackFrameAtIndex(frame_idx + 1));
6157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    StackFrameSP immediate_return_from_sp (m_thread.GetStackFrameAtIndex (frame_idx));
6257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
6357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    if (!return_frame_sp || !immediate_return_from_sp)
6457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        return; // we can't do anything here.  ValidatePlan() will return false.
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
6657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    m_step_out_to_id = return_frame_sp->GetStackID();
6757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    m_immediate_step_from_id = immediate_return_from_sp->GetStackID();
6857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
6957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    StackID frame_zero_id = m_thread.GetStackFrameAtIndex(0)->GetStackID();
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // If the frame directly below the one we are returning to is inlined, we have to be
7257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    // a little more careful.  It is non-trivial to determine the real "return code address" for
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // an inlined frame, so we have to work our way to that frame and then step out.
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    if (immediate_return_from_sp && immediate_return_from_sp->IsInlined())
7557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    {
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (frame_idx > 0)
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        {
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // First queue a plan that gets us to this inlined frame, and when we get there we'll queue a second
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // plan that walks us out of this frame.
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            m_step_out_plan_sp.reset (new ThreadPlanStepOut(m_thread,
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                                            NULL,
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                                            false,
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                                            stop_others,
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                                            eVoteNoOpinion,
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                                            eVoteNoOpinion,
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                                            frame_idx - 1));
8757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        else
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        {
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // If we're already at the inlined frame we're stepping through, then just do that now.
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            QueueInlinedStepPlan(false);
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    else if (return_frame_sp)
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    {
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Find the return address and set a breakpoint there:
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // FIXME - can we do this more securely if we know first_insn?
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        m_return_addr = return_frame_sp->GetFrameCodeAddress().GetLoadAddress(&m_thread.GetProcess()->GetTarget());
10157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (m_return_addr == LLDB_INVALID_ADDRESS)
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return;
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Breakpoint *return_bp = m_thread.CalculateTarget()->CreateBreakpoint (m_return_addr, true).get();
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (return_bp != NULL)
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        {
10857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            return_bp->SetThreadID(m_thread.GetID());
10957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            m_return_bp_id = return_bp->GetID();
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return_bp->SetBreakpointKind ("step-out");
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (immediate_return_from_sp)
11457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        {
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            const SymbolContext &sc = immediate_return_from_sp->GetSymbolContext(eSymbolContextFunction);
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (sc.function)
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            {
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                m_immediate_step_from_function = sc.function;
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
12457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
12557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilsonvoid
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source ProjectThreadPlanStepOut::DidPush()
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project{
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    if (m_step_out_plan_sp)
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        m_thread.QueueThreadPlan(m_step_out_plan_sp, false);
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    else if (m_step_through_inline_plan_sp)
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        m_thread.QueueThreadPlan(m_step_through_inline_plan_sp, false);
13257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson}
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source ProjectThreadPlanStepOut::~ThreadPlanStepOut ()
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project{
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    if (m_return_bp_id != LLDB_INVALID_BREAK_ID)
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        m_thread.CalculateTarget()->RemoveBreakpointByID(m_return_bp_id);
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectvoid
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source ProjectThreadPlanStepOut::GetDescription (Stream *s, lldb::DescriptionLevel level)
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project{
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    if (level == lldb::eDescriptionLevelBrief)
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        s->Printf ("step out");
14557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    else
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    {
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (m_step_out_plan_sp)
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            s->Printf ("Stepping out to inlined frame so we can walk through it.");
14957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        else if (m_step_through_inline_plan_sp)
15057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            s->Printf ("Stepping out by stepping through inlined function.");
15157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        else
15257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            s->Printf ("Stepping out from address 0x%" PRIx64 " to return address 0x%" PRIx64 " using breakpoint site %d",
15357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                       (uint64_t)m_step_from_insn,
15457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                       (uint64_t)m_return_addr,
15557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                       m_return_bp_id);
15657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    }
15757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson}
15857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
15957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilsonbool
16057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse WilsonThreadPlanStepOut::ValidatePlan (Stream *error)
16157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson{
16257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    if (m_step_out_plan_sp)
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return m_step_out_plan_sp->ValidatePlan (error);
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    else if (m_step_through_inline_plan_sp)
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return m_step_through_inline_plan_sp->ValidatePlan (error);
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    else if (m_return_bp_id == LLDB_INVALID_BREAK_ID)
16757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    {
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (error)
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            error->PutCString("Could not create return address breakpoint.");
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    else
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectbool
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source ProjectThreadPlanStepOut::DoPlanExplainsStop (Event *event_ptr)
17857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson{
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // If one of our child plans just finished, then we do explain the stop.
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    if (m_step_out_plan_sp)
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    {
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (m_step_out_plan_sp->MischiefManaged())
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        {
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // If this one is done, then we are all done.
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            CalculateReturnValue();
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            SetPlanComplete();
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
18957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        else
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    else if (m_step_through_inline_plan_sp)
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    {
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (m_step_through_inline_plan_sp->MischiefManaged())
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        else
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // We don't explain signals or breakpoints (breakpoints that handle stepping in or
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // out will be handled by a child plan.
20257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    StopInfoSP stop_info_sp = GetPrivateStopInfo ();
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    if (stop_info_sp)
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    {
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        StopReason reason = stop_info_sp->GetStopReason();
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        switch (reason)
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        {
20957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        case eStopReasonBreakpoint:
21057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        {
21157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            // If this is OUR breakpoint, we're fine, otherwise we don't know why this happened...
212f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson            BreakpointSiteSP site_sp (m_thread.GetProcess()->GetBreakpointSiteList().FindByID (stop_info_sp->GetValue()));
21357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            if (site_sp && site_sp->IsBreakpointAtThisSite (m_return_bp_id))
21457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            {
21557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                bool done;
21657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
21757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                StackID frame_zero_id = m_thread.GetStackFrameAtIndex(0)->GetStackID();
21857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
21957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                if (m_step_out_to_id == frame_zero_id)
22057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    done = true;
22157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                else if (m_step_out_to_id < frame_zero_id)
22257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                {
22357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    // Either we stepped past the breakpoint, or the stack ID calculation
22457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    // was incorrect and we should probably stop.
22557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    done = true;
22657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                }
22757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                else
22857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                {
22957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    if (m_immediate_step_from_id < frame_zero_id)
23057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        done = true;
23157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    else
23257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                        done = false;
23357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                }
23457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
23557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                if (done)
23657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                {
23757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    CalculateReturnValue();
23857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    SetPlanComplete();
23957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                }
24057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
24157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                // If there was only one owner, then we're done.  But if we also hit some
24257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                // user breakpoint on our way out, we should mark ourselves as done, but
24357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                // also not claim to explain the stop, since it is more important to report
24457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                // the user breakpoint than the step out completion.
245f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson
246f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson                if (site_sp->GetNumberOfOwners() == 1)
247f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson                    return true;
248f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson
249f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson            }
250f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson            return false;
251f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson        }
252f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson        case eStopReasonWatchpoint:
253f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson        case eStopReasonSignal:
254f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson        case eStopReasonException:
255f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson        case eStopReasonExec:
256f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson        case eStopReasonThreadExiting:
257f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson            return false;
258f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson
259f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson        default:
260f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson            return true;
261f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson        }
26257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    }
263f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson    return true;
264f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson}
265f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson
266f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilsonbool
26757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse WilsonThreadPlanStepOut::ShouldStop (Event *event_ptr)
268f7c6911047d63bc76292f55ce538da32818dd931Jesse Wilson{
26957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        if (IsPlanComplete())
27057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            return true;
27157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
27257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        bool done;
27357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
27457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        StackID frame_zero_id = m_thread.GetStackFrameAtIndex(0)->GetStackID();
27557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        if (frame_zero_id < m_step_out_to_id)
27657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            done = false;
27757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        else
27857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            done = true;
27957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
28057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        if (done)
28157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        {
28257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            CalculateReturnValue();
28357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            SetPlanComplete();
28457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            return true;
28557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
28657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        else
28757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        {
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (m_step_out_plan_sp)
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            {
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (m_step_out_plan_sp->MischiefManaged())
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                {
29257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    // Now step through the inlined stack we are in:
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (QueueInlinedStepPlan(true))
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    {
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return false;
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
29757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                    else
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    {
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        CalculateReturnValue();
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        SetPlanComplete ();
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return true;
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
30457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson                else
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return m_step_out_plan_sp->ShouldStop(event_ptr);
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            else if (m_step_through_inline_plan_sp)
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            {
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (m_step_through_inline_plan_sp->MischiefManaged())
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                {
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // We don't calculate the return value here because we don't know how to.
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // But in case we had a return value sitting around from our process in
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // getting here, let's clear it out.
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    m_return_valobj_sp.reset();
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    SetPlanComplete();
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return true;
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                else
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return m_step_through_inline_plan_sp->ShouldStop(event_ptr);
32057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            }
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            else
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return false;
32357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectbool
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source ProjectThreadPlanStepOut::StopOthers ()
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project{
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    return m_stop_others;
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
33157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
33257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse WilsonStateType
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source ProjectThreadPlanStepOut::GetPlanRunState ()
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project{
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    return eStateRunning;
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
33857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilsonbool
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source ProjectThreadPlanStepOut::DoWillResume (StateType resume_state, bool current_plan)
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project{
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    if (m_step_out_plan_sp || m_step_through_inline_plan_sp)
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return true;
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    if (m_return_bp_id == LLDB_INVALID_BREAK_ID)
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
34757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    if (current_plan)
34857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    {
34957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        Breakpoint *return_bp = m_thread.CalculateTarget()->GetBreakpointByID(m_return_bp_id).get();
35057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        if (return_bp != NULL)
35157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            return_bp->SetEnabled (true);
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
35357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    return true;
35457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson}
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectbool
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source ProjectThreadPlanStepOut::WillStop ()
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project{
35957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    if (m_return_bp_id != LLDB_INVALID_BREAK_ID)
36057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    {
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Breakpoint *return_bp = m_thread.CalculateTarget()->GetBreakpointByID(m_return_bp_id).get();
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (return_bp != NULL)
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return_bp->SetEnabled (false);
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
36557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    return true;
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
36857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
36957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilsonbool
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source ProjectThreadPlanStepOut::MischiefManaged ()
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project{
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    if (IsPlanComplete())
37357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    {
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Did I reach my breakpoint?  If so I'm done.
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        //
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // I also check the stack depth, since if we've blown past the breakpoint for some
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // reason and we're now stopping for some other reason altogether, then we're done
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // with this step out operation.
37957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
38057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
38157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        if (log)
38257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            log->Printf("Completed step out plan.");
38357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        if (m_return_bp_id != LLDB_INVALID_BREAK_ID)
38457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        {
38557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson            m_thread.CalculateTarget()->RemoveBreakpointByID (m_return_bp_id);
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            m_return_bp_id = LLDB_INVALID_BREAK_ID;
38757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        }
38857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
38957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        ThreadPlan::MischiefManaged ();
39057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        return true;
39157995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    }
39257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    else
39357995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    {
39457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        return false;
39557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    }
39657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson}
39757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
39857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilsonbool
39957995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse WilsonThreadPlanStepOut::QueueInlinedStepPlan (bool queue_now)
40057995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson{
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Now figure out the range of this inlined block, and set up a "step through range"
40257995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    // plan for that.  If we've been provided with a context, then use the block in that
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // context.
40457995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    StackFrameSP immediate_return_from_sp (m_thread.GetStackFrameAtIndex (0));
40557995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    if (!immediate_return_from_sp)
40657995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson        return false;
40757995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson
40857995e8186b54515d5a03bf2ab104c3dc247f1b6Jesse Wilson    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    if (log)
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    {
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        StreamString s;
412        immediate_return_from_sp->Dump(&s, true, false);
413        log->Printf("Queuing inlined frame to step past: %s.", s.GetData());
414    }
415
416    Block *from_block = immediate_return_from_sp->GetFrameBlock();
417    if (from_block)
418    {
419        Block *inlined_block = from_block->GetContainingInlinedBlock();
420        if (inlined_block)
421        {
422            size_t num_ranges = inlined_block->GetNumRanges();
423            AddressRange inline_range;
424            if (inlined_block->GetRangeAtIndex(0, inline_range))
425            {
426                SymbolContext inlined_sc;
427                inlined_block->CalculateSymbolContext(&inlined_sc);
428                inlined_sc.target_sp = GetTarget().shared_from_this();
429                RunMode run_mode = m_stop_others ? lldb::eOnlyThisThread : lldb::eAllThreads;
430                ThreadPlanStepOverRange *step_through_inline_plan_ptr = new ThreadPlanStepOverRange(m_thread,
431                                                                                                    inline_range,
432                                                                                                    inlined_sc,
433                                                                                                    run_mode);
434                step_through_inline_plan_ptr->SetOkayToDiscard(true);
435                StreamString errors;
436                if (!step_through_inline_plan_ptr->ValidatePlan(&errors))
437                {
438                    //FIXME: Log this failure.
439                    delete step_through_inline_plan_ptr;
440                    return false;
441                }
442
443                for (size_t i = 1; i < num_ranges; i++)
444                {
445                    if (inlined_block->GetRangeAtIndex (i, inline_range))
446                        step_through_inline_plan_ptr->AddRange (inline_range);
447                }
448                m_step_through_inline_plan_sp.reset (step_through_inline_plan_ptr);
449                if (queue_now)
450                    m_thread.QueueThreadPlan (m_step_through_inline_plan_sp, false);
451                return true;
452            }
453        }
454    }
455
456    return false;
457}
458
459void
460ThreadPlanStepOut::CalculateReturnValue ()
461{
462    if (m_return_valobj_sp)
463        return;
464
465    if (m_immediate_step_from_function != NULL)
466    {
467        Type *return_type = m_immediate_step_from_function->GetType();
468        lldb::clang_type_t return_clang_type = m_immediate_step_from_function->GetReturnClangType();
469        if (return_type && return_clang_type)
470        {
471            ClangASTType ast_type (return_type->GetClangAST(), return_clang_type);
472
473            lldb::ABISP abi_sp = m_thread.GetProcess()->GetABI();
474            if (abi_sp)
475            {
476                m_return_valobj_sp = abi_sp->GetReturnValueObject(m_thread, ast_type);
477            }
478        }
479    }
480}
481
482bool
483ThreadPlanStepOut::IsPlanStale()
484{
485    // If we are still lower on the stack than the frame we are returning to, then
486    // there's something for us to do.  Otherwise, we're stale.
487
488    StackID frame_zero_id = m_thread.GetStackFrameAtIndex(0)->GetStackID();
489    if (frame_zero_id < m_step_out_to_id)
490        return false;
491    else
492        return true;
493}
494
495