[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