Author: jingham
Date: Tue Sep 20 20:21:19 2016
New Revision: 282043

URL: http://llvm.org/viewvc/llvm-project?rev=282043&view=rev
Log:
Adds tests for breakpoint names, and a FindBreakpointsByName.

Also if you set a breakpoint with an invalid name, we'll
refuse to set the breakpoint rather than silently ignoring
the name.

Modified:
    lldb/trunk/include/lldb/API/SBTarget.h
    lldb/trunk/include/lldb/Breakpoint/BreakpointList.h
    lldb/trunk/scripts/interface/SBTarget.i
    lldb/trunk/source/API/SBTarget.cpp
    lldb/trunk/source/Breakpoint/BreakpointList.cpp
    lldb/trunk/source/Commands/CommandObjectBreakpoint.cpp

Modified: lldb/trunk/include/lldb/API/SBTarget.h
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBTarget.h?rev=282043&r1=282042&r2=282043&view=diff
==============================================================================
--- lldb/trunk/include/lldb/API/SBTarget.h (original)
+++ lldb/trunk/include/lldb/API/SBTarget.h Tue Sep 20 20:21:19 2016
@@ -666,6 +666,10 @@ public:
 
   lldb::SBBreakpoint FindBreakpointByID(break_id_t break_id);
 
+  // Finds all breakpoints by name, returning the list in bkpt_list.  Returns
+  // false if the name is not a valid breakpoint name, true otherwise.
+  bool FindBreakpointsByName(const char *name, SBBreakpointList &bkpt_list);
+
   bool EnableAllBreakpoints();
 
   bool DisableAllBreakpoints();

Modified: lldb/trunk/include/lldb/Breakpoint/BreakpointList.h
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Breakpoint/BreakpointList.h?rev=282043&r1=282042&r2=282043&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Breakpoint/BreakpointList.h (original)
+++ lldb/trunk/include/lldb/Breakpoint/BreakpointList.h Tue Sep 20 20:21:19 2016
@@ -103,6 +103,17 @@ public:
   const lldb::BreakpointSP GetBreakpointAtIndex(size_t i) const;
 
   //------------------------------------------------------------------
+  /// Find all the breakpoints with a given name
+  ///
+  /// @param[in] name
+  ///   The breakpoint name for which to search.
+  ///
+  /// @result
+  ///   \bfalse if the input name was not a legal breakpoint name.
+  //------------------------------------------------------------------
+  bool FindBreakpointsByName(const char *name, BreakpointList &matching_bps);
+
+  //------------------------------------------------------------------
   /// Returns the number of elements in this breakpoint list.
   ///
   /// @result

Modified: lldb/trunk/scripts/interface/SBTarget.i
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/interface/SBTarget.i?rev=282043&r1=282042&r2=282043&view=diff
==============================================================================
--- lldb/trunk/scripts/interface/SBTarget.i (original)
+++ lldb/trunk/scripts/interface/SBTarget.i Tue Sep 20 20:21:19 2016
@@ -708,6 +708,9 @@ public:
     lldb::SBBreakpoint
     FindBreakpointByID (break_id_t break_id);
 
+  
+    bool FindBreakpointsByName(const char *name, SBBreakpointList &bkpt_list);
+
     bool
     EnableAllBreakpoints ();
 

Modified: lldb/trunk/source/API/SBTarget.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBTarget.cpp?rev=282043&r1=282042&r2=282043&view=diff
==============================================================================
--- lldb/trunk/source/API/SBTarget.cpp (original)
+++ lldb/trunk/source/API/SBTarget.cpp Tue Sep 20 20:21:19 2016
@@ -1079,6 +1079,23 @@ SBBreakpoint SBTarget::FindBreakpointByI
   return sb_breakpoint;
 }
 
+bool SBTarget::FindBreakpointsByName(const char *name,
+                                     SBBreakpointList &bkpts) {
+  TargetSP target_sp(GetSP());
+  if (target_sp) {
+    std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
+    BreakpointList bkpt_list(false);
+    bool is_valid =
+        target_sp->GetBreakpointList().FindBreakpointsByName(name, bkpt_list);
+    if (!is_valid)
+      return false;
+    for (BreakpointSP bkpt_sp : bkpt_list.Breakpoints()) {
+      bkpts.AppendByID(bkpt_sp->GetID());
+    }
+  }
+  return true;
+}
+
 bool SBTarget::EnableAllBreakpoints() {
   TargetSP target_sp(GetSP());
   if (target_sp) {

Modified: lldb/trunk/source/Breakpoint/BreakpointList.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Breakpoint/BreakpointList.cpp?rev=282043&r1=282042&r2=282043&view=diff
==============================================================================
--- lldb/trunk/source/Breakpoint/BreakpointList.cpp (original)
+++ lldb/trunk/source/Breakpoint/BreakpointList.cpp Tue Sep 20 20:21:19 2016
@@ -137,6 +137,23 @@ BreakpointList::FindBreakpointByID(break
   return stop_sp;
 }
 
+bool BreakpointList::FindBreakpointsByName(const char *name,
+                                           BreakpointList &matching_bps) {
+  Error error;
+  if (!name)
+    return false;
+
+  if (!BreakpointID::StringIsBreakpointName(llvm::StringRef(name), error))
+    return false;
+
+  for (BreakpointSP bkpt_sp : Breakpoints()) {
+    if (bkpt_sp->MatchesName(name)) {
+      matching_bps.Add(bkpt_sp, false);
+    }
+  }
+  return true;
+}
+
 void BreakpointList::Dump(Stream *s) const {
   std::lock_guard<std::recursive_mutex> guard(m_mutex);
   s->Printf("%p: ", static_cast<const void *>(this));

Modified: lldb/trunk/source/Commands/CommandObjectBreakpoint.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectBreakpoint.cpp?rev=282043&r1=282042&r2=282043&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectBreakpoint.cpp (original)
+++ lldb/trunk/source/Commands/CommandObjectBreakpoint.cpp Tue Sep 20 20:21:19 
2016
@@ -249,6 +249,9 @@ public:
       case 'N': {
         if (BreakpointID::StringIsBreakpointName(option_strref, error))
           m_breakpoint_names.push_back(option_arg);
+        else
+          error.SetErrorStringWithFormat("Invalid breakpoint name: %s",
+                                         option_arg);
         break;
       }
 
@@ -622,10 +625,17 @@ protected:
         bp->GetOptions()->SetCondition(m_options.m_condition.c_str());
 
       if (!m_options.m_breakpoint_names.empty()) {
-        Error error; // We don't need to check the error here, since the option
-                     // parser checked it...
-        for (auto name : m_options.m_breakpoint_names)
-          bp->AddName(name.c_str(), error);
+        Error name_error;
+        for (auto name : m_options.m_breakpoint_names) {
+          bp->AddName(name.c_str(), name_error);
+          if (name_error.Fail()) {
+            result.AppendErrorWithFormat("Invalid breakpoint name: %s",
+                                         name.c_str());
+            target->RemoveBreakpointByID(bp->GetID());
+            result.SetStatus(eReturnStatusFailed);
+            return false;
+          }
+        }
       }
 
       bp->SetOneShot(m_options.m_one_shot);


_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to