#ifndef liblldb_Watchpoint_h_
#define liblldb_Watchpoint_h_
#include <list>
#include <string>
#include "lldb/lldb-private.h"
#include "lldb/Target/Target.h"
#include "lldb/Core/UserID.h"
#include "lldb/Breakpoint/WatchpointOptions.h"
#include "lldb/Breakpoint/StoppointLocation.h"
namespace lldb_private {
class Watchpoint :
public std::enable_shared_from_this<Watchpoint>,
public StoppointLocation
{
public:
class WatchpointEventData :
public EventData
{
public:
static const ConstString &
GetFlavorString ();
virtual const ConstString &
GetFlavor () const;
WatchpointEventData (lldb::WatchpointEventType sub_type,
const lldb::WatchpointSP &new_watchpoint_sp);
virtual
~WatchpointEventData();
lldb::WatchpointEventType
GetWatchpointEventType () const;
lldb::WatchpointSP &
GetWatchpoint ();
virtual void
Dump (Stream *s) const;
static lldb::WatchpointEventType
GetWatchpointEventTypeFromEvent (const lldb::EventSP &event_sp);
static lldb::WatchpointSP
GetWatchpointFromEvent (const lldb::EventSP &event_sp);
static const WatchpointEventData *
GetEventDataFromEvent (const Event *event_sp);
private:
lldb::WatchpointEventType m_watchpoint_event;
lldb::WatchpointSP m_new_watchpoint_sp;
DISALLOW_COPY_AND_ASSIGN (WatchpointEventData);
};
Watchpoint (Target& target, lldb::addr_t addr, uint32_t size, const ClangASTType *type, bool hardware = true);
~Watchpoint ();
void
IncrementFalseAlarmsAndReviseHitCount();
bool
IsEnabled () const;
void
SetEnabled (bool enabled, bool notify = true);
virtual bool
IsHardware () const;
virtual bool
ShouldStop (StoppointCallbackContext *context);
bool WatchpointRead () const;
bool WatchpointWrite () const;
uint32_t GetIgnoreCount () const;
void SetIgnoreCount (uint32_t n);
void SetWatchpointType (uint32_t type, bool notify = true);
void SetDeclInfo (const std::string &str);
std::string GetWatchSpec();
void SetWatchSpec (const std::string &str);
bool IsWatchVariable() const;
void SetWatchVariable(bool val);
bool CaptureWatchedValue (const ExecutionContext &exe_ctx);
void GetDescription (Stream *s, lldb::DescriptionLevel level);
void Dump (Stream *s) const;
void DumpSnapshots (Stream *s, const char * prefix = NULL) const;
void DumpWithLevel (Stream *s, lldb::DescriptionLevel description_level) const;
Target &GetTarget() { return m_target; }
const Error &GetError() { return m_error; }
WatchpointOptions *
GetOptions () { return &m_options; }
void
SetCallback (WatchpointHitCallback callback,
void *callback_baton,
bool is_synchronous = false);
void
SetCallback (WatchpointHitCallback callback,
const lldb::BatonSP &callback_baton_sp,
bool is_synchronous = false);
void ClearCallback();
bool
InvokeCallback (StoppointCallbackContext *context);
void SetCondition (const char *condition);
const char *GetConditionText () const;
void
TurnOnEphemeralMode();
void
TurnOffEphemeralMode();
bool
IsDisabledDuringEphemeralMode();
const ClangASTType &
GetClangASTType()
{
return m_type;
}
private:
friend class Target;
friend class WatchpointList;
void ResetHitCount() { m_hit_count = 0; }
Target &m_target;
bool m_enabled; bool m_is_hardware; bool m_is_watch_variable; bool m_is_ephemeral; uint32_t m_disabled_count; uint32_t m_watch_read:1, m_watch_write:1, m_watch_was_read:1, m_watch_was_written:1; uint32_t m_ignore_count; uint32_t m_false_alarms; std::string m_decl_str; std::string m_watch_spec_str; lldb::ValueObjectSP m_old_value_sp;
lldb::ValueObjectSP m_new_value_sp;
ClangASTType m_type;
Error m_error; WatchpointOptions m_options; bool m_being_created;
std::unique_ptr<ClangUserExpression> m_condition_ap;
void SetID(lldb::watch_id_t id) { m_loc_id = id; }
void
SendWatchpointChangedEvent (lldb::WatchpointEventType eventKind);
void
SendWatchpointChangedEvent (WatchpointEventData *data);
DISALLOW_COPY_AND_ASSIGN (Watchpoint);
};
}
#endif // liblldb_Watchpoint_h_