forked from OSchip/llvm-project
[LLDB][MIPS] Support standard GDB remote stop reply packet for watchpoint
SUMMARY: The patch supports TAAwatch:addr packet. The patch also sets m_watchpoints_trigger_after_instruction to eLazyBoolNo when qHostInfo or qWatchpointSupportInfo is not supported by the target. Reviewers: jingham, clayborg Subscribers: nitesh.jain, mohit.bhakkad, sagar, bhushan and lldb-commits Differential Revision: http://reviews.llvm.org/D11747 llvm-svn: 244865
This commit is contained in:
parent
831435042e
commit
725666cc65
|
@ -2473,26 +2473,45 @@ GDBRemoteCommunicationClient::GetWatchpointSupportInfo (uint32_t &num)
|
|||
}
|
||||
|
||||
lldb_private::Error
|
||||
GDBRemoteCommunicationClient::GetWatchpointSupportInfo (uint32_t &num, bool& after)
|
||||
GDBRemoteCommunicationClient::GetWatchpointSupportInfo (uint32_t &num, bool& after, const ArchSpec &arch)
|
||||
{
|
||||
Error error(GetWatchpointSupportInfo(num));
|
||||
if (error.Success())
|
||||
error = GetWatchpointsTriggerAfterInstruction(after);
|
||||
error = GetWatchpointsTriggerAfterInstruction(after, arch);
|
||||
return error;
|
||||
}
|
||||
|
||||
lldb_private::Error
|
||||
GDBRemoteCommunicationClient::GetWatchpointsTriggerAfterInstruction (bool &after)
|
||||
GDBRemoteCommunicationClient::GetWatchpointsTriggerAfterInstruction (bool &after, const ArchSpec &arch)
|
||||
{
|
||||
Error error;
|
||||
llvm::Triple::ArchType atype = arch.GetMachine();
|
||||
|
||||
// we assume watchpoints will happen after running the relevant opcode
|
||||
// and we only want to override this behavior if we have explicitly
|
||||
// received a qHostInfo telling us otherwise
|
||||
if (m_qHostInfo_is_valid != eLazyBoolYes)
|
||||
after = true;
|
||||
{
|
||||
// On targets like MIPS, watchpoint exceptions are always generated
|
||||
// before the instruction is executed. The connected target may not
|
||||
// support qHostInfo or qWatchpointSupportInfo packets.
|
||||
if (atype == llvm::Triple::mips || atype == llvm::Triple::mipsel
|
||||
|| atype == llvm::Triple::mips64 || atype == llvm::Triple::mips64el)
|
||||
after = false;
|
||||
else
|
||||
after = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
// For MIPS, set m_watchpoints_trigger_after_instruction to eLazyBoolNo
|
||||
// if it is not calculated before.
|
||||
if (m_watchpoints_trigger_after_instruction == eLazyBoolCalculate &&
|
||||
(atype == llvm::Triple::mips || atype == llvm::Triple::mipsel
|
||||
|| atype == llvm::Triple::mips64 || atype == llvm::Triple::mips64el))
|
||||
m_watchpoints_trigger_after_instruction = eLazyBoolNo;
|
||||
|
||||
after = (m_watchpoints_trigger_after_instruction != eLazyBoolNo);
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
|
|
|
@ -287,10 +287,10 @@ public:
|
|||
GetWatchpointSupportInfo (uint32_t &num);
|
||||
|
||||
Error
|
||||
GetWatchpointSupportInfo (uint32_t &num, bool& after);
|
||||
GetWatchpointSupportInfo (uint32_t &num, bool& after, const ArchSpec &arch);
|
||||
|
||||
Error
|
||||
GetWatchpointsTriggerAfterInstruction (bool &after);
|
||||
GetWatchpointsTriggerAfterInstruction (bool &after, const ArchSpec &arch);
|
||||
|
||||
const ArchSpec &
|
||||
GetHostArchitecture ();
|
||||
|
|
|
@ -2484,6 +2484,21 @@ ProcessGDBRemote::SetThreadStopInfo (StringExtractor& stop_packet)
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (key.compare("watch") == 0 || key.compare("rwatch") == 0 || key.compare("awatch") == 0)
|
||||
{
|
||||
// Support standard GDB remote stop reply packet 'TAAwatch:addr'
|
||||
lldb::addr_t wp_addr = StringConvert::ToUInt64 (value.c_str(), LLDB_INVALID_ADDRESS, 16);
|
||||
WatchpointSP wp_sp = GetTarget().GetWatchpointList().FindByAddress(wp_addr);
|
||||
uint32_t wp_index = LLDB_INVALID_INDEX32;
|
||||
|
||||
if (wp_sp)
|
||||
wp_index = wp_sp->GetHardwareIndex();
|
||||
|
||||
reason = "watchpoint";
|
||||
StreamString ostr;
|
||||
ostr.Printf("%" PRIu64 " %" PRIu32, wp_addr, wp_index);
|
||||
description = ostr.GetString().c_str();
|
||||
}
|
||||
else if (key.size() == 2 && ::isxdigit(key[0]) && ::isxdigit(key[1]))
|
||||
{
|
||||
uint32_t reg = StringConvert::ToUInt32 (key.c_str(), UINT32_MAX, 16);
|
||||
|
@ -3085,7 +3100,7 @@ ProcessGDBRemote::GetWatchpointSupportInfo (uint32_t &num)
|
|||
Error
|
||||
ProcessGDBRemote::GetWatchpointSupportInfo (uint32_t &num, bool& after)
|
||||
{
|
||||
Error error (m_gdb_comm.GetWatchpointSupportInfo (num, after));
|
||||
Error error (m_gdb_comm.GetWatchpointSupportInfo (num, after, GetTarget().GetArchitecture()));
|
||||
return error;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue