diff --git a/lldb/include/lldb/Breakpoint/BreakpointList.h b/lldb/include/lldb/Breakpoint/BreakpointList.h --- a/lldb/include/lldb/Breakpoint/BreakpointList.h +++ b/lldb/include/lldb/Breakpoint/BreakpointList.h @@ -67,8 +67,10 @@ /// 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); + /// error if the input name was not a legal breakpoint name, vector + /// of breakpoints otherwise. + llvm::Expected> + FindBreakpointsByName(const char *name); /// Returns the number of elements in this breakpoint list. /// diff --git a/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_names/TestBreakpointNames.py b/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_names/TestBreakpointNames.py --- a/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_names/TestBreakpointNames.py +++ b/lldb/packages/Python/lldbsuite/test/functionalities/breakpoint/breakpoint_names/TestBreakpointNames.py @@ -155,8 +155,13 @@ def do_check_using_names(self): """Use Python APIs to check names work in place of breakpoint ID's.""" + # Create a dummy breakpoint to use up ID 1 + _ = self.target.BreakpointCreateByLocation(self.main_file_spec, 30) + + # Create a breakpiont to test with bkpt = self.target.BreakpointCreateByLocation(self.main_file_spec, 10) bkpt_name = "ABreakpoint" + bkpt_id = bkpt.GetID() other_bkpt_name= "_AnotherBreakpoint" # Add a name and make sure we match it: @@ -169,6 +174,7 @@ self.assertTrue(bkpts.GetSize() == 1, "One breakpoint matched.") found_bkpt = bkpts.GetBreakpointAtIndex(0) self.assertTrue(bkpt.GetID() == found_bkpt.GetID(),"The right breakpoint.") + self.assertTrue(bkpt.GetID() == bkpt_id,"With the same ID as before.") retval = lldb.SBCommandReturnObject() self.dbg.GetCommandInterpreter().HandleCommand("break disable %s"%(bkpt_name), retval) diff --git a/lldb/source/API/SBTarget.cpp b/lldb/source/API/SBTarget.cpp --- a/lldb/source/API/SBTarget.cpp +++ b/lldb/source/API/SBTarget.cpp @@ -1176,12 +1176,15 @@ TargetSP target_sp(GetSP()); if (target_sp) { std::lock_guard guard(target_sp->GetAPIMutex()); - BreakpointList bkpt_list(false); - bool is_valid = - target_sp->GetBreakpointList().FindBreakpointsByName(name, bkpt_list); - if (!is_valid) + llvm::Expected> expected_vector = + target_sp->GetBreakpointList().FindBreakpointsByName(name); + if (!expected_vector) { + LLDB_LOG(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS), + "invalid breakpoint name: {}", + llvm::toString(expected_vector.takeError())); return false; - for (BreakpointSP bkpt_sp : bkpt_list.Breakpoints()) { + } + for (BreakpointSP bkpt_sp : *expected_vector) { bkpts.AppendByID(bkpt_sp->GetID()); } } diff --git a/lldb/source/Breakpoint/BreakpointList.cpp b/lldb/source/Breakpoint/BreakpointList.cpp --- a/lldb/source/Breakpoint/BreakpointList.cpp +++ b/lldb/source/Breakpoint/BreakpointList.cpp @@ -128,22 +128,25 @@ return {}; } -bool BreakpointList::FindBreakpointsByName(const char *name, - BreakpointList &matching_bps) { - Status error; +llvm::Expected> +BreakpointList::FindBreakpointsByName(const char *name) { if (!name) - return false; + return llvm::make_error( + "FindBreakpointsByName requires a name", + llvm::inconvertibleErrorCode()); + Status error; if (!BreakpointID::StringIsBreakpointName(llvm::StringRef(name), error)) - return false; + return error.ToError(); + std::vector matching_bps; for (BreakpointSP bkpt_sp : Breakpoints()) { if (bkpt_sp->MatchesName(name)) { - matching_bps.Add(bkpt_sp, false); + matching_bps.push_back(bkpt_sp); } } - return true; + return matching_bps; } void BreakpointList::Dump(Stream *s) const { diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -728,11 +728,17 @@ } void Target::ApplyNameToBreakpoints(BreakpointName &bp_name) { - BreakpointList bkpts_with_name(false); - m_breakpoint_list.FindBreakpointsByName(bp_name.GetName().AsCString(), - bkpts_with_name); + llvm::Expected> expected_vector = + m_breakpoint_list.FindBreakpointsByName(bp_name.GetName().AsCString()); - for (auto bp_sp : bkpts_with_name.Breakpoints()) + if (!expected_vector) { + LLDB_LOG(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS), + "invalid breakpoint name: {}", + llvm::toString(expected_vector.takeError())); + return; + } + + for (auto bp_sp : *expected_vector) bp_name.ConfigureBreakpoint(bp_sp); }