Home | History | Annotate | Download | only in Target
      1 //===-- ThreadPlanShouldStopHere.h ------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef liblldb_ThreadPlanShouldStopHere_h_
     11 #define liblldb_ThreadPlanShouldStopHere_h_
     12 
     13 // C Includes
     14 // C++ Includes
     15 // Other libraries and framework includes
     16 // Project includes
     17 #include "lldb/Target/ThreadPlan.h"
     18 
     19 namespace lldb_private {
     20 
     21 // This is an interface that ThreadPlans can adopt to allow flexible modifications of the behavior
     22 // when a thread plan comes to a place where it would ordinarily stop.  If such modification makes
     23 // sense for your plan, inherit from this class, and when you would be about to stop (in your ShouldStop
     24 // method), call InvokeShouldStopHereCallback, and if that returns a non-NULL plan, execute that
     25 // plan instead of stopping.
     26 //
     27 // The classic example of the use of this is ThreadPlanStepInRange not stopping in frames that have
     28 // no debug information.
     29 //
     30 // This class also defines a set of flags to control general aspects of this "ShouldStop" behavior.
     31 // A class implementing this protocol needs to define a default set of flags, and can provide access to
     32 // changing that default flag set if it wishes.
     33 
     34 class ThreadPlanShouldStopHere
     35 {
     36 public:
     37     enum
     38     {
     39         eNone = 0,
     40         eAvoidInlines = (1 << 0),
     41         eAvoidNoDebug = (1 << 1)
     42     };
     43 
     44     //------------------------------------------------------------------
     45     // Constructors and Destructors
     46     //------------------------------------------------------------------
     47     ThreadPlanShouldStopHere (ThreadPlan *owner,
     48                               ThreadPlanShouldStopHereCallback callback = NULL,
     49                               void *baton = NULL);
     50     virtual
     51     ~ThreadPlanShouldStopHere();
     52 
     53     void
     54     SetShouldStopHereCallback (ThreadPlanShouldStopHereCallback callback, void *baton);
     55 
     56     lldb::ThreadPlanSP
     57     InvokeShouldStopHereCallback ();
     58 
     59     lldb_private::Flags &
     60     GetFlags ()
     61     {
     62         return m_flags;
     63     }
     64 
     65     const lldb_private::Flags &
     66     GetFlags () const
     67     {
     68         return m_flags;
     69     }
     70 
     71 protected:
     72     // Implement this, and call it in the plan's constructor to set the default flags.
     73     virtual void SetFlagsToDefault () = 0;
     74 
     75     //------------------------------------------------------------------
     76     // Classes that inherit from ThreadPlanShouldStopHere can see and modify these
     77     //------------------------------------------------------------------
     78     ThreadPlanShouldStopHereCallback m_callback;
     79     void * m_baton;
     80     ThreadPlan *m_owner;
     81     lldb_private::Flags m_flags;
     82 
     83 private:
     84     //------------------------------------------------------------------
     85     // For ThreadPlanShouldStopHere only
     86     //------------------------------------------------------------------
     87 
     88     DISALLOW_COPY_AND_ASSIGN (ThreadPlanShouldStopHere);
     89 
     90 };
     91 
     92 } // namespace lldb_private
     93 
     94 #endif  // liblldb_ThreadPlanShouldStopHere_h_
     95