https://github.com/ashgti created https://github.com/llvm/llvm-project/pull/115561
This is part of a larger refactor to remove the global `g_dap` variable. >From 3105fc424d4c712d90f10b771d4644c0e97355c4 Mon Sep 17 00:00:00 2001 From: John Harrison <harj...@google.com> Date: Thu, 7 Nov 2024 13:06:01 -0800 Subject: [PATCH] [lldb-da] Refactoring JSONUtils to not use `g_dap` and instead passing in required arguments. This is part of a larger refactor to remove the global `g_dap` variable. --- lldb/tools/lldb-dap/JSONUtils.cpp | 95 ++++++++++++++----------------- lldb/tools/lldb-dap/JSONUtils.h | 54 +++++++++++++----- lldb/tools/lldb-dap/lldb-dap.cpp | 30 +++++----- 3 files changed, 102 insertions(+), 77 deletions(-) diff --git a/lldb/tools/lldb-dap/JSONUtils.cpp b/lldb/tools/lldb-dap/JSONUtils.cpp index a7300abae0eac8..6ca4dfb4711a13 100644 --- a/lldb/tools/lldb-dap/JSONUtils.cpp +++ b/lldb/tools/lldb-dap/JSONUtils.cpp @@ -154,7 +154,7 @@ DecodeMemoryReference(llvm::StringRef memoryReference) { std::vector<std::string> GetStrings(const llvm::json::Object *obj, llvm::StringRef key) { std::vector<std::string> strs; - auto json_array = obj->getArray(key); + const auto *json_array = obj->getArray(key); if (!json_array) return strs; for (const auto &value : *json_array) { @@ -210,12 +210,6 @@ static bool IsClassStructOrUnionType(lldb::SBType t) { /// glance. static std::optional<std::string> TryCreateAutoSummaryForContainer(lldb::SBValue &v) { - // We gate this feature because it performs GetNumChildren(), which can - // cause performance issues because LLDB needs to complete possibly huge - // types. - if (!g_dap.enable_auto_variable_summaries) - return std::nullopt; - if (!v.MightHaveChildren()) return std::nullopt; /// As this operation can be potentially slow, we limit the total time spent @@ -271,10 +265,7 @@ TryCreateAutoSummaryForContainer(lldb::SBValue &v) { /// Try to create a summary string for the given value that doesn't have a /// summary of its own. -static std::optional<std::string> TryCreateAutoSummary(lldb::SBValue value) { - if (!g_dap.enable_auto_variable_summaries) - return std::nullopt; - +static std::optional<std::string> TryCreateAutoSummary(lldb::SBValue &value) { // We use the dereferenced value for generating the summary. if (value.GetType().IsPointerType() || value.GetType().IsReferenceType()) value = value.Dereference(); @@ -485,10 +476,12 @@ static std::string ConvertDebugInfoSizeToString(uint64_t debug_info) { } return oss.str(); } -llvm::json::Value CreateModule(lldb::SBModule &module) { + +llvm::json::Value CreateModule(lldb::SBTarget &target, lldb::SBModule &module) { llvm::json::Object object; - if (!module.IsValid()) + if (!target.IsValid() || !module.IsValid()) return llvm::json::Value(std::move(object)); + const char *uuid = module.GetUUIDString(); object.try_emplace("id", uuid ? std::string(uuid) : std::string("")); object.try_emplace("name", std::string(module.GetFileSpec().GetFilename())); @@ -514,7 +507,7 @@ llvm::json::Value CreateModule(lldb::SBModule &module) { object.try_emplace("symbolStatus", "Symbols not found."); } std::string loaded_addr = std::to_string( - module.GetObjectFileHeaderAddress().GetLoadAddress(g_dap.target)); + module.GetObjectFileHeaderAddress().GetLoadAddress(target)); object.try_emplace("addressRange", loaded_addr); std::string version_str; uint32_t version_nums[3]; @@ -705,7 +698,7 @@ llvm::json::Value CreateSource(llvm::StringRef source_path) { return llvm::json::Value(std::move(source)); } -std::optional<llvm::json::Value> CreateSource(lldb::SBFrame &frame) { +static std::optional<llvm::json::Value> CreateSource(lldb::SBFrame &frame) { auto line_entry = frame.GetLineEntry(); // A line entry of 0 indicates the line is compiler generated i.e. no source // file is associated with the frame. @@ -776,15 +769,15 @@ std::optional<llvm::json::Value> CreateSource(lldb::SBFrame &frame) { // }, // "required": [ "id", "name", "line", "column" ] // } -llvm::json::Value CreateStackFrame(lldb::SBFrame &frame) { +llvm::json::Value CreateStackFrame(lldb::SBFrame &frame, + lldb::SBFormat &format) { llvm::json::Object object; int64_t frame_id = MakeDAPFrameID(frame); object.try_emplace("id", frame_id); std::string frame_name; lldb::SBStream stream; - if (g_dap.frame_format && - frame.GetDescriptionWithFormat(g_dap.frame_format, stream).Success()) { + if (format && frame.GetDescriptionWithFormat(format, stream).Success()) { frame_name = stream.GetData(); // `function_name` can be a nullptr, which throws an error when assigned to @@ -801,7 +794,7 @@ llvm::json::Value CreateStackFrame(lldb::SBFrame &frame) { } // We only include `[opt]` if a custom frame format is not specified. - if (!g_dap.frame_format && frame.GetFunction().GetIsOptimized()) + if (!format && frame.GetFunction().GetIsOptimized()) frame_name += " [opt]"; EmplaceSafeString(object, "name", frame_name); @@ -835,11 +828,11 @@ llvm::json::Value CreateStackFrame(lldb::SBFrame &frame) { return llvm::json::Value(std::move(object)); } -llvm::json::Value CreateExtendedStackFrameLabel(lldb::SBThread &thread) { +llvm::json::Value CreateExtendedStackFrameLabel(lldb::SBThread &thread, + lldb::SBFormat &format) { std::string name; lldb::SBStream stream; - if (g_dap.thread_format && - thread.GetDescriptionWithFormat(g_dap.thread_format, stream).Success()) { + if (format && thread.GetDescriptionWithFormat(format, stream).Success()) { name = stream.GetData(); } else { const uint32_t thread_idx = thread.GetExtendedBacktraceOriginatingIndexID(); @@ -872,13 +865,12 @@ llvm::json::Value CreateExtendedStackFrameLabel(lldb::SBThread &thread) { // }, // "required": [ "id", "name" ] // } -llvm::json::Value CreateThread(lldb::SBThread &thread) { +llvm::json::Value CreateThread(lldb::SBThread &thread, lldb::SBFormat &format) { llvm::json::Object object; object.try_emplace("id", (int64_t)thread.GetThreadID()); std::string thread_str; lldb::SBStream stream; - if (g_dap.thread_format && - thread.GetDescriptionWithFormat(g_dap.thread_format, stream).Success()) { + if (format && thread.GetDescriptionWithFormat(format, stream).Success()) { thread_str = stream.GetData(); } else { const char *thread_name = thread.GetName(); @@ -966,7 +958,7 @@ llvm::json::Value CreateThread(lldb::SBThread &thread) { // "required": [ "event", "body" ] // }] // } -llvm::json::Value CreateThreadStopped(lldb::SBThread &thread, +llvm::json::Value CreateThreadStopped(DAP &dap, lldb::SBThread &thread, uint32_t stop_id) { llvm::json::Object event(CreateEventObject("stopped")); llvm::json::Object body; @@ -976,13 +968,13 @@ llvm::json::Value CreateThreadStopped(lldb::SBThread &thread, body.try_emplace("reason", "step"); break; case lldb::eStopReasonBreakpoint: { - ExceptionBreakpoint *exc_bp = g_dap.GetExceptionBPFromStopReason(thread); + ExceptionBreakpoint *exc_bp = dap.GetExceptionBPFromStopReason(thread); if (exc_bp) { body.try_emplace("reason", "exception"); EmplaceSafeString(body, "description", exc_bp->label); } else { InstructionBreakpoint *inst_bp = - g_dap.GetInstructionBPFromStopReason(thread); + dap.GetInstructionBPFromStopReason(thread); if (inst_bp) { body.try_emplace("reason", "instruction breakpoint"); } else { @@ -1042,21 +1034,21 @@ llvm::json::Value CreateThreadStopped(lldb::SBThread &thread, } } // "threadCausedFocus" is used in tests to validate breaking behavior. - if (tid == g_dap.focus_tid) { + if (tid == dap.focus_tid) { body.try_emplace("threadCausedFocus", true); } - body.try_emplace("preserveFocusHint", tid != g_dap.focus_tid); + body.try_emplace("preserveFocusHint", tid != dap.focus_tid); body.try_emplace("allThreadsStopped", true); event.try_emplace("body", std::move(body)); return llvm::json::Value(std::move(event)); } -const char *GetNonNullVariableName(lldb::SBValue v) { +const char *GetNonNullVariableName(lldb::SBValue &v) { const char *name = v.GetName(); return name ? name : "<null>"; } -std::string CreateUniqueVariableNameForDisplay(lldb::SBValue v, +std::string CreateUniqueVariableNameForDisplay(lldb::SBValue &v, bool is_name_duplicated) { lldb::SBStream name_builder; name_builder.Print(GetNonNullVariableName(v)); @@ -1073,7 +1065,9 @@ std::string CreateUniqueVariableNameForDisplay(lldb::SBValue v, return name_builder.GetData(); } -VariableDescription::VariableDescription(lldb::SBValue v, bool format_hex, +VariableDescription::VariableDescription(lldb::SBValue v, + bool auto_variable_summaries, + bool format_hex, bool is_name_duplicated, std::optional<std::string> custom_name) : v(v) { @@ -1104,7 +1098,7 @@ VariableDescription::VariableDescription(lldb::SBValue v, bool format_hex, } else { value = llvm::StringRef(v.GetValue()).str(); summary = llvm::StringRef(v.GetSummary()).str(); - if (summary.empty()) + if (summary.empty() && auto_variable_summaries) auto_summary = TryCreateAutoSummary(v); std::optional<std::string> effective_summary = @@ -1188,7 +1182,7 @@ bool ValuePointsToCode(lldb::SBValue v) { lldb::addr_t addr = v.GetValueAsAddress(); lldb::SBLineEntry line_entry = - g_dap.target.ResolveLoadAddress(addr).GetLineEntry(); + v.GetTarget().ResolveLoadAddress(addr).GetLineEntry(); return line_entry.IsValid(); } @@ -1349,9 +1343,12 @@ std::pair<int64_t, bool> UnpackLocation(int64_t location_id) { // "required": [ "name", "value", "variablesReference" ] // } llvm::json::Value CreateVariable(lldb::SBValue v, int64_t var_ref, - bool format_hex, bool is_name_duplicated, + bool format_hex, bool auto_variable_summaries, + bool synthetic_child_debugging, + bool is_name_duplicated, std::optional<std::string> custom_name) { - VariableDescription desc(v, format_hex, is_name_duplicated, custom_name); + VariableDescription desc(v, auto_variable_summaries, format_hex, + is_name_duplicated, custom_name); llvm::json::Object object; EmplaceSafeString(object, "name", desc.name); EmplaceSafeString(object, "value", desc.display_value); @@ -1387,7 +1384,7 @@ llvm::json::Value CreateVariable(lldb::SBValue v, int64_t var_ref, size_t num_children = v.GetNumChildren(); // If we are creating a "[raw]" fake child for each synthetic type, we // have to account for it when returning indexed variables. - if (g_dap.enable_synthetic_child_debugging) + if (synthetic_child_debugging) ++num_children; object.try_emplace("indexedVariables", num_children); } @@ -1418,7 +1415,7 @@ llvm::json::Value CreateVariable(lldb::SBValue v, int64_t var_ref, return llvm::json::Value(std::move(object)); } -llvm::json::Value CreateCompileUnit(lldb::SBCompileUnit unit) { +llvm::json::Value CreateCompileUnit(lldb::SBCompileUnit &unit) { llvm::json::Object object; char unit_path_arr[PATH_MAX]; unit.GetFileSpec().GetPath(unit_path_arr, sizeof(unit_path_arr)); @@ -1439,7 +1436,7 @@ CreateRunInTerminalReverseRequest(const llvm::json::Object &launch_request, // the terminal in a new window. run_in_terminal_args.try_emplace("kind", "integrated"); - auto launch_request_arguments = launch_request.getObject("arguments"); + const auto *launch_request_arguments = launch_request.getObject("arguments"); // The program path must be the first entry in the "args" field std::vector<std::string> args = {debug_adaptor_path.str(), "--comm-file", comm_file.str()}; @@ -1465,11 +1462,7 @@ CreateRunInTerminalReverseRequest(const llvm::json::Object &launch_request, llvm::StringRef key = envs.GetNameAtIndex(index); llvm::StringRef value = envs.GetValueAtIndex(index); - if (key.empty()) - g_dap.SendOutput(OutputType::Stderr, - "empty environment variable for value: \"" + - value.str() + '\"'); - else + if (!key.empty()) env_json.try_emplace(key, value); } run_in_terminal_args.try_emplace("env", @@ -1481,8 +1474,8 @@ CreateRunInTerminalReverseRequest(const llvm::json::Object &launch_request, // Keep all the top level items from the statistics dump, except for the // "modules" array. It can be huge and cause delay // Array and dictionary value will return as <key, JSON string> pairs -void FilterAndGetValueForKey(const lldb::SBStructuredData data, const char *key, - llvm::json::Object &out) { +static void FilterAndGetValueForKey(const lldb::SBStructuredData data, + const char *key, llvm::json::Object &out) { lldb::SBStructuredData value = data.GetValueForKey(key); std::string key_utf8 = llvm::json::fixUTF8(key); if (llvm::StringRef(key) == "modules") @@ -1524,8 +1517,8 @@ void FilterAndGetValueForKey(const lldb::SBStructuredData data, const char *key, } } -void addStatistic(llvm::json::Object &event) { - lldb::SBStructuredData statistics = g_dap.target.GetStatistics(); +static void addStatistic(lldb::SBTarget &target, llvm::json::Object &event) { + lldb::SBStructuredData statistics = target.GetStatistics(); bool is_dictionary = statistics.GetType() == lldb::eStructuredDataTypeDictionary; if (!is_dictionary) @@ -1542,9 +1535,9 @@ void addStatistic(llvm::json::Object &event) { event.try_emplace("statistics", std::move(stats_body)); } -llvm::json::Object CreateTerminatedEventObject() { +llvm::json::Object CreateTerminatedEventObject(lldb::SBTarget &target) { llvm::json::Object event(CreateEventObject("terminated")); - addStatistic(event); + addStatistic(target, event); return event; } diff --git a/lldb/tools/lldb-dap/JSONUtils.h b/lldb/tools/lldb-dap/JSONUtils.h index 2e13459c45556f..db56d987773476 100644 --- a/lldb/tools/lldb-dap/JSONUtils.h +++ b/lldb/tools/lldb-dap/JSONUtils.h @@ -12,6 +12,7 @@ #include "DAPForward.h" #include "lldb/API/SBCompileUnit.h" #include "lldb/API/SBFileSpec.h" +#include "lldb/API/SBFormat.h" #include "lldb/API/SBLineEntry.h" #include "lldb/API/SBType.h" #include "lldb/API/SBValue.h" @@ -267,13 +268,16 @@ CreateBreakpoint(BreakpointBase *bp, /// Converts a LLDB module to a VS Code DAP module for use in "modules" events. /// +/// \param[in] target +/// A LLDB target object to convert into a JSON value. +/// /// \param[in] module /// A LLDB module object to convert into a JSON value /// /// \return /// A "Module" JSON object with that follows the formal JSON /// definition outlined by Microsoft. -llvm::json::Value CreateModule(lldb::SBModule &module); +llvm::json::Value CreateModule(lldb::SBTarget &target, lldb::SBModule &module); /// Create a "Event" JSON object using \a event_name as the event name /// @@ -363,10 +367,15 @@ llvm::json::Value CreateSource(llvm::StringRef source_path); /// The LLDB stack frame to use when populating out the "StackFrame" /// object. /// +/// \param[in] format +/// The LLDB format to use when populating out the "StackFrame" +/// object. +/// /// \return /// A "StackFrame" JSON object with that follows the formal JSON /// definition outlined by Microsoft. -llvm::json::Value CreateStackFrame(lldb::SBFrame &frame); +llvm::json::Value CreateStackFrame(lldb::SBFrame &frame, + lldb::SBFormat &format); /// Create a "StackFrame" label object for a LLDB thread. /// @@ -382,10 +391,14 @@ llvm::json::Value CreateStackFrame(lldb::SBFrame &frame); /// The LLDB thread to use when populating out the "Thread" /// object. /// +/// \param[in] format +/// The configured formatter for the DAP session. +/// /// \return /// A "StackFrame" JSON object with that follows the formal JSON /// definition outlined by Microsoft. -llvm::json::Value CreateExtendedStackFrameLabel(lldb::SBThread &thread); +llvm::json::Value CreateExtendedStackFrameLabel(lldb::SBThread &thread, + lldb::SBFormat &format); /// Create a "Thread" object for a LLDB thread object. /// @@ -400,10 +413,14 @@ llvm::json::Value CreateExtendedStackFrameLabel(lldb::SBThread &thread); /// The LLDB thread to use when populating out the "Thread" /// object. /// +/// \param[in] format +/// The LLDB format to use when populating out the "Thread" +/// object. +/// /// \return /// A "Thread" JSON object with that follows the formal JSON /// definition outlined by Microsoft. -llvm::json::Value CreateThread(lldb::SBThread &thread); +llvm::json::Value CreateThread(lldb::SBThread &thread, lldb::SBFormat &format); /// Create a "StoppedEvent" object for a LLDB thread object. /// @@ -419,25 +436,32 @@ llvm::json::Value CreateThread(lldb::SBThread &thread); /// "allThreadsStopped" - set to True to indicate that all threads /// stop when any thread stops. /// +/// \param[in] dap +/// The DAP session associated with the stopped thread. +/// /// \param[in] thread /// The LLDB thread to use when populating out the "StoppedEvent" /// object. /// +/// \param[in] stop_id +/// The stop id for this event. +/// /// \return /// A "StoppedEvent" JSON object with that follows the formal JSON /// definition outlined by Microsoft. -llvm::json::Value CreateThreadStopped(lldb::SBThread &thread, uint32_t stop_id); +llvm::json::Value CreateThreadStopped(DAP &dap, lldb::SBThread &thread, + uint32_t stop_id); /// \return /// The variable name of \a value or a default placeholder. -const char *GetNonNullVariableName(lldb::SBValue value); +const char *GetNonNullVariableName(lldb::SBValue &value); /// VSCode can't display two variables with the same name, so we need to /// distinguish them by using a suffix. /// /// If the source and line information is present, we use it as the suffix. /// Otherwise, we fallback to the variable address or register location. -std::string CreateUniqueVariableNameForDisplay(lldb::SBValue v, +std::string CreateUniqueVariableNameForDisplay(lldb::SBValue &v, bool is_name_duplicated); /// Helper struct that parses the metadata of an \a lldb::SBValue and produces @@ -464,8 +488,8 @@ struct VariableDescription { /// The SBValue for this variable. lldb::SBValue v; - VariableDescription(lldb::SBValue v, bool format_hex = false, - bool is_name_duplicated = false, + VariableDescription(lldb::SBValue v, bool auto_variable_summaries, + bool format_hex = false, bool is_name_duplicated = false, std::optional<std::string> custom_name = {}); /// Create a JSON object that represents these extensions to the DAP variable @@ -514,9 +538,12 @@ std::pair<int64_t, bool> UnpackLocation(int64_t location_id); /// properties. /// /// \param[in] format_hex -/// It set to true the variable will be formatted as hex in +/// If set to true the variable will be formatted as hex in /// the "value" key value pair for the value of the variable. /// +/// \param[in] auto_variable_summaries +/// IF set to true the variable will create an automatic variable summary. +/// /// \param[in] is_name_duplicated /// Whether the same variable name appears multiple times within the same /// context (e.g. locals). This can happen due to shadowed variables in @@ -533,11 +560,12 @@ std::pair<int64_t, bool> UnpackLocation(int64_t location_id); /// A "Variable" JSON object with that follows the formal JSON /// definition outlined by Microsoft. llvm::json::Value CreateVariable(lldb::SBValue v, int64_t var_ref, - bool format_hex, + bool format_hex, bool auto_variable_summaries, + bool synthetic_child_debugging, bool is_name_duplicated = false, std::optional<std::string> custom_name = {}); -llvm::json::Value CreateCompileUnit(lldb::SBCompileUnit unit); +llvm::json::Value CreateCompileUnit(lldb::SBCompileUnit &unit); /// Create a runInTerminal reverse request object /// @@ -570,7 +598,7 @@ CreateRunInTerminalReverseRequest(const llvm::json::Object &launch_request, /// /// \return /// A body JSON object with debug info and breakpoint info -llvm::json::Object CreateTerminatedEventObject(); +llvm::json::Object CreateTerminatedEventObject(lldb::SBTarget &target); /// Convert a given JSON object to a string. std::string JSONToString(const llvm::json::Value &json); diff --git a/lldb/tools/lldb-dap/lldb-dap.cpp b/lldb/tools/lldb-dap/lldb-dap.cpp index 94184b78a697f1..c50e7abb32b47b 100644 --- a/lldb/tools/lldb-dap/lldb-dap.cpp +++ b/lldb/tools/lldb-dap/lldb-dap.cpp @@ -236,7 +236,7 @@ void SendTerminatedEvent() { llvm::call_once(g_dap.terminated_event_flag, [&] { g_dap.RunTerminateCommands(); // Send a "terminated" event - llvm::json::Object event(CreateTerminatedEventObject()); + llvm::json::Object event(CreateTerminatedEventObject(g_dap.target)); g_dap.SendJSON(llvm::json::Value(std::move(event))); }); } @@ -288,13 +288,13 @@ void SendThreadStoppedEvent() { if (num_threads_with_reason == 0) { lldb::SBThread thread = process.GetThreadAtIndex(0); g_dap.focus_tid = thread.GetThreadID(); - g_dap.SendJSON(CreateThreadStopped(thread, stop_id)); + g_dap.SendJSON(CreateThreadStopped(g_dap, thread, stop_id)); } else { for (uint32_t thread_idx = 0; thread_idx < num_threads; ++thread_idx) { lldb::SBThread thread = process.GetThreadAtIndex(thread_idx); g_dap.thread_ids.insert(thread.GetThreadID()); if (ThreadHasStopReason(thread)) { - g_dap.SendJSON(CreateThreadStopped(thread, stop_id)); + g_dap.SendJSON(CreateThreadStopped(g_dap, thread, stop_id)); } } } @@ -688,7 +688,8 @@ bool FillStackFrames(lldb::SBThread &thread, llvm::json::Array &stack_frames, for (int64_t i = start_frame; static_cast<int64_t>(stack_frames.size()) < levels; i++) { if (i == -1) { - stack_frames.emplace_back(CreateExtendedStackFrameLabel(thread)); + stack_frames.emplace_back( + CreateExtendedStackFrameLabel(thread, g_dap.frame_format)); continue; } @@ -699,7 +700,7 @@ bool FillStackFrames(lldb::SBThread &thread, llvm::json::Array &stack_frames, break; } - stack_frames.emplace_back(CreateStackFrame(frame)); + stack_frames.emplace_back(CreateStackFrame(frame, g_dap.frame_format)); } if (g_dap.display_extended_backtrace && reached_end_of_stack) { @@ -1656,7 +1657,7 @@ void request_evaluate(const llvm::json::Object &request) { else EmplaceSafeString(response, "message", "evaluate failed"); } else { - VariableDescription desc(value); + VariableDescription desc(value, g_dap.enable_auto_variable_summaries); EmplaceSafeString(body, "result", desc.GetResult(context)); EmplaceSafeString(body, "type", desc.display_type_name); int64_t var_ref = 0; @@ -1775,7 +1776,7 @@ void request_modules(const llvm::json::Object &request) { llvm::json::Array modules; for (size_t i = 0; i < g_dap.target.GetNumModules(); i++) { lldb::SBModule module = g_dap.target.GetModuleAtIndex(i); - modules.emplace_back(CreateModule(module)); + modules.emplace_back(CreateModule(g_dap.target, module)); } llvm::json::Object body; @@ -3678,7 +3679,7 @@ void request_threads(const llvm::json::Object &request) { llvm::json::Array threads; for (uint32_t thread_idx = 0; thread_idx < num_threads; ++thread_idx) { lldb::SBThread thread = process.GetThreadAtIndex(thread_idx); - threads.emplace_back(CreateThread(thread)); + threads.emplace_back(CreateThread(thread, g_dap.thread_format)); } if (threads.size() == 0) { response["success"] = llvm::json::Value(false); @@ -3819,7 +3820,7 @@ void request_setVariable(const llvm::json::Object &request) { lldb::SBError error; bool success = variable.SetValueFromCString(value.data(), error); if (success) { - VariableDescription desc(variable); + VariableDescription desc(variable, g_dap.enable_auto_variable_summaries); EmplaceSafeString(body, "result", desc.display_value); EmplaceSafeString(body, "type", desc.display_type_name); @@ -3927,13 +3928,13 @@ void request_variables(const llvm::json::Object &request) { llvm::json::Object response; FillResponse(request, response); llvm::json::Array variables; - auto arguments = request.getObject("arguments"); + const auto *arguments = request.getObject("arguments"); const auto variablesReference = GetUnsigned(arguments, "variablesReference", 0); const int64_t start = GetSigned(arguments, "start", 0); const int64_t count = GetSigned(arguments, "count", 0); bool hex = false; - auto format = arguments->getObject("format"); + const auto *format = arguments->getObject("format"); if (format) hex = GetBoolean(format, "hex", false); @@ -4009,7 +4010,8 @@ void request_variables(const llvm::json::Object &request) { int64_t var_ref = g_dap.variables.InsertVariable(variable, /*is_permanent=*/false); variables.emplace_back(CreateVariable( - variable, var_ref, hex, + variable, var_ref, hex, g_dap.enable_auto_variable_summaries, + g_dap.enable_synthetic_child_debugging, variable_name_counts[GetNonNullVariableName(variable)] > 1)); } } else { @@ -4025,7 +4027,9 @@ void request_variables(const llvm::json::Object &request) { g_dap.variables.IsPermanentVariableReference(variablesReference); int64_t var_ref = g_dap.variables.InsertVariable(child, is_permanent); variables.emplace_back(CreateVariable( - child, var_ref, hex, /*is_name_duplicated=*/false, custom_name)); + child, var_ref, hex, g_dap.enable_auto_variable_summaries, + g_dap.enable_synthetic_child_debugging, + /*is_name_duplicated=*/false, custom_name)); }; const int64_t num_children = variable.GetNumChildren(); int64_t end_idx = start + ((count == 0) ? num_children : count); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits