aboutsummaryrefslogtreecommitdiff
path: root/include/lldb/Target/StopInfo.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/lldb/Target/StopInfo.h')
-rw-r--r--include/lldb/Target/StopInfo.h227
1 files changed, 227 insertions, 0 deletions
diff --git a/include/lldb/Target/StopInfo.h b/include/lldb/Target/StopInfo.h
new file mode 100644
index 000000000000..3435d392e2b9
--- /dev/null
+++ b/include/lldb/Target/StopInfo.h
@@ -0,0 +1,227 @@
+//===-- StopInfo.h ----------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef liblldb_StopInfo_h_
+#define liblldb_StopInfo_h_
+
+// C Includes
+// C++ Includes
+#include <string>
+
+// Other libraries and framework includes
+// Project includes
+#include "lldb/lldb-public.h"
+#include "lldb/Target/Process.h"
+
+namespace lldb_private {
+
+class StopInfo
+{
+ friend class Process::ProcessEventData;
+ friend class ThreadPlanBase;
+
+public:
+ //------------------------------------------------------------------
+ // Constructors and Destructors
+ //------------------------------------------------------------------
+ StopInfo (Thread &thread, uint64_t value);
+
+ virtual ~StopInfo()
+ {
+ }
+
+
+ bool
+ IsValid () const;
+
+ void
+ SetThread (const lldb::ThreadSP &thread_sp)
+ {
+ m_thread_wp = thread_sp;
+ }
+
+ lldb::ThreadSP
+ GetThread() const
+ {
+ return m_thread_wp.lock();
+ }
+
+ // The value of the StopInfo depends on the StopReason.
+ // StopReason Meaning
+ // ----------------------------------------------
+ // eStopReasonBreakpoint BreakpointSiteID
+ // eStopReasonSignal Signal number
+ // eStopReasonWatchpoint WatchpointLocationID
+ // eStopReasonPlanComplete No significance
+
+ uint64_t
+ GetValue() const
+ {
+ return m_value;
+ }
+
+ virtual lldb::StopReason
+ GetStopReason () const = 0;
+
+ // ShouldStopSynchronous will get called before any thread plans are consulted, and if it says we should
+ // resume the target, then we will just immediately resume. This should not run any code in or resume the
+ // target.
+
+ virtual bool
+ ShouldStopSynchronous (Event *event_ptr)
+ {
+ return true;
+ }
+
+ void
+ OverrideShouldNotify (bool override_value)
+ {
+ m_override_should_notify = override_value ? eLazyBoolYes : eLazyBoolNo;
+ }
+
+ // If should stop returns false, check if we should notify of this event
+ virtual bool
+ ShouldNotify (Event *event_ptr)
+ {
+ if (m_override_should_notify == eLazyBoolCalculate)
+ return DoShouldNotify (event_ptr);
+ else
+ return m_override_should_notify == eLazyBoolYes;
+ }
+
+ virtual void
+ WillResume (lldb::StateType resume_state)
+ {
+ // By default, don't do anything
+ }
+
+ virtual const char *
+ GetDescription ()
+ {
+ return m_description.c_str();
+ }
+
+ virtual void
+ SetDescription (const char *desc_cstr)
+ {
+ if (desc_cstr && desc_cstr[0])
+ m_description.assign (desc_cstr);
+ else
+ m_description.clear();
+ }
+
+ // Sometimes the thread plan logic will know that it wants a given stop to stop or not,
+ // regardless of what the ordinary logic for that StopInfo would dictate. The main example
+ // of this is the ThreadPlanCallFunction, which for instance knows - based on how that particular
+ // expression was executed - whether it wants all breakpoints to auto-continue or not.
+ // Use OverrideShouldStop on the StopInfo to implement this.
+
+ void
+ OverrideShouldStop (bool override_value)
+ {
+ m_override_should_stop = override_value ? eLazyBoolYes : eLazyBoolNo;
+ }
+
+ bool
+ GetOverrideShouldStop()
+ {
+ return m_override_should_stop != eLazyBoolCalculate;
+ }
+
+ bool
+ GetOverriddenShouldStopValue ()
+ {
+ return m_override_should_stop == eLazyBoolYes;
+ }
+
+ static lldb::StopInfoSP
+ CreateStopReasonWithBreakpointSiteID (Thread &thread, lldb::break_id_t break_id);
+
+ // This creates a StopInfo for the thread where the should_stop is already set, and won't be recalculated.
+ static lldb::StopInfoSP
+ CreateStopReasonWithBreakpointSiteID (Thread &thread, lldb::break_id_t break_id, bool should_stop);
+
+ static lldb::StopInfoSP
+ CreateStopReasonWithWatchpointID (Thread &thread, lldb::break_id_t watch_id);
+
+ static lldb::StopInfoSP
+ CreateStopReasonWithSignal (Thread &thread, int signo);
+
+ static lldb::StopInfoSP
+ CreateStopReasonToTrace (Thread &thread);
+
+ static lldb::StopInfoSP
+ CreateStopReasonWithPlan (lldb::ThreadPlanSP &plan, lldb::ValueObjectSP return_valobj_sp);
+
+ static lldb::StopInfoSP
+ CreateStopReasonWithException (Thread &thread, const char *description);
+
+ static lldb::StopInfoSP
+ CreateStopReasonWithExec (Thread &thread);
+
+ static lldb::ValueObjectSP
+ GetReturnValueObject (lldb::StopInfoSP &stop_info_sp);
+
+protected:
+ // Perform any action that is associated with this stop. This is done as the
+ // Event is removed from the event queue. ProcessEventData::DoOnRemoval does the job.
+
+ virtual void
+ PerformAction (Event *event_ptr)
+ {
+ }
+
+ virtual bool
+ DoShouldNotify (Event *event_ptr)
+ {
+ return false;
+ }
+
+ // Stop the thread by default. Subclasses can override this to allow
+ // the thread to continue if desired. The ShouldStop method should not do anything
+ // that might run code. If you need to run code when deciding whether to stop
+ // at this StopInfo, that must be done in the PerformAction.
+ // The PerformAction will always get called before the ShouldStop. This is done by the
+ // ProcessEventData::DoOnRemoval, though the ThreadPlanBase needs to consult this later on.
+ virtual bool
+ ShouldStop (Event *event_ptr)
+ {
+ return true;
+ }
+
+ //------------------------------------------------------------------
+ // Classes that inherit from StackID can see and modify these
+ //------------------------------------------------------------------
+ lldb::ThreadWP m_thread_wp; // The thread corresponding to the stop reason.
+ uint32_t m_stop_id; // The process stop ID for which this stop info is valid
+ uint32_t m_resume_id; // This is the resume ID when we made this stop ID.
+ uint64_t m_value; // A generic value that can be used for things pertaining to this stop info
+ std::string m_description; // A textual description describing this stop.
+ LazyBool m_override_should_notify;
+ LazyBool m_override_should_stop;
+
+ // This determines whether the target has run since this stop info.
+ // N.B. running to evaluate a user expression does not count.
+ bool HasTargetRunSinceMe ();
+
+ // MakeStopInfoValid is necessary to allow saved stop infos to resurrect themselves as valid.
+ // It should only be used by Thread::RestoreThreadStateFromCheckpoint and to make sure the one-step
+ // needed for before-the-fact watchpoints does not prevent us from stopping
+ void
+ MakeStopInfoValid ();
+
+private:
+ friend class Thread;
+
+ DISALLOW_COPY_AND_ASSIGN (StopInfo);
+};
+
+} // namespace lldb_private
+
+#endif // liblldb_StopInfo_h_