@@ -61,7 +61,7 @@ Breakpoint::Breakpoint(Target &new_target, const Breakpoint &source_bp)
6161Breakpoint::~Breakpoint () = default ;
6262
6363BreakpointSP Breakpoint::CopyFromBreakpoint (TargetSP new_target,
64- const Breakpoint& bp_to_copy_from) {
64+ const Breakpoint & bp_to_copy_from) {
6565 if (!new_target)
6666 return BreakpointSP ();
6767
@@ -163,7 +163,7 @@ lldb::BreakpointSP Breakpoint::CreateFromStructuredData(
163163 std::make_shared<SearchFilterForUnconstrainedSearches>(target_sp);
164164 else {
165165 filter_sp = SearchFilter::CreateFromStructuredData (target_sp, *filter_dict,
166- create_error);
166+ create_error);
167167 if (create_error.Fail ()) {
168168 error = Status::FromErrorStringWithFormat (
169169 " Error creating breakpoint filter from data: %s." ,
@@ -174,7 +174,7 @@ lldb::BreakpointSP Breakpoint::CreateFromStructuredData(
174174
175175 std::unique_ptr<BreakpointOptions> options_up;
176176 StructuredData::Dictionary *options_dict;
177- Target& target = *target_sp;
177+ Target & target = *target_sp;
178178 success = breakpoint_dict->GetValueForKeyAsDictionary (
179179 BreakpointOptions::GetSerializationKey (), options_dict);
180180 if (success) {
@@ -192,8 +192,8 @@ lldb::BreakpointSP Breakpoint::CreateFromStructuredData(
192192 success = breakpoint_dict->GetValueForKeyAsBoolean (
193193 Breakpoint::GetKey (OptionNames::Hardware), hardware);
194194
195- result_sp = target. CreateBreakpoint (filter_sp, resolver_sp, false ,
196- hardware, true );
195+ result_sp =
196+ target. CreateBreakpoint (filter_sp, resolver_sp, false , hardware, true );
197197
198198 if (result_sp && options_up) {
199199 result_sp->m_options = *options_up;
@@ -251,6 +251,45 @@ const lldb::TargetSP Breakpoint::GetTargetSP() {
251251
252252bool Breakpoint::IsInternal () const { return LLDB_BREAK_ID_IS_INTERNAL (m_bid); }
253253
254+ llvm::Error Breakpoint::SetIsHardware (bool is_hardware) {
255+ if (is_hardware == m_hardware)
256+ return llvm::Error::success ();
257+
258+ // Disable all non-hardware breakpoint locations.
259+ std::vector<BreakpointLocationSP> locations;
260+ for (BreakpointLocationSP location_sp : m_locations.BreakpointLocations ()) {
261+ if (!location_sp || !location_sp->IsEnabled ())
262+ continue ;
263+
264+ lldb::BreakpointSiteSP breakpoint_site_sp =
265+ location_sp->GetBreakpointSite ();
266+ if (!breakpoint_site_sp ||
267+ breakpoint_site_sp->GetType () == BreakpointSite::eHardware)
268+ continue ;
269+
270+ locations.push_back (location_sp);
271+ location_sp->SetEnabled (false );
272+ }
273+
274+ // Toggle the hardware mode.
275+ m_hardware = is_hardware;
276+
277+ // Re-enable all breakpoint locations.
278+ size_t num_failures = 0 ;
279+ for (BreakpointLocationSP location_sp : locations) {
280+ if (!location_sp->SetEnabled (true ))
281+ num_failures++;
282+ }
283+
284+ if (num_failures != 0 )
285+ return llvm::createStringError (
286+ " %ull out of %ull breakpoint locations left disabled because they "
287+ " couldn't be converted to hardware" ,
288+ num_failures, locations.size ());
289+
290+ return llvm::Error::success ();
291+ }
292+
254293BreakpointLocationSP Breakpoint::AddLocation (const Address &addr,
255294 bool *new_location) {
256295 return m_locations.AddLocation (addr, m_resolve_indirect_symbols,
@@ -952,8 +991,7 @@ void Breakpoint::GetResolverDescription(Stream *s) {
952991 m_resolver_sp->GetDescription (s);
953992}
954993
955- bool Breakpoint::GetMatchingFileLine (ConstString filename,
956- uint32_t line_number,
994+ bool Breakpoint::GetMatchingFileLine (ConstString filename, uint32_t line_number,
957995 BreakpointLocationCollection &loc_coll) {
958996 // TODO: To be correct, this method needs to fill the breakpoint location
959997 // collection
@@ -1010,19 +1048,32 @@ void Breakpoint::SendBreakpointChangedEvent(
10101048
10111049const char *Breakpoint::BreakpointEventTypeAsCString (BreakpointEventType type) {
10121050 switch (type) {
1013- case eBreakpointEventTypeInvalidType: return " invalid" ;
1014- case eBreakpointEventTypeAdded: return " breakpoint added" ;
1015- case eBreakpointEventTypeRemoved: return " breakpoint removed" ;
1016- case eBreakpointEventTypeLocationsAdded: return " locations added" ;
1017- case eBreakpointEventTypeLocationsRemoved: return " locations removed" ;
1018- case eBreakpointEventTypeLocationsResolved: return " locations resolved" ;
1019- case eBreakpointEventTypeEnabled: return " breakpoint enabled" ;
1020- case eBreakpointEventTypeDisabled: return " breakpoint disabled" ;
1021- case eBreakpointEventTypeCommandChanged: return " command changed" ;
1022- case eBreakpointEventTypeConditionChanged: return " condition changed" ;
1023- case eBreakpointEventTypeIgnoreChanged: return " ignore count changed" ;
1024- case eBreakpointEventTypeThreadChanged: return " thread changed" ;
1025- case eBreakpointEventTypeAutoContinueChanged: return " autocontinue changed" ;
1051+ case eBreakpointEventTypeInvalidType:
1052+ return " invalid" ;
1053+ case eBreakpointEventTypeAdded:
1054+ return " breakpoint added" ;
1055+ case eBreakpointEventTypeRemoved:
1056+ return " breakpoint removed" ;
1057+ case eBreakpointEventTypeLocationsAdded:
1058+ return " locations added" ;
1059+ case eBreakpointEventTypeLocationsRemoved:
1060+ return " locations removed" ;
1061+ case eBreakpointEventTypeLocationsResolved:
1062+ return " locations resolved" ;
1063+ case eBreakpointEventTypeEnabled:
1064+ return " breakpoint enabled" ;
1065+ case eBreakpointEventTypeDisabled:
1066+ return " breakpoint disabled" ;
1067+ case eBreakpointEventTypeCommandChanged:
1068+ return " command changed" ;
1069+ case eBreakpointEventTypeConditionChanged:
1070+ return " condition changed" ;
1071+ case eBreakpointEventTypeIgnoreChanged:
1072+ return " ignore count changed" ;
1073+ case eBreakpointEventTypeThreadChanged:
1074+ return " thread changed" ;
1075+ case eBreakpointEventTypeAutoContinueChanged:
1076+ return " autocontinue changed" ;
10261077 };
10271078 llvm_unreachable (" Fully covered switch above!" );
10281079}
@@ -1060,7 +1111,7 @@ void Breakpoint::BreakpointEventData::Dump(Stream *s) const {
10601111 BreakpointEventType event_type = GetBreakpointEventType ();
10611112 break_id_t bkpt_id = GetBreakpoint ()->GetID ();
10621113 s->Format (" bkpt: {0} type: {1}" , bkpt_id,
1063- BreakpointEventTypeAsCString (event_type));
1114+ BreakpointEventTypeAsCString (event_type));
10641115}
10651116
10661117const Breakpoint::BreakpointEventData *
0 commit comments