[Lldb-commits] [lldb] [llvm] [lldb-dap][NFC] Add Breakpoint struct to share common logic. (PR #80753)
https://github.com/ZequanWu closed https://github.com/llvm/llvm-project/pull/80753 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [llvm] [lldb-dap][NFC] Add Breakpoint struct to share common logic. (PR #80753)
https://github.com/walter-erquinigo approved this pull request. thanks! https://github.com/llvm/llvm-project/pull/80753 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [llvm] [lldb-dap][NFC] Add Breakpoint struct to share common logic. (PR #80753)
ZequanWu wrote: I uploaded https://github.com/llvm/llvm-project/pull/81541 as reference for reviewers to understand the motivation of this patch. https://github.com/llvm/llvm-project/pull/80753 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [llvm] [lldb-dap][NFC] Add Breakpoint struct to share common logic. (PR #80753)
https://github.com/ZequanWu updated https://github.com/llvm/llvm-project/pull/80753 >From c4b767909a9ffc2a3015dc9021e4c265da0d877d Mon Sep 17 00:00:00 2001 From: Zequan Wu Date: Mon, 5 Feb 2024 17:26:48 -0500 Subject: [PATCH 1/3] [lldb-dap][NFC] Add Breakpoint struct to share common logic. --- lldb/tools/lldb-dap/Breakpoint.cpp| 182 ++ lldb/tools/lldb-dap/Breakpoint.h | 34 lldb/tools/lldb-dap/BreakpointBase.cpp| 113 --- lldb/tools/lldb-dap/BreakpointBase.h | 12 +- lldb/tools/lldb-dap/CMakeLists.txt| 1 + lldb/tools/lldb-dap/FunctionBreakpoint.cpp| 12 +- lldb/tools/lldb-dap/FunctionBreakpoint.h | 4 +- lldb/tools/lldb-dap/JSONUtils.cpp | 46 + lldb/tools/lldb-dap/JSONUtils.h | 5 +- lldb/tools/lldb-dap/SourceBreakpoint.cpp | 12 +- lldb/tools/lldb-dap/SourceBreakpoint.h| 6 +- lldb/tools/lldb-dap/lldb-dap.cpp | 17 +- .../gn/secondary/lldb/tools/lldb-dap/BUILD.gn | 1 + 13 files changed, 248 insertions(+), 197 deletions(-) create mode 100644 lldb/tools/lldb-dap/Breakpoint.cpp create mode 100644 lldb/tools/lldb-dap/Breakpoint.h diff --git a/lldb/tools/lldb-dap/Breakpoint.cpp b/lldb/tools/lldb-dap/Breakpoint.cpp new file mode 100644 index 0..4ccf353b06ccc --- /dev/null +++ b/lldb/tools/lldb-dap/Breakpoint.cpp @@ -0,0 +1,182 @@ +//===-- Breakpoint.cpp --*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===--===// + +#include "Breakpoint.h" +#include "DAP.h" +#include "JSONUtils.h" +#include "llvm/ADT/StringExtras.h" + +using namespace lldb_dap; + +void Breakpoint::SetCondition() { bp.SetCondition(condition.c_str()); } + +void Breakpoint::SetHitCondition() { + uint64_t hitCount = 0; + if (llvm::to_integer(hitCondition, hitCount)) +bp.SetIgnoreCount(hitCount - 1); +} + +// logMessage will be divided into array of LogMessagePart as two kinds: +// 1. raw print text message, and +// 2. interpolated expression for evaluation which is inside matching curly +//braces. +// +// The function tries to parse logMessage into a list of LogMessageParts +// for easy later access in BreakpointHitCallback. +void Breakpoint::SetLogMessage() { + logMessageParts.clear(); + + // Contains unmatched open curly braces indices. + std::vector unmatched_curly_braces; + + // Contains all matched curly braces in logMessage. + // Loop invariant: matched_curly_braces_ranges are sorted by start index in + // ascending order without any overlap between them. + std::vector> matched_curly_braces_ranges; + + lldb::SBError error; + // Part1 - parse matched_curly_braces_ranges. + // locating all curly braced expression ranges in logMessage. + // The algorithm takes care of nested and imbalanced curly braces. + for (size_t i = 0; i < logMessage.size(); ++i) { +if (logMessage[i] == '{') { + unmatched_curly_braces.push_back(i); +} else if (logMessage[i] == '}') { + if (unmatched_curly_braces.empty()) +// Nothing to match. +continue; + + int last_unmatched_index = unmatched_curly_braces.back(); + unmatched_curly_braces.pop_back(); + + // Erase any matched ranges included in the new match. + while (!matched_curly_braces_ranges.empty()) { +assert(matched_curly_braces_ranges.back().first != + last_unmatched_index && + "How can a curley brace be matched twice?"); +if (matched_curly_braces_ranges.back().first < last_unmatched_index) + break; + +// This is a nested range let's earse it. +assert((size_t)matched_curly_braces_ranges.back().second < i); +matched_curly_braces_ranges.pop_back(); + } + + // Assert invariant. + assert(matched_curly_braces_ranges.empty() || + matched_curly_braces_ranges.back().first < last_unmatched_index); + matched_curly_braces_ranges.emplace_back(last_unmatched_index, i); +} + } + + // Part2 - parse raw text and expresions parts. + // All expression ranges have been parsed in matched_curly_braces_ranges. + // The code below uses matched_curly_braces_ranges to divide logMessage + // into raw text parts and expression parts. + int last_raw_text_start = 0; + for (const std::pair &curly_braces_range : + matched_curly_braces_ranges) { +// Raw text before open curly brace. +assert(curly_braces_range.first >= last_raw_text_start); +size_t raw_text_len = curly_braces_range.first - last_raw_text_start; +if (raw_text_len > 0) { + error = AppendLogMessagePart( + llvm::StringRef(logMessage.c_str() + last_raw_text_start, +
[Lldb-commits] [lldb] [llvm] [lldb-dap][NFC] Add Breakpoint struct to share common logic. (PR #80753)
@@ -0,0 +1,76 @@ +//===-- Breakpoint.cpp --*- C++ -*-===// JDevlieghere wrote: Nit: you don't need the `*- C++ -*` in source files as emacs can tell it's C++ by the extension, unlike in the header. https://github.com/llvm/llvm-project/pull/80753 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
[Lldb-commits] [lldb] [llvm] [lldb-dap][NFC] Add Breakpoint struct to share common logic. (PR #80753)
https://github.com/ZequanWu updated https://github.com/llvm/llvm-project/pull/80753 >From c4b767909a9ffc2a3015dc9021e4c265da0d877d Mon Sep 17 00:00:00 2001 From: Zequan Wu Date: Mon, 5 Feb 2024 17:26:48 -0500 Subject: [PATCH 1/2] [lldb-dap][NFC] Add Breakpoint struct to share common logic. --- lldb/tools/lldb-dap/Breakpoint.cpp| 182 ++ lldb/tools/lldb-dap/Breakpoint.h | 34 lldb/tools/lldb-dap/BreakpointBase.cpp| 113 --- lldb/tools/lldb-dap/BreakpointBase.h | 12 +- lldb/tools/lldb-dap/CMakeLists.txt| 1 + lldb/tools/lldb-dap/FunctionBreakpoint.cpp| 12 +- lldb/tools/lldb-dap/FunctionBreakpoint.h | 4 +- lldb/tools/lldb-dap/JSONUtils.cpp | 46 + lldb/tools/lldb-dap/JSONUtils.h | 5 +- lldb/tools/lldb-dap/SourceBreakpoint.cpp | 12 +- lldb/tools/lldb-dap/SourceBreakpoint.h| 6 +- lldb/tools/lldb-dap/lldb-dap.cpp | 17 +- .../gn/secondary/lldb/tools/lldb-dap/BUILD.gn | 1 + 13 files changed, 248 insertions(+), 197 deletions(-) create mode 100644 lldb/tools/lldb-dap/Breakpoint.cpp create mode 100644 lldb/tools/lldb-dap/Breakpoint.h diff --git a/lldb/tools/lldb-dap/Breakpoint.cpp b/lldb/tools/lldb-dap/Breakpoint.cpp new file mode 100644 index 0..4ccf353b06ccc --- /dev/null +++ b/lldb/tools/lldb-dap/Breakpoint.cpp @@ -0,0 +1,182 @@ +//===-- Breakpoint.cpp --*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===--===// + +#include "Breakpoint.h" +#include "DAP.h" +#include "JSONUtils.h" +#include "llvm/ADT/StringExtras.h" + +using namespace lldb_dap; + +void Breakpoint::SetCondition() { bp.SetCondition(condition.c_str()); } + +void Breakpoint::SetHitCondition() { + uint64_t hitCount = 0; + if (llvm::to_integer(hitCondition, hitCount)) +bp.SetIgnoreCount(hitCount - 1); +} + +// logMessage will be divided into array of LogMessagePart as two kinds: +// 1. raw print text message, and +// 2. interpolated expression for evaluation which is inside matching curly +//braces. +// +// The function tries to parse logMessage into a list of LogMessageParts +// for easy later access in BreakpointHitCallback. +void Breakpoint::SetLogMessage() { + logMessageParts.clear(); + + // Contains unmatched open curly braces indices. + std::vector unmatched_curly_braces; + + // Contains all matched curly braces in logMessage. + // Loop invariant: matched_curly_braces_ranges are sorted by start index in + // ascending order without any overlap between them. + std::vector> matched_curly_braces_ranges; + + lldb::SBError error; + // Part1 - parse matched_curly_braces_ranges. + // locating all curly braced expression ranges in logMessage. + // The algorithm takes care of nested and imbalanced curly braces. + for (size_t i = 0; i < logMessage.size(); ++i) { +if (logMessage[i] == '{') { + unmatched_curly_braces.push_back(i); +} else if (logMessage[i] == '}') { + if (unmatched_curly_braces.empty()) +// Nothing to match. +continue; + + int last_unmatched_index = unmatched_curly_braces.back(); + unmatched_curly_braces.pop_back(); + + // Erase any matched ranges included in the new match. + while (!matched_curly_braces_ranges.empty()) { +assert(matched_curly_braces_ranges.back().first != + last_unmatched_index && + "How can a curley brace be matched twice?"); +if (matched_curly_braces_ranges.back().first < last_unmatched_index) + break; + +// This is a nested range let's earse it. +assert((size_t)matched_curly_braces_ranges.back().second < i); +matched_curly_braces_ranges.pop_back(); + } + + // Assert invariant. + assert(matched_curly_braces_ranges.empty() || + matched_curly_braces_ranges.back().first < last_unmatched_index); + matched_curly_braces_ranges.emplace_back(last_unmatched_index, i); +} + } + + // Part2 - parse raw text and expresions parts. + // All expression ranges have been parsed in matched_curly_braces_ranges. + // The code below uses matched_curly_braces_ranges to divide logMessage + // into raw text parts and expression parts. + int last_raw_text_start = 0; + for (const std::pair &curly_braces_range : + matched_curly_braces_ranges) { +// Raw text before open curly brace. +assert(curly_braces_range.first >= last_raw_text_start); +size_t raw_text_len = curly_braces_range.first - last_raw_text_start; +if (raw_text_len > 0) { + error = AppendLogMessagePart( + llvm::StringRef(logMessage.c_str() + last_raw_text_start, +
[Lldb-commits] [lldb] [llvm] [lldb-dap][NFC] Add Breakpoint struct to share common logic. (PR #80753)
github-actions[bot] wrote: :warning: C/C++ code formatter, clang-format found issues in your code. :warning: You can test this locally with the following command: ``bash git-clang-format --diff 41ea02261224446dadb1b1561d70137699255518 c4b767909a9ffc2a3015dc9021e4c265da0d877d -- lldb/tools/lldb-dap/Breakpoint.cpp lldb/tools/lldb-dap/Breakpoint.h lldb/tools/lldb-dap/BreakpointBase.cpp lldb/tools/lldb-dap/BreakpointBase.h lldb/tools/lldb-dap/FunctionBreakpoint.cpp lldb/tools/lldb-dap/FunctionBreakpoint.h lldb/tools/lldb-dap/JSONUtils.cpp lldb/tools/lldb-dap/JSONUtils.h lldb/tools/lldb-dap/SourceBreakpoint.cpp lldb/tools/lldb-dap/SourceBreakpoint.h lldb/tools/lldb-dap/lldb-dap.cpp `` View the diff from clang-format here. ``diff diff --git a/lldb/tools/lldb-dap/Breakpoint.h b/lldb/tools/lldb-dap/Breakpoint.h index a668e29f3d..5600bc1792 100644 --- a/lldb/tools/lldb-dap/Breakpoint.h +++ b/lldb/tools/lldb-dap/Breakpoint.h @@ -19,7 +19,7 @@ struct Breakpoint : public BreakpointBase { Breakpoint() = default; Breakpoint(const llvm::json::Object &obj) : BreakpointBase(obj){}; - Breakpoint(lldb::SBBreakpoint bp): bp(bp) {} + Breakpoint(lldb::SBBreakpoint bp) : bp(bp) {} void SetCondition() override; void SetHitCondition() override; `` https://github.com/llvm/llvm-project/pull/80753 ___ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits