StopInfo.h revision 6561155acc9dee660de73e4aa8215839a06f01a7
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===-- StopInfo.h ----------------------------------------------*- C++ -*-===//
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//                     The LLVM Compiler Infrastructure
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// License. See LICENSE.TXT for details.
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//===----------------------------------------------------------------------===//
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef liblldb_StopInfo_h_
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define liblldb_StopInfo_h_
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// C Includes
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// C++ Includes
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string>
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Other libraries and framework includes
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Project includes
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "lldb/lldb-public.h"
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace lldb_private {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class StopInfo
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)public:
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //------------------------------------------------------------------
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Constructors and Destructors
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //------------------------------------------------------------------
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    StopInfo (Thread &thread, uint64_t value);
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    virtual ~StopInfo()
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    }
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    IsValid () const;
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    Thread &
4090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    GetThread()
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return m_thread;
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const Thread &
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    GetThread() const
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        return m_thread;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The value of the StopInfo depends on the StopReason.
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // StopReason                  Meaning
530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // ----------------------------------------------
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // eStopReasonBreakpoint       BreakpointSiteID
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // eStopReasonSignal           Signal number
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // eStopReasonWatchpoint       WatchpointSiteID
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // eStopReasonPlanComplete     No significance
580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    uint64_t
600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    GetValue() const
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    {
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        return m_value;
630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    virtual lldb::StopReason
660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    GetStopReason () const = 0;
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Perform any action that is associated with this stop.  This is done as the
690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // Event is removed from the event queue.
700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    virtual void
710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    PerformAction (Event *event_ptr)
720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    {
730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // Stop the thread by default. Subclasses can override this to allow
760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    // the thread to continue if desired.
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual bool
780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    ShouldStop (Event *event_ptr)
790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return true;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If should stop returns false, check if we should notify of this event
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual bool
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ShouldNotify (Event *event_ptr)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    {
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WillResume (lldb::StateType resume_state)
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    {
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        // By default, don't do anything
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual const char *
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    GetDescription ()
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    {
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        return m_description.c_str();
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    virtual void
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    SetDescription (const char *desc_cstr)
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    {
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        if (desc_cstr && desc_cstr[0])
1067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch            m_description.assign (desc_cstr);
107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        else
108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            m_description.clear();
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
1107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    static lldb::StopInfoSP
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    CreateStopReasonWithBreakpointSiteID (Thread &thread, lldb::break_id_t break_id);
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // This creates a StopInfo for the thread where the should_stop is already set, and won't be recalculated.
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    static lldb::StopInfoSP
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CreateStopReasonWithBreakpointSiteID (Thread &thread, lldb::break_id_t break_id, bool should_stop);
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    static lldb::StopInfoSP
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CreateStopReasonWithWatchpointID (Thread &thread, lldb::break_id_t watch_id);
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    static lldb::StopInfoSP
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CreateStopReasonWithSignal (Thread &thread, int signo);
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    static lldb::StopInfoSP
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    CreateStopReasonToTrace (Thread &thread);
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    static lldb::StopInfoSP
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CreateStopReasonWithPlan (lldb::ThreadPlanSP &plan);
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    static lldb::StopInfoSP
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CreateStopReasonWithException (Thread &thread, const char *description);
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)protected:
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    //------------------------------------------------------------------
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Classes that inherit from StackID can see and modify these
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //------------------------------------------------------------------
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Thread &        m_thread;   // The thread corresponding to the stop reason.
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    uint32_t        m_stop_id;  // The process stop ID for which this stop info is valid
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    uint64_t        m_value;    // A generic value that can be used for things pertaining to this stop info
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::string     m_description; // A textual description describing this stop.
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdochprivate:
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    friend class Thread;
1435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // MakeStopInfoValid is necessary to allow saved stop infos to resurrect themselves as valid.  It should
1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // only need to be called by Thread::RestoreThreadStateFromCheckpoint.
1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    void
1475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    MakeStopInfoValid ();
1485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    DISALLOW_COPY_AND_ASSIGN (StopInfo);
1505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu};
1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace lldb_private
1545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#endif  // liblldb_StopInfo_h_
1565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu