blob: 937fc8fca0049eb9f4d07e68e3b87bdb2c1285db [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{
77 // FIXME: Add implmentation of GetDescription().
78 return;
79}
80
81void
Chris Lattner24943d22010-06-08 16:52:24 +000082WatchpointLocation::Dump(Stream *s) const
83{
84 if (s == NULL)
85 return;
86
87 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",
88 GetID(),
Chris Lattner24943d22010-06-08 16:52:24 +000089 (uint64_t)m_addr,
90 m_byte_size,
91 m_enabled ? "enabled " : "disabled",
92 IsHardware() ? "hardware" : "software",
93 m_watch_read ? "r" : "",
94 m_watch_write ? "w" : "",
95 GetHardwareIndex(),
96 GetHitCount(),
97 GetIgnoreCount(),
98 m_callback,
99 m_callback_baton);
100}
101
102bool
103WatchpointLocation::IsEnabled() const
104{
105 return m_enabled;
106}
107
108void
Johnny Chen21900fb2011-09-06 22:38:36 +0000109WatchpointLocation::SetEnabled(bool enabled)
Chris Lattner24943d22010-06-08 16:52:24 +0000110{
111 if (!enabled)
112 SetHardwareIndex(LLDB_INVALID_INDEX32);
113 m_enabled = enabled;
114}
115
116void
117WatchpointLocation::SetWatchpointType (uint32_t type)
118{
119 m_watch_read = (type & LLDB_WATCH_TYPE_READ) != 0;
120 m_watch_write = (type & LLDB_WATCH_TYPE_WRITE) != 0;
121}
122
123bool
124WatchpointLocation::WatchpointRead () const
125{
126 return m_watch_read != 0;
127}
128bool
129WatchpointLocation::WatchpointWrite () const
130{
131 return m_watch_write != 0;
132}
Greg Clayton54e7afa2010-07-09 20:39:50 +0000133uint32_t
Chris Lattner24943d22010-06-08 16:52:24 +0000134WatchpointLocation::GetIgnoreCount () const
135{
136 return m_ignore_count;
137}
138
139void
Greg Clayton54e7afa2010-07-09 20:39:50 +0000140WatchpointLocation::SetIgnoreCount (uint32_t n)
Chris Lattner24943d22010-06-08 16:52:24 +0000141{
142 m_ignore_count = n;
143}