summaryrefslogtreecommitdiffstats
path: root/lldb/source
diff options
context:
space:
mode:
authorJim Ingham <jingham@apple.com>2016-09-22 23:42:42 +0000
committerJim Ingham <jingham@apple.com>2016-09-22 23:42:42 +0000
commit2d3628e1f0c52db37d53061f2113e90e52ca0200 (patch)
treee2e551b2572b96b30b5fc7c89963e91375bdc013 /lldb/source
parentbe0ed59cdc9b765869b0a2355b185809507a02db (diff)
downloadbcm5719-llvm-2d3628e1f0c52db37d53061f2113e90e52ca0200.tar.gz
bcm5719-llvm-2d3628e1f0c52db37d53061f2113e90e52ca0200.zip
Add the ability to append breakpoints to the save file.
llvm-svn: 282212
Diffstat (limited to 'lldb/source')
-rw-r--r--lldb/source/API/SBTarget.cpp7
-rw-r--r--lldb/source/Commands/CommandObjectBreakpoint.cpp11
-rw-r--r--lldb/source/Target/Target.cpp32
3 files changed, 40 insertions, 10 deletions
diff --git a/lldb/source/API/SBTarget.cpp b/lldb/source/API/SBTarget.cpp
index 54ed0989daf..7515343e044 100644
--- a/lldb/source/API/SBTarget.cpp
+++ b/lldb/source/API/SBTarget.cpp
@@ -1176,7 +1176,8 @@ lldb::SBError SBTarget::BreakpointsWriteToFile(SBFileSpec &dest_file) {
}
lldb::SBError SBTarget::BreakpointsWriteToFile(SBFileSpec &dest_file,
- SBBreakpointList &bkpt_list) {
+ SBBreakpointList &bkpt_list,
+ bool append) {
SBError sberr;
TargetSP target_sp(GetSP());
if (!target_sp) {
@@ -1187,8 +1188,8 @@ lldb::SBError SBTarget::BreakpointsWriteToFile(SBFileSpec &dest_file,
std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
BreakpointIDList bp_id_list;
bkpt_list.CopyToBreakpointIDList(bp_id_list);
- sberr.ref() =
- target_sp->SerializeBreakpointsToFile(dest_file.ref(), bp_id_list);
+ sberr.ref() = target_sp->SerializeBreakpointsToFile(dest_file.ref(),
+ bp_id_list, append);
return sberr;
}
diff --git a/lldb/source/Commands/CommandObjectBreakpoint.cpp b/lldb/source/Commands/CommandObjectBreakpoint.cpp
index 1e90b57abcf..cb6d1d83907 100644
--- a/lldb/source/Commands/CommandObjectBreakpoint.cpp
+++ b/lldb/source/Commands/CommandObjectBreakpoint.cpp
@@ -2210,7 +2210,8 @@ private:
#pragma mark Write::CommandOptions
static OptionDefinition g_breakpoint_write_options[] = {
// clang-format off
- { LLDB_OPT_SET_ALL, true, "file", 'f', OptionParser::eRequiredArgument, nullptr, nullptr, CommandCompletions::eDiskFileCompletion, eArgTypeFilename, "The file into which to write the breakpoints." },
+ { LLDB_OPT_SET_ALL, true, "file", 'f', OptionParser::eRequiredArgument, nullptr, nullptr, CommandCompletions::eDiskFileCompletion, eArgTypeFilename, "The file into which to write the breakpoints." },
+ { LLDB_OPT_SET_ALL, false, "append",'a', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Append to saved breakpoints file if it exists."},
// clang-format on
};
@@ -2251,6 +2252,9 @@ public:
case 'f':
m_filename.assign(option_arg);
break;
+ case 'a':
+ m_append = true;
+ break;
default:
error.SetErrorStringWithFormat("unrecognized option '%c'",
short_option);
@@ -2262,6 +2266,7 @@ public:
void OptionParsingStarting(ExecutionContext *execution_context) override {
m_filename.clear();
+ m_append = false;
}
llvm::ArrayRef<OptionDefinition> GetDefinitions() override {
@@ -2271,6 +2276,7 @@ public:
// Instance variables to hold the values for command options.
std::string m_filename;
+ bool m_append = false;
};
protected:
@@ -2296,7 +2302,8 @@ protected:
}
}
Error error = target->SerializeBreakpointsToFile(
- FileSpec(m_options.m_filename.c_str(), true), valid_bp_ids);
+ FileSpec(m_options.m_filename.c_str(), true), valid_bp_ids,
+ m_options.m_append);
if (!error.Success()) {
result.AppendErrorWithFormat("error serializing breakpoints: %s.",
error.AsCString());
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp
index d73cc84a156..1fcc4660853 100644
--- a/lldb/source/Target/Target.cpp
+++ b/lldb/source/Target/Target.cpp
@@ -796,7 +796,8 @@ bool Target::EnableBreakpointByID(break_id_t break_id) {
}
Error Target::SerializeBreakpointsToFile(const FileSpec &file,
- const BreakpointIDList &bp_ids) {
+ const BreakpointIDList &bp_ids,
+ bool append) {
Error error;
if (!file) {
@@ -805,6 +806,28 @@ Error Target::SerializeBreakpointsToFile(const FileSpec &file,
}
std::string path(file.GetPath());
+ StructuredData::ObjectSP input_data_sp;
+
+ StructuredData::ArraySP break_store_sp;
+ StructuredData::Array *break_store_ptr = nullptr;
+
+ if (append) {
+ input_data_sp = StructuredData::ParseJSONFromFile(file, error);
+ if (error.Success()) {
+ break_store_ptr = input_data_sp->GetAsArray();
+ if (!break_store_ptr) {
+ error.SetErrorStringWithFormat(
+ "Tried to append to invalid input file %s", path.c_str());
+ return error;
+ }
+ }
+ }
+
+ if (!break_store_ptr) {
+ break_store_sp.reset(new StructuredData::Array());
+ break_store_ptr = break_store_sp.get();
+ }
+
StreamFile out_file(path.c_str(),
File::OpenOptions::eOpenOptionTruncate |
File::OpenOptions::eOpenOptionWrite |
@@ -820,7 +843,6 @@ Error Target::SerializeBreakpointsToFile(const FileSpec &file,
std::unique_lock<std::recursive_mutex> lock;
GetBreakpointList().GetListMutex(lock);
- StructuredData::ArraySP break_store_sp(new StructuredData::Array());
if (bp_ids.GetSize() == 0) {
const BreakpointList &breakpoints = GetBreakpointList();
@@ -830,7 +852,7 @@ Error Target::SerializeBreakpointsToFile(const FileSpec &file,
StructuredData::ObjectSP bkpt_save_sp = bp->SerializeToStructuredData();
// If a breakpoint can't serialize it, just ignore it for now:
if (bkpt_save_sp)
- break_store_sp->AddItem(bkpt_save_sp);
+ break_store_ptr->AddItem(bkpt_save_sp);
}
} else {
@@ -857,12 +879,12 @@ Error Target::SerializeBreakpointsToFile(const FileSpec &file,
bp_id);
return error;
}
- break_store_sp->AddItem(bkpt_save_sp);
+ break_store_ptr->AddItem(bkpt_save_sp);
}
}
}
- break_store_sp->Dump(out_file, false);
+ break_store_ptr->Dump(out_file, false);
out_file.PutChar('\n');
return error;
}
OpenPOWER on IntegriCloud