summaryrefslogtreecommitdiff
path: root/lldb/source/Breakpoint/Breakpoint.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Breakpoint/Breakpoint.cpp')
-rw-r--r--lldb/source/Breakpoint/Breakpoint.cpp112
1 files changed, 79 insertions, 33 deletions
diff --git a/lldb/source/Breakpoint/Breakpoint.cpp b/lldb/source/Breakpoint/Breakpoint.cpp
index 2ed0c9314e3e..8fc93cc8e0e5 100644
--- a/lldb/source/Breakpoint/Breakpoint.cpp
+++ b/lldb/source/Breakpoint/Breakpoint.cpp
@@ -61,7 +61,7 @@ Breakpoint::Breakpoint(Target &new_target, const Breakpoint &source_bp)
Breakpoint::~Breakpoint() = default;
BreakpointSP Breakpoint::CopyFromBreakpoint(TargetSP new_target,
- const Breakpoint& bp_to_copy_from) {
+ const Breakpoint &bp_to_copy_from) {
if (!new_target)
return BreakpointSP();
@@ -163,7 +163,7 @@ lldb::BreakpointSP Breakpoint::CreateFromStructuredData(
std::make_shared<SearchFilterForUnconstrainedSearches>(target_sp);
else {
filter_sp = SearchFilter::CreateFromStructuredData(target_sp, *filter_dict,
- create_error);
+ create_error);
if (create_error.Fail()) {
error = Status::FromErrorStringWithFormat(
"Error creating breakpoint filter from data: %s.",
@@ -174,7 +174,7 @@ lldb::BreakpointSP Breakpoint::CreateFromStructuredData(
std::unique_ptr<BreakpointOptions> options_up;
StructuredData::Dictionary *options_dict;
- Target& target = *target_sp;
+ Target &target = *target_sp;
success = breakpoint_dict->GetValueForKeyAsDictionary(
BreakpointOptions::GetSerializationKey(), options_dict);
if (success) {
@@ -192,8 +192,8 @@ lldb::BreakpointSP Breakpoint::CreateFromStructuredData(
success = breakpoint_dict->GetValueForKeyAsBoolean(
Breakpoint::GetKey(OptionNames::Hardware), hardware);
- result_sp = target.CreateBreakpoint(filter_sp, resolver_sp, false,
- hardware, true);
+ result_sp =
+ target.CreateBreakpoint(filter_sp, resolver_sp, false, hardware, true);
if (result_sp && options_up) {
result_sp->m_options = *options_up;
@@ -251,6 +251,45 @@ const lldb::TargetSP Breakpoint::GetTargetSP() {
bool Breakpoint::IsInternal() const { return LLDB_BREAK_ID_IS_INTERNAL(m_bid); }
+llvm::Error Breakpoint::SetIsHardware(bool is_hardware) {
+ if (is_hardware == m_hardware)
+ return llvm::Error::success();
+
+ // Disable all non-hardware breakpoint locations.
+ std::vector<BreakpointLocationSP> locations;
+ for (BreakpointLocationSP location_sp : m_locations.BreakpointLocations()) {
+ if (!location_sp || !location_sp->IsEnabled())
+ continue;
+
+ lldb::BreakpointSiteSP breakpoint_site_sp =
+ location_sp->GetBreakpointSite();
+ if (!breakpoint_site_sp ||
+ breakpoint_site_sp->GetType() == BreakpointSite::eHardware)
+ continue;
+
+ locations.push_back(location_sp);
+ location_sp->SetEnabled(false);
+ }
+
+ // Toggle the hardware mode.
+ m_hardware = is_hardware;
+
+ // Re-enable all breakpoint locations.
+ size_t num_failures = 0;
+ for (BreakpointLocationSP location_sp : locations) {
+ if (!location_sp->SetEnabled(true))
+ num_failures++;
+ }
+
+ if (num_failures != 0)
+ return llvm::createStringError(
+ "%ull out of %ull breakpoint locations left disabled because they "
+ "couldn't be converted to hardware",
+ num_failures, locations.size());
+
+ return llvm::Error::success();
+}
+
BreakpointLocationSP Breakpoint::AddLocation(const Address &addr,
bool *new_location) {
return m_locations.AddLocation(addr, m_resolve_indirect_symbols,
@@ -347,8 +386,7 @@ void Breakpoint::SetThreadID(lldb::tid_t thread_id) {
lldb::tid_t Breakpoint::GetThreadID() const {
if (m_options.GetThreadSpecNoCreate() == nullptr)
return LLDB_INVALID_THREAD_ID;
- else
- return m_options.GetThreadSpecNoCreate()->GetTID();
+ return m_options.GetThreadSpecNoCreate()->GetTID();
}
void Breakpoint::SetThreadIndex(uint32_t index) {
@@ -362,8 +400,7 @@ void Breakpoint::SetThreadIndex(uint32_t index) {
uint32_t Breakpoint::GetThreadIndex() const {
if (m_options.GetThreadSpecNoCreate() == nullptr)
return 0;
- else
- return m_options.GetThreadSpecNoCreate()->GetIndex();
+ return m_options.GetThreadSpecNoCreate()->GetIndex();
}
void Breakpoint::SetThreadName(const char *thread_name) {
@@ -378,8 +415,7 @@ void Breakpoint::SetThreadName(const char *thread_name) {
const char *Breakpoint::GetThreadName() const {
if (m_options.GetThreadSpecNoCreate() == nullptr)
return nullptr;
- else
- return m_options.GetThreadSpecNoCreate()->GetName();
+ return m_options.GetThreadSpecNoCreate()->GetName();
}
void Breakpoint::SetQueueName(const char *queue_name) {
@@ -394,8 +430,7 @@ void Breakpoint::SetQueueName(const char *queue_name) {
const char *Breakpoint::GetQueueName() const {
if (m_options.GetThreadSpecNoCreate() == nullptr)
return nullptr;
- else
- return m_options.GetThreadSpecNoCreate()->GetQueueName();
+ return m_options.GetThreadSpecNoCreate()->GetQueueName();
}
void Breakpoint::SetCondition(const char *condition) {
@@ -851,8 +886,8 @@ void Breakpoint::GetDescription(Stream *s, lldb::DescriptionLevel level,
if (level == eDescriptionLevelBrief) {
s->PutCString(GetBreakpointKind());
return;
- } else
- s->Printf("Kind: %s\n", GetBreakpointKind());
+ }
+ s->Printf("Kind: %s\n", GetBreakpointKind());
}
const size_t num_locations = GetNumLocations();
@@ -956,8 +991,7 @@ void Breakpoint::GetResolverDescription(Stream *s) {
m_resolver_sp->GetDescription(s);
}
-bool Breakpoint::GetMatchingFileLine(ConstString filename,
- uint32_t line_number,
+bool Breakpoint::GetMatchingFileLine(ConstString filename, uint32_t line_number,
BreakpointLocationCollection &loc_coll) {
// TODO: To be correct, this method needs to fill the breakpoint location
// collection
@@ -1014,19 +1048,32 @@ void Breakpoint::SendBreakpointChangedEvent(
const char *Breakpoint::BreakpointEventTypeAsCString(BreakpointEventType type) {
switch (type) {
- case eBreakpointEventTypeInvalidType: return "invalid";
- case eBreakpointEventTypeAdded: return "breakpoint added";
- case eBreakpointEventTypeRemoved: return "breakpoint removed";
- case eBreakpointEventTypeLocationsAdded: return "locations added";
- case eBreakpointEventTypeLocationsRemoved: return "locations removed";
- case eBreakpointEventTypeLocationsResolved: return "locations resolved";
- case eBreakpointEventTypeEnabled: return "breakpoint enabled";
- case eBreakpointEventTypeDisabled: return "breakpoint disabled";
- case eBreakpointEventTypeCommandChanged: return "command changed";
- case eBreakpointEventTypeConditionChanged: return "condition changed";
- case eBreakpointEventTypeIgnoreChanged: return "ignore count changed";
- case eBreakpointEventTypeThreadChanged: return "thread changed";
- case eBreakpointEventTypeAutoContinueChanged: return "autocontinue changed";
+ case eBreakpointEventTypeInvalidType:
+ return "invalid";
+ case eBreakpointEventTypeAdded:
+ return "breakpoint added";
+ case eBreakpointEventTypeRemoved:
+ return "breakpoint removed";
+ case eBreakpointEventTypeLocationsAdded:
+ return "locations added";
+ case eBreakpointEventTypeLocationsRemoved:
+ return "locations removed";
+ case eBreakpointEventTypeLocationsResolved:
+ return "locations resolved";
+ case eBreakpointEventTypeEnabled:
+ return "breakpoint enabled";
+ case eBreakpointEventTypeDisabled:
+ return "breakpoint disabled";
+ case eBreakpointEventTypeCommandChanged:
+ return "command changed";
+ case eBreakpointEventTypeConditionChanged:
+ return "condition changed";
+ case eBreakpointEventTypeIgnoreChanged:
+ return "ignore count changed";
+ case eBreakpointEventTypeThreadChanged:
+ return "thread changed";
+ case eBreakpointEventTypeAutoContinueChanged:
+ return "autocontinue changed";
};
llvm_unreachable("Fully covered switch above!");
}
@@ -1064,7 +1111,7 @@ void Breakpoint::BreakpointEventData::Dump(Stream *s) const {
BreakpointEventType event_type = GetBreakpointEventType();
break_id_t bkpt_id = GetBreakpoint()->GetID();
s->Format("bkpt: {0} type: {1}", bkpt_id,
- BreakpointEventTypeAsCString(event_type));
+ BreakpointEventTypeAsCString(event_type));
}
const Breakpoint::BreakpointEventData *
@@ -1085,8 +1132,7 @@ Breakpoint::BreakpointEventData::GetBreakpointEventTypeFromEvent(
if (data == nullptr)
return eBreakpointEventTypeInvalidType;
- else
- return data->GetBreakpointEventType();
+ return data->GetBreakpointEventType();
}
BreakpointSP Breakpoint::BreakpointEventData::GetBreakpointFromEvent(