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.cpp39
1 files changed, 25 insertions, 14 deletions
diff --git a/lldb/source/Breakpoint/Breakpoint.cpp b/lldb/source/Breakpoint/Breakpoint.cpp
index 13acf4bb92e20..317dfa2310942 100644
--- a/lldb/source/Breakpoint/Breakpoint.cpp
+++ b/lldb/source/Breakpoint/Breakpoint.cpp
@@ -1,4 +1,4 @@
-//===-- Breakpoint.cpp ------------------------------------------*- C++ -*-===//
+//===-- Breakpoint.cpp ----------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -55,21 +55,29 @@ Breakpoint::Breakpoint(Target &target, SearchFilterSP &filter_sp,
m_being_created = false;
}
-Breakpoint::Breakpoint(Target &new_target, Breakpoint &source_bp)
+Breakpoint::Breakpoint(Target &new_target, const Breakpoint &source_bp)
: m_being_created(true), m_hardware(source_bp.m_hardware),
m_target(new_target), m_name_list(source_bp.m_name_list),
m_options_up(new BreakpointOptions(*source_bp.m_options_up)),
m_locations(*this),
m_resolve_indirect_symbols(source_bp.m_resolve_indirect_symbols),
- m_hit_count(0) {
- // Now go through and copy the filter & resolver:
- m_resolver_sp = source_bp.m_resolver_sp->CopyForBreakpoint(*this);
- m_filter_sp = source_bp.m_filter_sp->CopyForBreakpoint(*this);
-}
+ m_hit_count(0) {}
// Destructor
Breakpoint::~Breakpoint() = default;
+BreakpointSP Breakpoint::CopyFromBreakpoint(TargetSP new_target,
+ const Breakpoint& bp_to_copy_from) {
+ if (!new_target)
+ return BreakpointSP();
+
+ BreakpointSP bp(new Breakpoint(*new_target, bp_to_copy_from));
+ // Now go through and copy the filter & resolver:
+ bp->m_resolver_sp = bp_to_copy_from.m_resolver_sp->CopyForBreakpoint(bp);
+ bp->m_filter_sp = bp_to_copy_from.m_filter_sp->CreateCopy(new_target);
+ return bp;
+}
+
// Serialization
StructuredData::ObjectSP Breakpoint::SerializeToStructuredData() {
// Serialize the resolver:
@@ -120,8 +128,10 @@ StructuredData::ObjectSP Breakpoint::SerializeToStructuredData() {
}
lldb::BreakpointSP Breakpoint::CreateFromStructuredData(
- Target &target, StructuredData::ObjectSP &object_data, Status &error) {
+ TargetSP target_sp, StructuredData::ObjectSP &object_data, Status &error) {
BreakpointSP result_sp;
+ if (!target_sp)
+ return result_sp;
StructuredData::Dictionary *breakpoint_dict = object_data->GetAsDictionary();
@@ -155,11 +165,11 @@ lldb::BreakpointSP Breakpoint::CreateFromStructuredData(
SearchFilter::GetSerializationKey(), filter_dict);
SearchFilterSP filter_sp;
if (!success)
- filter_sp = std::make_shared<SearchFilterForUnconstrainedSearches>(
- target.shared_from_this());
+ filter_sp =
+ std::make_shared<SearchFilterForUnconstrainedSearches>(target_sp);
else {
- filter_sp = SearchFilter::CreateFromStructuredData(target, *filter_dict,
- create_error);
+ filter_sp = SearchFilter::CreateFromStructuredData(target_sp, *filter_dict,
+ create_error);
if (create_error.Fail()) {
error.SetErrorStringWithFormat(
"Error creating breakpoint filter from data: %s.",
@@ -170,6 +180,7 @@ lldb::BreakpointSP Breakpoint::CreateFromStructuredData(
std::unique_ptr<BreakpointOptions> options_up;
StructuredData::Dictionary *options_dict;
+ Target& target = *target_sp;
success = breakpoint_dict->GetValueForKeyAsDictionary(
BreakpointOptions::GetSerializationKey(), options_dict);
if (success) {
@@ -187,8 +198,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_up = std::move(options_up);