124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ThreadPlanShouldStopHere.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_ThreadPlanShouldStopHere_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_ThreadPlanShouldStopHere_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/ThreadPlan.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This is an interface that ThreadPlans can adopt to allow flexible modifications of the behavior
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// when a thread plan comes to a place where it would ordinarily stop.  If such modification makes
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// sense for your plan, inherit from this class, and when you would be about to stop (in your ShouldStop
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// method), call InvokeShouldStopHereCallback, and if that returns a non-NULL plan, execute that
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// plan instead of stopping.
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The classic example of the use of this is ThreadPlanStepInRange not stopping in frames that have
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// no debug information.
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This class also defines a set of flags to control general aspects of this "ShouldStop" behavior.
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// A class implementing this protocol needs to define a default set of flags, and can provide access to
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// changing that default flag set if it wishes.
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ThreadPlanShouldStopHere
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    enum
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eNone = 0,
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        eAvoidInlines = (1 << 0),
4154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        eAvoidNoDebug = (1 << 1)
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ThreadPlanShouldStopHere (ThreadPlan *owner,
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              ThreadPlanShouldStopHereCallback callback = NULL,
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              void *baton = NULL);
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~ThreadPlanShouldStopHere();
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetShouldStopHereCallback (ThreadPlanShouldStopHereCallback callback, void *baton);
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    lldb::ThreadPlanSP
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    InvokeShouldStopHereCallback ();
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::Flags &
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFlags ()
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_flags;
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const lldb_private::Flags &
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFlags () const
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_flags;
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Implement this, and call it in the plan's constructor to set the default flags.
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void SetFlagsToDefault () = 0;
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Classes that inherit from ThreadPlanShouldStopHere can see and modify these
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ThreadPlanShouldStopHereCallback m_callback;
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void * m_baton;
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ThreadPlan *m_owner;
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::Flags m_flags;
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // For ThreadPlanShouldStopHere only
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (ThreadPlanShouldStopHere);
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_ThreadPlanShouldStopHere_h_
95