rdar://problem/11584012

Refactorings of watchpoint creation APIs so that SBTarget::WatchAddress(), SBValue::Watch(), and SBValue::WatchPointee()
now take an additional 'SBError &error' parameter (at the end) to contain the reason if there is some failure in the
operation.  Update 'watchpoint set variable/expression' commands to take advantage of that.

Update existing test cases to reflect the API change and add test cases to verify that the SBError mechanism works for
SBTarget::WatchAddress() by passing an invalid watch_size.


git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@157964 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Commands/CommandObjectWatchpoint.cpp b/source/Commands/CommandObjectWatchpoint.cpp
index 591b8ec..04d8789 100644
--- a/source/Commands/CommandObjectWatchpoint.cpp
+++ b/source/Commands/CommandObjectWatchpoint.cpp
@@ -59,20 +59,6 @@
     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.
@@ -1013,11 +999,6 @@
             // 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);
@@ -1031,7 +1012,8 @@
 
     // Now it's time to create the watchpoint.
     uint32_t watch_type = m_option_watchpoint.watch_type;
-    Watchpoint *wp = target->CreateWatchpoint(addr, size, watch_type).get();
+    error.Clear();
+    Watchpoint *wp = target->CreateWatchpoint(addr, size, watch_type, error).get();
     if (wp) {
         if (var_sp && var_sp->GetDeclaration().GetFile()) {
             StreamString ss;
@@ -1047,7 +1029,8 @@
     } else {
         result.AppendErrorWithFormat("Watchpoint creation failed (addr=0x%llx, size=%lu).\n",
                                      addr, size);
-        CheckIfWatchpointsExhausted(target, result);
+        if (error.AsCString(NULL))
+            result.AppendError(error.AsCString());
         result.SetStatus(eReturnStatusFailed);
     }
 
@@ -1221,15 +1204,11 @@
     }
     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 = target->CreateWatchpoint(addr, size, watch_type).get();
+    Error error;
+    Watchpoint *wp = target->CreateWatchpoint(addr, size, watch_type, error).get();
     if (wp) {
         if (var_sp && var_sp->GetDeclaration().GetFile()) {
             StreamString ss;
@@ -1245,7 +1224,8 @@
     } else {
         result.AppendErrorWithFormat("Watchpoint creation failed (addr=0x%llx, size=%lu).\n",
                                      addr, size);
-        CheckIfWatchpointsExhausted(target, result);
+        if (error.AsCString(NULL))
+            result.AppendError(error.AsCString());
         result.SetStatus(eReturnStatusFailed);
     }