1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
//===-- WatchpointLocation.cpp ----------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "lldb/Breakpoint/WatchpointLocation.h"
// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/Core/Stream.h"
using namespace lldb;
using namespace lldb_private;
WatchpointLocation::WatchpointLocation (lldb::addr_t addr, lldb::tid_t tid, bool hardware) :
StoppointLocation (GetNextID(), addr, tid, hardware),
m_enabled(0),
m_watch_read(0),
m_watch_write(0),
m_watch_was_read(0),
m_watch_was_written(0),
m_ignore_count(0),
m_callback(NULL),
m_callback_baton(NULL)
{
}
WatchpointLocation::~WatchpointLocation()
{
}
break_id_t
WatchpointLocation::GetNextID()
{
static break_id_t g_next_ID = 0;
return ++g_next_ID;
}
bool
WatchpointLocation::SetCallback (WatchpointHitCallback callback, void *callback_baton)
{
m_callback = callback;
m_callback_baton = callback_baton;
return true;
}
// RETURNS - true if we should stop at this breakpoint, false if we
// should continue.
bool
WatchpointLocation::BreakpointWasHit (StoppointCallbackContext *context)
{
m_hit_count++;
if (m_hit_count > m_ignore_count)
{
uint32_t access = 0;
if (m_watch_was_read)
access |= LLDB_WATCH_TYPE_READ;
if (m_watch_was_written)
access |= LLDB_WATCH_TYPE_WRITE;
return m_callback(m_callback_baton, context, GetID(), access);
}
return false;
}
void
WatchpointLocation::Dump(Stream *s) const
{
if (s == NULL)
return;
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",
GetID(),
(uint64_t)m_addr,
m_byte_size,
m_enabled ? "enabled " : "disabled",
IsHardware() ? "hardware" : "software",
m_watch_read ? "r" : "",
m_watch_write ? "w" : "",
GetHardwareIndex(),
GetHitCount(),
GetIgnoreCount(),
m_callback,
m_callback_baton);
}
bool
WatchpointLocation::IsEnabled() const
{
return m_enabled;
}
void
WatchpointLocation::SetEnabled(uint32_t enabled)
{
if (!enabled)
SetHardwareIndex(LLDB_INVALID_INDEX32);
m_enabled = enabled;
}
void
WatchpointLocation::SetWatchpointType (uint32_t type)
{
m_watch_read = (type & LLDB_WATCH_TYPE_READ) != 0;
m_watch_write = (type & LLDB_WATCH_TYPE_WRITE) != 0;
}
bool
WatchpointLocation::WatchpointRead () const
{
return m_watch_read != 0;
}
bool
WatchpointLocation::WatchpointWrite () const
{
return m_watch_write != 0;
}
uint32_t
WatchpointLocation::GetIgnoreCount () const
{
return m_ignore_count;
}
void
WatchpointLocation::SetIgnoreCount (uint32_t n)
{
m_ignore_count = n;
}
|