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