124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ThreadPlanStepOut.h -------------------------------------*- 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#ifndef liblldb_ThreadPlanStepOut_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_ThreadPlanStepOut_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlan.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ThreadPlanStepOut : public ThreadPlan
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
2543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    ThreadPlanStepOut (Thread &thread,
2643d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                       SymbolContext *addr_context,
2743d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                       bool first_insn,
2843d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                       bool stop_others,
2943d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                       Vote stop_vote,
3043d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                       Vote run_vote,
3143d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham                       uint32_t frame_idx);
3243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ~ThreadPlanStepOut ();
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void GetDescription (Stream *s, lldb::DescriptionLevel level);
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool ValidatePlan (Stream *error);
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool ShouldStop (Event *event_ptr);
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool StopOthers ();
39745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    virtual lldb::StateType GetPlanRunState ();
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool WillStop ();
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool MischiefManaged ();
4243d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    virtual void DidPush();
4388e3de205708f14431559072ca258899b5ac31ccJim Ingham    virtual bool IsPlanStale();
441586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
451586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    virtual lldb::ValueObjectSP GetReturnValueObject()
461586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    {
471586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham        return m_return_valobj_sp;
481586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    }
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
506507dd90b5d27662537caee49a3a3cc236f85a53Jim Inghamprotected:
517c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    virtual bool DoPlanExplainsStop (Event *event_ptr);
527c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    virtual bool DoWillResume (lldb::StateType resume_state, bool current_plan);
5343d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    bool QueueInlinedStepPlan (bool queue_now);
54441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContext *m_step_from_context;
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::addr_t m_step_from_insn;
58441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham    StackID  m_step_out_to_id;
59441e3b9e8bed8c67afd5e520966d7ca16579eac4Jim Ingham    StackID  m_immediate_step_from_id;
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::break_id_t m_return_bp_id;
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::addr_t m_return_addr;
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool m_first_insn;
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool m_stop_others;
6443d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    lldb::ThreadPlanSP m_step_through_inline_plan_sp;
6543d390617a5a03ff42894fa0ad121b9335fa4dbcJim Ingham    lldb::ThreadPlanSP m_step_out_plan_sp;
6652f792329be5db8e38961350589e97e8f2823acdGreg Clayton    Function *m_immediate_step_from_function;
671586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    lldb::ValueObjectSP m_return_valobj_sp;
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    friend lldb::ThreadPlanSP
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Thread::QueueThreadPlanForStepOut (bool abort_other_plans,
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                       SymbolContext *addr_context,
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                       bool first_insn,
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                       bool stop_others,
74b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                       Vote stop_vote,
75b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                       Vote run_vote,
761ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                                       uint32_t frame_idx);
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Need an appropriate marker for the current stack so we can tell step out
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // from step in.
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
811586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    void
821586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    CalculateReturnValue();
831586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (ThreadPlanStepOut);
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_ThreadPlanStepOut_h_
91