[llvm-branch-commits] [lldb] [lldbremote] Implement support for MultiBreakpoint packet (PR #192919)
David Spickett via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Fri Apr 24 08:51:20 PDT 2026
================
@@ -3123,6 +3126,65 @@ GDBRemoteCommunicationServerLLGS::Handle_z(StringExtractorGDBRemote &packet) {
ExecuteRemoveBreakpoint(packet.GetStringRef()));
}
+GDBRemoteCommunication::PacketResult
+GDBRemoteCommunicationServerLLGS::Handle_jMultiBreakpoint(
+ StringExtractorGDBRemote &packet) {
+ llvm::StringRef packet_str = packet.GetStringRef();
+ if (!packet_str.consume_front("jMultiBreakpoint:"))
+ return SendIllFormedResponse(packet,
+ "Invalid jMultiBreakpoint packet prefix");
+
+ llvm::Expected<llvm::json::Value> parsed = llvm::json::parse(packet_str);
+ if (!parsed) {
+ llvm::consumeError(parsed.takeError());
+ return SendIllFormedResponse(
+ packet, "jMultiBreakpoint did not contain valid JSON");
+ }
+ llvm::json::Object *request_dict = parsed->getAsObject();
+ if (!request_dict)
+ return SendIllFormedResponse(
+ packet, "jMultiBreakpoint did not contain a JSON dictionary");
+
+ llvm::json::Array *request_array =
+ request_dict->getArray("breakpoint_requests");
+ if (!request_array)
+ return SendIllFormedResponse(
+ packet,
+ "jMultiBreakpoint did not contain a valid 'breakpoint_requests' field");
+
+ llvm::json::Array reply_array;
+ for (const llvm::json::Value &value : *request_array) {
+ std::optional<llvm::StringRef> request = value.getAsString();
+ if (!request)
+ return SendIllFormedResponse(packet,
+ "jMultiBreakpoint had a non-string entry");
+ BreakpointResult result = request->starts_with("Z")
+ ? ExecuteSetBreakpoint(*request)
+ : ExecuteRemoveBreakpoint(*request);
+ switch (result.kind) {
+ case BreakpointResult::Kind::OK:
+ reply_array.push_back("OK");
+ break;
+ case BreakpointResult::Kind::Error:
+ reply_array.push_back(llvm::formatv("E{0:X-2}", result.error_code).str());
+ break;
+ case BreakpointResult::Kind::IllFormed:
+ reply_array.push_back("E03");
+ break;
+ }
+ }
+
+ llvm::json::Object dict;
+ dict.try_emplace("results", std::move(reply_array));
+
+ StreamString stream;
+ stream.AsRawOstream() << llvm::json::Value(std::move(dict));
+ StringRef response_str = stream.GetString();
+ StreamGDBRemote response;
----------------
DavidSpickett wrote:
I thought you could stream direct to this because it is a StreamString subclass but this won't work because you need to escape the bytes as well. So you have to have this 2 step process.
(don't change any of it, just a note in case other reviewers think that same thing)
https://github.com/llvm/llvm-project/pull/192919
More information about the llvm-branch-commits
mailing list