@@ -61,7 +61,7 @@ Breakpoint::Breakpoint(Target &new_target, const Breakpoint &source_bp)
61
61
Breakpoint::~Breakpoint () = default ;
62
62
63
63
BreakpointSP Breakpoint::CopyFromBreakpoint (TargetSP new_target,
64
- const Breakpoint& bp_to_copy_from) {
64
+ const Breakpoint & bp_to_copy_from) {
65
65
if (!new_target)
66
66
return BreakpointSP ();
67
67
@@ -163,7 +163,7 @@ lldb::BreakpointSP Breakpoint::CreateFromStructuredData(
163
163
std::make_shared<SearchFilterForUnconstrainedSearches>(target_sp);
164
164
else {
165
165
filter_sp = SearchFilter::CreateFromStructuredData (target_sp, *filter_dict,
166
- create_error);
166
+ create_error);
167
167
if (create_error.Fail ()) {
168
168
error = Status::FromErrorStringWithFormat (
169
169
" Error creating breakpoint filter from data: %s." ,
@@ -174,7 +174,7 @@ lldb::BreakpointSP Breakpoint::CreateFromStructuredData(
174
174
175
175
std::unique_ptr<BreakpointOptions> options_up;
176
176
StructuredData::Dictionary *options_dict;
177
- Target& target = *target_sp;
177
+ Target & target = *target_sp;
178
178
success = breakpoint_dict->GetValueForKeyAsDictionary (
179
179
BreakpointOptions::GetSerializationKey (), options_dict);
180
180
if (success) {
@@ -192,8 +192,8 @@ lldb::BreakpointSP Breakpoint::CreateFromStructuredData(
192
192
success = breakpoint_dict->GetValueForKeyAsBoolean (
193
193
Breakpoint::GetKey (OptionNames::Hardware), hardware);
194
194
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 );
197
197
198
198
if (result_sp && options_up) {
199
199
result_sp->m_options = *options_up;
@@ -251,6 +251,45 @@ const lldb::TargetSP Breakpoint::GetTargetSP() {
251
251
252
252
bool Breakpoint::IsInternal () const { return LLDB_BREAK_ID_IS_INTERNAL (m_bid); }
253
253
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
+
254
293
BreakpointLocationSP Breakpoint::AddLocation (const Address &addr,
255
294
bool *new_location) {
256
295
return m_locations.AddLocation (addr, m_resolve_indirect_symbols,
@@ -952,8 +991,7 @@ void Breakpoint::GetResolverDescription(Stream *s) {
952
991
m_resolver_sp->GetDescription (s);
953
992
}
954
993
955
- bool Breakpoint::GetMatchingFileLine (ConstString filename,
956
- uint32_t line_number,
994
+ bool Breakpoint::GetMatchingFileLine (ConstString filename, uint32_t line_number,
957
995
BreakpointLocationCollection &loc_coll) {
958
996
// TODO: To be correct, this method needs to fill the breakpoint location
959
997
// collection
@@ -1010,19 +1048,32 @@ void Breakpoint::SendBreakpointChangedEvent(
1010
1048
1011
1049
const char *Breakpoint::BreakpointEventTypeAsCString (BreakpointEventType type) {
1012
1050
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" ;
1026
1077
};
1027
1078
llvm_unreachable (" Fully covered switch above!" );
1028
1079
}
@@ -1060,7 +1111,7 @@ void Breakpoint::BreakpointEventData::Dump(Stream *s) const {
1060
1111
BreakpointEventType event_type = GetBreakpointEventType ();
1061
1112
break_id_t bkpt_id = GetBreakpoint ()->GetID ();
1062
1113
s->Format (" bkpt: {0} type: {1}" , bkpt_id,
1063
- BreakpointEventTypeAsCString (event_type));
1114
+ BreakpointEventTypeAsCString (event_type));
1064
1115
}
1065
1116
1066
1117
const Breakpoint::BreakpointEventData *
0 commit comments