diff options
Diffstat (limited to 'lldb/source/Breakpoint/Breakpoint.cpp')
| -rw-r--r-- | lldb/source/Breakpoint/Breakpoint.cpp | 112 |
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( |
