[Lldb-commits] [lldb] 58dd2be - [lldb-dap][NFC] Simplify using var_ref_t directly. (#225187)
via lldb-commits
lldb-commits at lists.llvm.org
Tue Sep 22 06:48:54 PDT 2026
Author: Ebuka Ezike
Date: 2026-09-22T14:48:48+01:00
New Revision: 58dd2be9a4b535b5467b432ebd6b77e03a93b5de
URL: https://github.com/llvm/llvm-project/commit/58dd2be9a4b535b5467b432ebd6b77e03a93b5de
DIFF: https://github.com/llvm/llvm-project/commit/58dd2be9a4b535b5467b432ebd6b77e03a93b5de.diff
LOG: [lldb-dap][NFC] Simplify using var_ref_t directly. (#225187)
Make var_ref_t printable, update functions that requires var_ref_t to
use var_ref_t instead of integers.
Added:
Modified:
lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp
lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp
lldb/tools/lldb-dap/Handler/LocationsRequestHandler.cpp
lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp
lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp
lldb/tools/lldb-dap/JSONUtils.cpp
lldb/tools/lldb-dap/JSONUtils.h
lldb/tools/lldb-dap/Protocol/DAPTypes.h
lldb/tools/lldb-dap/Variables.cpp
lldb/tools/lldb-dap/Variables.h
lldb/unittests/DAP/DAPTypesTest.cpp
lldb/unittests/DAP/ProtocolTypesTest.cpp
Removed:
################################################################################
diff --git a/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp
index 76177eb9b57cc..91e40b88c906e 100644
--- a/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp
@@ -42,7 +42,7 @@ DataBreakpointInfoRequestHandler::Run(
const protocol::DataBreakpointInfoArguments &args) const {
protocol::DataBreakpointInfoResponseBody response;
const var_ref_t arg_var_ref =
- args.variablesReference.value_or(var_ref_t(var_ref_t::k_no_child));
+ args.variablesReference.value_or(var_ref_t::k_no_child);
lldb::SBValue variable =
dap.reference_storage.FindVariable(arg_var_ref, args.name);
diff --git a/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp
index fa305825eafb6..5293a6009e923 100644
--- a/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp
@@ -155,8 +155,7 @@ EvaluateRequestHandler::Run(const EvaluateArguments &arguments) const {
if (ValuePointsToCode(value) &&
body.variablesReference.Kind() != eReferenceKindInvalid)
- body.valueLocationReference =
- PackLocation(body.variablesReference.AsUInt32(), true);
+ body.valueLocationReference = PackLocation(body.variablesReference, true);
return body;
}
diff --git a/lldb/tools/lldb-dap/Handler/LocationsRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/LocationsRequestHandler.cpp
index 6a8adc408b7c6..b852e18e75345 100644
--- a/lldb/tools/lldb-dap/Handler/LocationsRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/LocationsRequestHandler.cpp
@@ -27,8 +27,7 @@ LocationsRequestHandler::Run(const protocol::LocationsArguments &args) const {
// We use the lowest bit to distinguish between value location and declaration
// location
auto [var_ref, is_value_location] = UnpackLocation(args.locationReference);
- lldb::SBValue variable =
- dap.reference_storage.GetVariable(var_ref_t(var_ref));
+ lldb::SBValue variable = dap.reference_storage.GetVariable(var_ref);
if (!variable.IsValid())
return llvm::make_error<DAPError>("Invalid variable reference");
diff --git a/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp
index 47a45ab807854..03a4d9c48f991 100644
--- a/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp
@@ -43,9 +43,7 @@ SetVariableRequestHandler::Run(const SetVariableArguments &args) const {
if (args.variablesReference.Kind() == eReferenceKindInvalid) {
return llvm::make_error<DAPError>(
- llvm::formatv("invalid reference {}",
- args.variablesReference.AsUInt32())
- .str(),
+ llvm::formatv("invalid reference {}", args.variablesReference),
llvm::inconvertibleErrorCode(),
/*show_user=*/false);
}
@@ -98,7 +96,7 @@ SetVariableRequestHandler::Run(const SetVariableArguments &args) const {
body.memoryReference = addr;
if (ValuePointsToCode(variable))
- body.valueLocationReference = PackLocation(new_var_ref.AsUInt32(), true);
+ body.valueLocationReference = PackLocation(new_var_ref, true);
// Also send invalidated event to signal client that some variables
// (e.g. references) can be changed.
diff --git a/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp
index 841e0ec2e497e..a8127188b065f 100644
--- a/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp
@@ -28,13 +28,13 @@ VariablesRequestHandler::Run(const VariablesArguments &arguments) const {
const var_ref_t var_ref = arguments.variablesReference;
if (var_ref.Kind() == eReferenceKindInvalid)
return llvm::make_error<DAPError>(
- llvm::formatv("invalid variablesReference: {}.", var_ref.AsUInt32()),
+ llvm::formatv("invalid variablesReference: {}.", var_ref),
/*error_code=*/llvm::inconvertibleErrorCode(), /*show_user=*/false);
VariableStore *store = dap.reference_storage.GetVariableStore(var_ref);
if (!store)
return llvm::make_error<DAPError>(
- llvm::formatv("invalid variablesReference: {}.", var_ref.AsUInt32()),
+ llvm::formatv("invalid variablesReference: {}.", var_ref),
/*error_code=*/llvm::inconvertibleErrorCode(), /*show_user=*/false);
Expected<std::vector<Variable>> variables = store->GetVariables(arguments);
diff --git a/lldb/tools/lldb-dap/JSONUtils.cpp b/lldb/tools/lldb-dap/JSONUtils.cpp
index 73b7949e2e9a5..8b40f93439b48 100644
--- a/lldb/tools/lldb-dap/JSONUtils.cpp
+++ b/lldb/tools/lldb-dap/JSONUtils.cpp
@@ -359,14 +359,6 @@ bool ValuePointsToCode(lldb::SBValue v) {
return line_entry.IsValid();
}
-int64_t PackLocation(int64_t var_ref, bool is_value_location) {
- return var_ref << 1 | is_value_location;
-}
-
-std::pair<int64_t, bool> UnpackLocation(int64_t location_id) {
- return std::pair{location_id >> 1, location_id & 1};
-}
-
/// See
/// https://microsoft.github.io/debug-adapter-protocol/specification#Reverse_Requests_RunInTerminal
llvm::json::Object CreateRunInTerminalReverseRequest(
diff --git a/lldb/tools/lldb-dap/JSONUtils.h b/lldb/tools/lldb-dap/JSONUtils.h
index 74a7e4bb5c983..6662e8a44ad6d 100644
--- a/lldb/tools/lldb-dap/JSONUtils.h
+++ b/lldb/tools/lldb-dap/JSONUtils.h
@@ -154,10 +154,14 @@ bool ValuePointsToCode(lldb::SBValue v);
/// Pack a location into a single integer which we can send via
/// the debug adapter protocol.
-int64_t PackLocation(int64_t var_ref, bool is_value_location);
+inline int64_t PackLocation(var_ref_t var_ref, bool is_value_location) {
+ return var_ref.AsUInt32() << 1 | is_value_location;
+}
/// Reverse of `PackLocation`
-std::pair<int64_t, bool> UnpackLocation(int64_t location_id);
+inline std::pair<var_ref_t, bool> UnpackLocation(int64_t location_id) {
+ return std::pair{var_ref_t(location_id >> 1), location_id & 1};
+}
/// Create a runInTerminal reverse request object
///
diff --git a/lldb/tools/lldb-dap/Protocol/DAPTypes.h b/lldb/tools/lldb-dap/Protocol/DAPTypes.h
index 5564489cf2e69..853a70830ab3e 100644
--- a/lldb/tools/lldb-dap/Protocol/DAPTypes.h
+++ b/lldb/tools/lldb-dap/Protocol/DAPTypes.h
@@ -20,6 +20,7 @@
#include "lldb/lldb-defines.h"
#include "lldb/lldb-types.h"
#include "llvm/Support/JSON.h"
+#include "llvm/Support/raw_ostream.h"
#include <cstdint>
#include <optional>
@@ -43,13 +44,14 @@ struct var_ref_t {
static constexpr uint32_t k_kind_mask = 0xFF;
public:
- static constexpr uint32_t k_invalid_var_ref = UINT32_MAX;
- static constexpr uint32_t k_no_child = 0;
+ static const var_ref_t k_invalid_var_ref;
+ static const var_ref_t k_no_child;
explicit constexpr var_ref_t(uint32_t reference, ReferenceKind kind)
: reference(reference), kind(kind) {}
- explicit constexpr var_ref_t(uint32_t masked_ref = k_invalid_var_ref)
+ explicit constexpr var_ref_t(
+ uint32_t masked_ref = k_invalid_var_ref.AsUInt32())
: reference(masked_ref & k_reference_bit_mask),
kind((masked_ref >> k_reference_bit_size) & k_kind_mask) {}
@@ -70,6 +72,10 @@ struct var_ref_t {
[[nodiscard]] constexpr uint32_t Reference() const { return reference; }
+ friend constexpr bool operator==(var_ref_t lhs, var_ref_t rhs) {
+ return lhs.AsUInt32() == rhs.AsUInt32();
+ }
+
// We should be able to store at least 8 million variables for each store
// type at every stopped state.
static constexpr uint32_t k_variables_reference_threshold = 8'000'000;
@@ -86,10 +92,16 @@ struct var_ref_t {
static_assert(sizeof(var_ref_t) == sizeof(uint32_t) &&
"the size of var_ref_t must be equal to the size of uint32_t.");
+inline constexpr var_ref_t var_ref_t::k_no_child{0};
+inline constexpr var_ref_t var_ref_t::k_invalid_var_ref{UINT32_MAX};
+
bool fromJSON(const llvm::json::Value &, var_ref_t &, llvm::json::Path);
inline llvm::json::Value toJSON(const var_ref_t &var_ref) {
return var_ref.AsUInt32();
}
+inline llvm::raw_ostream &operator<<(llvm::raw_ostream &os, var_ref_t ref) {
+ return os << ref.AsUInt32();
+}
/// Data used to help lldb-dap resolve breakpoints persistently across
diff erent
/// sessions. This information is especially useful for assembly breakpoints,
diff --git a/lldb/tools/lldb-dap/Variables.cpp b/lldb/tools/lldb-dap/Variables.cpp
index 6ec2548ccb393..3b7486cb236f8 100644
--- a/lldb/tools/lldb-dap/Variables.cpp
+++ b/lldb/tools/lldb-dap/Variables.cpp
@@ -157,17 +157,16 @@ class VariableStoreImpl : public VariableStore {
const var_ref_t var_ref =
HasInnerVarref(v)
? m_storage.Insert(v, /*is_permanent=*/m_is_permanent, is_internal)
- : var_ref_t(var_ref_t::k_no_child);
+ : var_ref_t::k_no_child;
if (var.indexedVariables || v.MightHaveChildren())
var.variablesReference = var_ref;
if (v.GetDeclaration().IsValid())
- var.declarationLocationReference =
- PackLocation(var_ref.AsUInt32(), false);
+ var.declarationLocationReference = PackLocation(var_ref, false);
if (ValuePointsToCode(v))
- var.valueLocationReference = PackLocation(var_ref.AsUInt32(), true);
+ var.valueLocationReference = PackLocation(var_ref, true);
if (lldb::addr_t addr = v.GetLoadAddress(); addr != LLDB_INVALID_ADDRESS)
var.memoryReference = addr;
diff --git a/lldb/tools/lldb-dap/Variables.h b/lldb/tools/lldb-dap/Variables.h
index eda7103aaa781..72f00c90b1d30 100644
--- a/lldb/tools/lldb-dap/Variables.h
+++ b/lldb/tools/lldb-dap/Variables.h
@@ -123,7 +123,7 @@ struct VariableReferenceStorage {
if (LLVM_UNLIKELY(reference_count >=
var_ref_t::k_max_variables_references)) {
// We cannot add new variables to the pool;
- return var_ref_t(var_ref_t::k_invalid_var_ref);
+ return var_ref_t::k_invalid_var_ref;
}
m_pool.emplace_back(std::make_unique<T>(std::forward<Args>(args)...));
diff --git a/lldb/unittests/DAP/DAPTypesTest.cpp b/lldb/unittests/DAP/DAPTypesTest.cpp
index 81ebd3f51fa94..0bd94db042146 100644
--- a/lldb/unittests/DAP/DAPTypesTest.cpp
+++ b/lldb/unittests/DAP/DAPTypesTest.cpp
@@ -74,7 +74,7 @@ TEST(DapTypesTest, DAP_var_ref_t) {
EXPECT_EQ(perm_ref.Kind(), eReferenceKindPermanent);
const var_ref_t invalid_ref{};
- EXPECT_EQ(invalid_ref.AsUInt32(), var_ref_t::k_invalid_var_ref);
+ EXPECT_EQ(invalid_ref, var_ref_t::k_invalid_var_ref);
EXPECT_EQ(invalid_ref.Kind(), eReferenceKindInvalid);
// Check unknown reference kind.
@@ -96,6 +96,5 @@ TEST(DapTypesTest, DAP_var_ref_t) {
EXPECT_EQ(scope_ref2.Reference(), 3U);
EXPECT_EQ(scope_ref2.Kind(), eReferenceKindTemporary);
- EXPECT_EQ(var_ref_t().AsUInt32(),
- var_ref_t{var_ref_t::k_invalid_var_ref}.AsUInt32());
+ EXPECT_EQ(var_ref_t().AsUInt32(), var_ref_t::k_invalid_var_ref.AsUInt32());
}
diff --git a/lldb/unittests/DAP/ProtocolTypesTest.cpp b/lldb/unittests/DAP/ProtocolTypesTest.cpp
index 596bbb8a7ca73..3acb0f0e5bfe6 100644
--- a/lldb/unittests/DAP/ProtocolTypesTest.cpp
+++ b/lldb/unittests/DAP/ProtocolTypesTest.cpp
@@ -326,8 +326,7 @@ TEST(ProtocolTypesTest, Scope) {
ASSERT_THAT_EXPECTED(deserialized_scope, llvm::Succeeded());
EXPECT_EQ(scope.name, deserialized_scope->name);
EXPECT_EQ(scope.presentationHint, deserialized_scope->presentationHint);
- EXPECT_EQ(scope.variablesReference.AsUInt32(),
- deserialized_scope->variablesReference.AsUInt32());
+ EXPECT_EQ(scope.variablesReference, deserialized_scope->variablesReference);
EXPECT_EQ(scope.namedVariables, deserialized_scope->namedVariables);
EXPECT_EQ(scope.indexedVariables, deserialized_scope->indexedVariables);
EXPECT_EQ(scope.expensive, deserialized_scope->expensive);
More information about the lldb-commits
mailing list