Files
clang-p2996/lldb/source/Breakpoint/WatchpointLocation.cpp
Jim Ingham 1b54c88cc4 Add a "thread specification" class that specifies thread specific breakpoints by name, index, queue or TID.
Push this through all the breakpoint management code.  Allow this to be set when the breakpoint is created.
Fix the Process classes so that a breakpoint hit that is not for a particular thread is not reported as a 
breakpoint hit event for that thread.
Added a "breakpoint configure" command to allow you to reset any of the thread 
specific options (or the ignore count.)

llvm-svn: 106078
2010-06-16 02:00:15 +00:00

137 lines
3.1 KiB
C++

//===-- 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;
}
int32_t
WatchpointLocation::GetIgnoreCount () const
{
return m_ignore_count;
}
void
WatchpointLocation::SetIgnoreCount (int32_t n)
{
m_ignore_count = n;
}