blob: d2585b8348133334807414e97421d677f13e01a8 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- WatchpointLocation.cpp ----------------------------------*- 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#include "lldb/Breakpoint/WatchpointLocation.h"
11
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15// Project includes
16#include "lldb/Core/Stream.h"
17
18using namespace lldb;
19using namespace lldb_private;
20
Johnny Chenedda23f2011-09-06 02:52:28 +000021WatchpointLocation::WatchpointLocation (lldb::addr_t addr, size_t size, bool hardware) :
22 StoppointLocation (GetNextID(), addr, size, hardware),
Chris Lattner24943d22010-06-08 16:52:24 +000023 m_enabled(0),
24 m_watch_read(0),
25 m_watch_write(0),
26 m_watch_was_read(0),
27 m_watch_was_written(0),
28 m_ignore_count(0),
29 m_callback(NULL),
30 m_callback_baton(NULL)
31{
32}
33
34WatchpointLocation::~WatchpointLocation()
35{
36}
37
38break_id_t
39WatchpointLocation::GetNextID()
40{
41 static break_id_t g_next_ID = 0;
42 return ++g_next_ID;
43}
44
45bool
46WatchpointLocation::SetCallback (WatchpointHitCallback callback, void *callback_baton)
47{
48 m_callback = callback;
49 m_callback_baton = callback_baton;
50 return true;
51}
52
53
54// RETURNS - true if we should stop at this breakpoint, false if we
55// should continue.
56
57bool
58WatchpointLocation::BreakpointWasHit (StoppointCallbackContext *context)
59{
60 m_hit_count++;
61
62 if (m_hit_count > m_ignore_count)
63 {
64 uint32_t access = 0;
65 if (m_watch_was_read)
66 access |= LLDB_WATCH_TYPE_READ;
67 if (m_watch_was_written)
68 access |= LLDB_WATCH_TYPE_WRITE;
69 return m_callback(m_callback_baton, context, GetID(), access);
70 }
71 return false;
72}
73
74void
Johnny Chen34bbf852011-09-12 23:38:44 +000075WatchpointLocation::GetDescription (Stream *s, lldb::DescriptionLevel level)
76{
Johnny Chen95f41b82011-09-13 01:13:20 +000077 s->Printf(" ");
78 Dump(s);
Johnny Chen34bbf852011-09-12 23:38:44 +000079 return;
80}
81
82void
Chris Lattner24943d22010-06-08 16:52:24 +000083WatchpointLocation::Dump(Stream *s) const
84{
85 if (s == NULL)
86 return;
87
88 s->Printf("WatchpointLocation %u: tid = %4.4x addr = 0x%8.8llx size = %zu state = %s type = %s watchpoint (%s%s) hw_index = %i hit_count = %-4u ignore_count = %-4u callback = %8p baton = %8p",
89 GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +000090 (uint64_t)m_addr,
91 m_byte_size,
92 m_enabled ? "enabled " : "disabled",
93 IsHardware() ? "hardware" : "software",
94 m_watch_read ? "r" : "",
95 m_watch_write ? "w" : "",
96 GetHardwareIndex(),
97 GetHitCount(),
98 GetIgnoreCount(),
99 m_callback,
100 m_callback_baton);
101}
102
103bool
104WatchpointLocation::IsEnabled() const
105{
106 return m_enabled;
107}
108
109void
Johnny Chen21900fb2011-09-06 22:38:36 +0000110WatchpointLocation::SetEnabled(bool enabled)
Chris Lattner24943d22010-06-08 16:52:24 +0000111{
112 if (!enabled)
113 SetHardwareIndex(LLDB_INVALID_INDEX32);
114 m_enabled = enabled;
115}
116
117void
118WatchpointLocation::SetWatchpointType (uint32_t type)
119{
120 m_watch_read = (type & LLDB_WATCH_TYPE_READ) != 0;
121 m_watch_write = (type & LLDB_WATCH_TYPE_WRITE) != 0;
122}
123
124bool
125WatchpointLocation::WatchpointRead () const
126{
127 return m_watch_read != 0;
128}
129bool
130WatchpointLocation::WatchpointWrite () const
131{
132 return m_watch_write != 0;
133}
Greg Clayton54e7afa2010-07-09 20:39:50 +0000134uint32_t
Chris Lattner24943d22010-06-08 16:52:24 +0000135WatchpointLocation::GetIgnoreCount () const
136{
137 return m_ignore_count;
138}
139
140void
Greg Clayton54e7afa2010-07-09 20:39:50 +0000141WatchpointLocation::SetIgnoreCount (uint32_t n)
Chris Lattner24943d22010-06-08 16:52:24 +0000142{
143 m_ignore_count = n;
144}