diff options
| -rw-r--r-- | lldb/include/lldb/Interpreter/OptionGroupWatchpoint.h | 3 | ||||
| -rw-r--r-- | lldb/source/Commands/CommandObjectWatchpoint.cpp | 31 | ||||
| -rw-r--r-- | lldb/source/Interpreter/OptionGroupWatchpoint.cpp | 13 |
3 files changed, 45 insertions, 2 deletions
diff --git a/lldb/include/lldb/Interpreter/OptionGroupWatchpoint.h b/lldb/include/lldb/Interpreter/OptionGroupWatchpoint.h index df8e0c07e86..1298da80750 100644 --- a/lldb/include/lldb/Interpreter/OptionGroupWatchpoint.h +++ b/lldb/include/lldb/Interpreter/OptionGroupWatchpoint.h @@ -26,6 +26,9 @@ namespace lldb_private { { public: + static bool + IsWatchSizeSupported(uint32_t watch_size); + OptionGroupWatchpoint (); virtual diff --git a/lldb/source/Commands/CommandObjectWatchpoint.cpp b/lldb/source/Commands/CommandObjectWatchpoint.cpp index 56b95abefdc..591b8ec4201 100644 --- a/lldb/source/Commands/CommandObjectWatchpoint.cpp +++ b/lldb/source/Commands/CommandObjectWatchpoint.cpp @@ -59,6 +59,20 @@ CheckTargetForWatchpointOperations(Target *target, CommandReturnObject &result) return true; } +static void +CheckIfWatchpointsExhausted(Target *target, CommandReturnObject &result) +{ + uint32_t num_supported_hardware_watchpoints; + Error error = target->GetProcessSP()->GetWatchpointSupportInfo(num_supported_hardware_watchpoints); + if (error.Success()) + { + uint32_t num_current_watchpoints = target->GetWatchpointList().GetSize(); + if (num_current_watchpoints >= num_supported_hardware_watchpoints) + result.AppendErrorWithFormat("Number of supported hardware watchpoints (%u) has been reached.\n", + num_supported_hardware_watchpoints); + } +} + #include "llvm/ADT/StringRef.h" // Equivalent class: {"-", "to", "To", "TO"} of range specifier array. @@ -943,6 +957,7 @@ CommandObjectWatchpointSetVariable::Execute CommandReturnObject &result ) { + Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); ExecutionContext exe_ctx(m_interpreter.GetExecutionContext()); StackFrame *frame = exe_ctx.GetFramePtr(); if (frame == NULL) @@ -998,6 +1013,11 @@ CommandObjectWatchpointSetVariable::Execute // Find out the size of this variable. size = m_option_watchpoint.watch_size == 0 ? valobj_sp->GetByteSize() : m_option_watchpoint.watch_size; + if (!m_option_watchpoint.IsWatchSizeSupported(size)) + { + result.GetErrorStream().Printf("Watch size of %lu is not supported\n", size); + return false; + } } } else { const char *error_cstr = error.AsCString(NULL); @@ -1011,7 +1031,7 @@ CommandObjectWatchpointSetVariable::Execute // Now it's time to create the watchpoint. uint32_t watch_type = m_option_watchpoint.watch_type; - Watchpoint *wp = exe_ctx.GetTargetRef().CreateWatchpoint(addr, size, watch_type).get(); + Watchpoint *wp = target->CreateWatchpoint(addr, size, watch_type).get(); if (wp) { if (var_sp && var_sp->GetDeclaration().GetFile()) { StreamString ss; @@ -1027,6 +1047,7 @@ CommandObjectWatchpointSetVariable::Execute } else { result.AppendErrorWithFormat("Watchpoint creation failed (addr=0x%llx, size=%lu).\n", addr, size); + CheckIfWatchpointsExhausted(target, result); result.SetStatus(eReturnStatusFailed); } @@ -1200,10 +1221,15 @@ CommandObjectWatchpointSetExpression::ExecuteRawCommandString } size = with_dash_x ? m_option_watchpoint.watch_size : target->GetArchitecture().GetAddressByteSize(); + if (!m_option_watchpoint.IsWatchSizeSupported(size)) + { + result.GetErrorStream().Printf("Watch size of %lu is not supported\n", size); + return false; + } // Now it's time to create the watchpoint. uint32_t watch_type = m_option_watchpoint.watch_type; - Watchpoint *wp = exe_ctx.GetTargetRef().CreateWatchpoint(addr, size, watch_type).get(); + Watchpoint *wp = target->CreateWatchpoint(addr, size, watch_type).get(); if (wp) { if (var_sp && var_sp->GetDeclaration().GetFile()) { StreamString ss; @@ -1219,6 +1245,7 @@ CommandObjectWatchpointSetExpression::ExecuteRawCommandString } else { result.AppendErrorWithFormat("Watchpoint creation failed (addr=0x%llx, size=%lu).\n", addr, size); + CheckIfWatchpointsExhausted(target, result); result.SetStatus(eReturnStatusFailed); } diff --git a/lldb/source/Interpreter/OptionGroupWatchpoint.cpp b/lldb/source/Interpreter/OptionGroupWatchpoint.cpp index e041620ff5b..aa5b0001c02 100644 --- a/lldb/source/Interpreter/OptionGroupWatchpoint.cpp +++ b/lldb/source/Interpreter/OptionGroupWatchpoint.cpp @@ -45,6 +45,19 @@ g_option_table[] = }; +bool +OptionGroupWatchpoint::IsWatchSizeSupported(uint32_t watch_size) +{ + for (uint32_t i = 0; i < llvm::array_lengthof(g_watch_size); ++i) + { + if (g_watch_size[i].value == 0) + break; + if (watch_size == g_watch_size[i].value) + return true; + } + return false; +} + OptionGroupWatchpoint::OptionGroupWatchpoint () : OptionGroup() { |

