https://github.com/kastiglione updated https://github.com/llvm/llvm-project/pull/153233
>From 88b491d4a1a13e1f64efdf8e1bb71c3b58c4b0b5 Mon Sep 17 00:00:00 2001 From: Dave Lee <davelee....@gmail.com> Date: Tue, 12 Aug 2025 10:45:04 -0700 Subject: [PATCH 01/10] [lldb] Show setting default in new verbose mode --- lldb/include/lldb/Interpreter/OptionValue.h | 10 ++++ .../lldb/Interpreter/OptionValueEnumeration.h | 1 + lldb/include/lldb/Utility/ArchSpec.h | 1 + .../source/Commands/CommandObjectSettings.cpp | 47 +++++++++++++++++-- lldb/source/Commands/Options.td | 5 ++ lldb/source/Interpreter/OptionValueArch.cpp | 7 +++ .../source/Interpreter/OptionValueBoolean.cpp | 6 +++ lldb/source/Interpreter/OptionValueChar.cpp | 18 +++++-- .../Interpreter/OptionValueEnumeration.cpp | 24 +++++++--- .../Interpreter/OptionValueFileSpec.cpp | 8 +++- lldb/source/Interpreter/OptionValueFormat.cpp | 6 +++ .../Interpreter/OptionValueFormatEntity.cpp | 21 +++++---- .../Interpreter/OptionValueLanguage.cpp | 9 +++- lldb/source/Interpreter/OptionValueRegex.cpp | 7 +++ lldb/source/Interpreter/OptionValueSInt64.cpp | 6 +++ lldb/source/Interpreter/OptionValueString.cpp | 40 ++++++++++------ lldb/source/Interpreter/OptionValueUInt64.cpp | 6 +++ lldb/source/Utility/ArchSpec.cpp | 4 ++ 18 files changed, 183 insertions(+), 43 deletions(-) diff --git a/lldb/include/lldb/Interpreter/OptionValue.h b/lldb/include/lldb/Interpreter/OptionValue.h index f293a3a33bfa0..cbf117f2f8326 100644 --- a/lldb/include/lldb/Interpreter/OptionValue.h +++ b/lldb/include/lldb/Interpreter/OptionValue.h @@ -17,6 +17,7 @@ #include "lldb/Utility/FileSpec.h" #include "lldb/Utility/FileSpecList.h" #include "lldb/Utility/Status.h" +#include "lldb/Utility/Stream.h" #include "lldb/Utility/StringList.h" #include "lldb/Utility/UUID.h" #include "lldb/lldb-defines.h" @@ -61,6 +62,7 @@ class OptionValue { eDumpOptionDescription = (1u << 3), eDumpOptionRaw = (1u << 4), eDumpOptionCommand = (1u << 5), + eDumpOptionDefaultValue = (1u << 6), eDumpGroupValue = (eDumpOptionName | eDumpOptionType | eDumpOptionValue), eDumpGroupHelp = (eDumpOptionName | eDumpOptionType | eDumpOptionDescription), @@ -338,6 +340,14 @@ class OptionValue { // DeepCopy to it. Inherit from Cloneable to avoid doing this manually. virtual lldb::OptionValueSP Clone() const = 0; + struct DefaultValueFormat { + DefaultValueFormat(Stream &stream) : stream(stream) { + stream.PutCString(" (default: "); + } + ~DefaultValueFormat() { stream.PutChar(')'); } + Stream &stream; + }; + lldb::OptionValueWP m_parent_wp; std::function<void()> m_callback; bool m_value_was_set = false; // This can be used to see if a value has been diff --git a/lldb/include/lldb/Interpreter/OptionValueEnumeration.h b/lldb/include/lldb/Interpreter/OptionValueEnumeration.h index a3a13ca7b15eb..91ab454b2065e 100644 --- a/lldb/include/lldb/Interpreter/OptionValueEnumeration.h +++ b/lldb/include/lldb/Interpreter/OptionValueEnumeration.h @@ -72,6 +72,7 @@ class OptionValueEnumeration protected: void SetEnumerations(const OptionEnumValues &enumerators); + void DumpEnum(Stream &strm, enum_type value); enum_type m_current_value; enum_type m_default_value; diff --git a/lldb/include/lldb/Utility/ArchSpec.h b/lldb/include/lldb/Utility/ArchSpec.h index 7e9bc23a75acb..96bd5e3597b68 100644 --- a/lldb/include/lldb/Utility/ArchSpec.h +++ b/lldb/include/lldb/Utility/ArchSpec.h @@ -564,6 +564,7 @@ class ArchSpec { /// \return true if \a lhs is less than \a rhs bool operator<(const ArchSpec &lhs, const ArchSpec &rhs); bool operator==(const ArchSpec &lhs, const ArchSpec &rhs); +bool operator!=(const ArchSpec &lhs, const ArchSpec &rhs); bool ParseMachCPUDashSubtypeTriple(llvm::StringRef triple_str, ArchSpec &arch); diff --git a/lldb/source/Commands/CommandObjectSettings.cpp b/lldb/source/Commands/CommandObjectSettings.cpp index 7bbb0dd567ab1..e638df75b8c9a 100644 --- a/lldb/source/Commands/CommandObjectSettings.cpp +++ b/lldb/source/Commands/CommandObjectSettings.cpp @@ -237,28 +237,62 @@ insert-before or insert-after."); }; // CommandObjectSettingsShow -- Show current values +#define LLDB_OPTIONS_settings_show +#include "CommandOptions.inc" class CommandObjectSettingsShow : public CommandObjectParsed { public: CommandObjectSettingsShow(CommandInterpreter &interpreter) : CommandObjectParsed(interpreter, "settings show", "Show matching debugger settings and their current " - "values. Defaults to showing all settings.", - nullptr) { + "values. Defaults to showing all settings.") { AddSimpleArgumentList(eArgTypeSettingVariableName, eArgRepeatOptional); } ~CommandObjectSettingsShow() override = default; + Options *GetOptions() override { return &m_options; } + + class CommandOptions : public Options { + public: + ~CommandOptions() override = default; + + Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, + ExecutionContext *execution_context) override { + const int short_option = m_getopt_table[option_idx].val; + switch (short_option) { + case 'v': + m_verbose = true; + break; + default: + llvm_unreachable("Unimplemented option"); + } + return {}; + } + + void OptionParsingStarting(ExecutionContext *execution_context) override { + m_verbose = false; + } + + llvm::ArrayRef<OptionDefinition> GetDefinitions() override { + return g_settings_show_options; + } + + bool m_verbose = false; + }; + protected: void DoExecute(Args &args, CommandReturnObject &result) override { result.SetStatus(eReturnStatusSuccessFinishResult); + uint32_t dump_mask = OptionValue::eDumpGroupValue; + if (m_options.m_verbose) + dump_mask |= OptionValue::eDumpOptionDefaultValue; + if (!args.empty()) { for (const auto &arg : args) { Status error(GetDebugger().DumpPropertyValue( - &m_exe_ctx, result.GetOutputStream(), arg.ref(), - OptionValue::eDumpGroupValue)); + &m_exe_ctx, result.GetOutputStream(), arg.ref(), dump_mask)); if (error.Success()) { result.GetOutputStream().EOL(); } else { @@ -267,9 +301,12 @@ class CommandObjectSettingsShow : public CommandObjectParsed { } } else { GetDebugger().DumpAllPropertyValues(&m_exe_ctx, result.GetOutputStream(), - OptionValue::eDumpGroupValue); + dump_mask); } } + +private: + CommandOptions m_options; }; // CommandObjectSettingsWrite -- Write settings to file diff --git a/lldb/source/Commands/Options.td b/lldb/source/Commands/Options.td index 61acc40585976..596f959b76d4a 100644 --- a/lldb/source/Commands/Options.td +++ b/lldb/source/Commands/Options.td @@ -56,6 +56,11 @@ let Command = "settings clear" in { Desc<"Clear all settings.">; } +let Command = "settings show" in { + def setshow_verbose : Option<"verbose", "v">, + Desc<"Enable verbose output.">; +} + let Command = "breakpoint list" in { // FIXME: We need to add an "internal" command, and then add this sort of // thing to it. But I need to see it for now, and don't want to wait. diff --git a/lldb/source/Interpreter/OptionValueArch.cpp b/lldb/source/Interpreter/OptionValueArch.cpp index ea15ccaaefe2b..62c53ee05f0ce 100644 --- a/lldb/source/Interpreter/OptionValueArch.cpp +++ b/lldb/source/Interpreter/OptionValueArch.cpp @@ -11,6 +11,7 @@ #include "lldb/DataFormatters/FormatManager.h" #include "lldb/Interpreter/CommandCompletions.h" #include "lldb/Interpreter/CommandInterpreter.h" +#include "lldb/Interpreter/OptionValue.h" #include "lldb/Utility/Args.h" #include "lldb/Utility/State.h" @@ -30,6 +31,12 @@ void OptionValueArch::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, if (arch_name) strm.PutCString(arch_name); } + + if (dump_mask & eDumpOptionDefaultValue && + m_current_value != m_default_value && m_default_value.IsValid()) { + DefaultValueFormat label{strm}; + strm.PutCString(m_default_value.GetArchitectureName()); + } } } diff --git a/lldb/source/Interpreter/OptionValueBoolean.cpp b/lldb/source/Interpreter/OptionValueBoolean.cpp index d4fda762fea6b..1617e151f6bb2 100644 --- a/lldb/source/Interpreter/OptionValueBoolean.cpp +++ b/lldb/source/Interpreter/OptionValueBoolean.cpp @@ -10,6 +10,7 @@ #include "lldb/Host/PosixApi.h" #include "lldb/Interpreter/OptionArgParser.h" +#include "lldb/Interpreter/OptionValue.h" #include "lldb/Utility/Stream.h" #include "lldb/Utility/StringList.h" #include "llvm/ADT/STLExtras.h" @@ -27,6 +28,11 @@ void OptionValueBoolean::DumpValue(const ExecutionContext *exe_ctx, if (dump_mask & eDumpOptionType) strm.PutCString(" = "); strm.PutCString(m_current_value ? "true" : "false"); + if (dump_mask & eDumpOptionDefaultValue && + m_current_value != m_default_value) { + DefaultValueFormat label{strm}; + strm.PutCString(m_default_value ? "true" : "false"); + } } } diff --git a/lldb/source/Interpreter/OptionValueChar.cpp b/lldb/source/Interpreter/OptionValueChar.cpp index 2aadcff158388..4efef2532bbb1 100644 --- a/lldb/source/Interpreter/OptionValueChar.cpp +++ b/lldb/source/Interpreter/OptionValueChar.cpp @@ -9,6 +9,7 @@ #include "lldb/Interpreter/OptionValueChar.h" #include "lldb/Interpreter/OptionArgParser.h" +#include "lldb/Interpreter/OptionValue.h" #include "lldb/Utility/Stream.h" #include "lldb/Utility/StringList.h" #include "llvm/ADT/STLExtras.h" @@ -16,6 +17,13 @@ using namespace lldb; using namespace lldb_private; +static void DumpChar(Stream &strm, char value) { + if (value != '\0') + strm.PutChar(value); + else + strm.PutCString("(null)"); +} + void OptionValueChar::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask) { if (dump_mask & eDumpOptionType) @@ -24,10 +32,12 @@ void OptionValueChar::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, if (dump_mask & eDumpOptionValue) { if (dump_mask & eDumpOptionType) strm.PutCString(" = "); - if (m_current_value != '\0') - strm.PutChar(m_current_value); - else - strm.PutCString("(null)"); + DumpChar(strm, m_current_value); + if (dump_mask & eDumpOptionDefaultValue && + m_current_value != m_default_value) { + DefaultValueFormat label{strm}; + DumpChar(strm, m_default_value); + } } } diff --git a/lldb/source/Interpreter/OptionValueEnumeration.cpp b/lldb/source/Interpreter/OptionValueEnumeration.cpp index cf646233c80da..671ceb79fab67 100644 --- a/lldb/source/Interpreter/OptionValueEnumeration.cpp +++ b/lldb/source/Interpreter/OptionValueEnumeration.cpp @@ -8,6 +8,7 @@ #include "lldb/Interpreter/OptionValueEnumeration.h" +#include "lldb/Interpreter/OptionValue.h" #include "lldb/Utility/StringList.h" using namespace lldb; @@ -19,6 +20,17 @@ OptionValueEnumeration::OptionValueEnumeration( SetEnumerations(enumerators); } +void OptionValueEnumeration::DumpEnum(Stream &strm, enum_type value) { + const size_t count = m_enumerations.GetSize(); + for (size_t i = 0; i < count; ++i) + if (m_enumerations.GetValueAtIndexUnchecked(i).value == value) { + strm.PutCString(m_enumerations.GetCStringAtIndex(i)); + return; + } + + strm.Printf("%" PRIu64, (uint64_t)value); +} + void OptionValueEnumeration::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask) { if (dump_mask & eDumpOptionType) @@ -26,14 +38,12 @@ void OptionValueEnumeration::DumpValue(const ExecutionContext *exe_ctx, if (dump_mask & eDumpOptionValue) { if (dump_mask & eDumpOptionType) strm.PutCString(" = "); - const size_t count = m_enumerations.GetSize(); - for (size_t i = 0; i < count; ++i) { - if (m_enumerations.GetValueAtIndexUnchecked(i).value == m_current_value) { - strm.PutCString(m_enumerations.GetCStringAtIndex(i).GetStringRef()); - return; - } + DumpEnum(strm, m_current_value); + if (dump_mask & eDumpOptionDefaultValue && + m_current_value != m_default_value) { + DefaultValueFormat label{strm}; + DumpEnum(strm, m_default_value); } - strm.Printf("%" PRIu64, (uint64_t)m_current_value); } } diff --git a/lldb/source/Interpreter/OptionValueFileSpec.cpp b/lldb/source/Interpreter/OptionValueFileSpec.cpp index 6fa6af4ace02a..0f186bdb6ebfa 100644 --- a/lldb/source/Interpreter/OptionValueFileSpec.cpp +++ b/lldb/source/Interpreter/OptionValueFileSpec.cpp @@ -12,6 +12,7 @@ #include "lldb/Host/FileSystem.h" #include "lldb/Interpreter/CommandCompletions.h" #include "lldb/Interpreter/CommandInterpreter.h" +#include "lldb/Interpreter/OptionValue.h" #include "lldb/Utility/Args.h" #include "lldb/Utility/State.h" @@ -41,7 +42,12 @@ void OptionValueFileSpec::DumpValue(const ExecutionContext *exe_ctx, strm.PutCString(" = "); if (m_current_value) { - strm << '"' << m_current_value.GetPath().c_str() << '"'; + strm.QuotedCString(m_current_value.GetPath().data()); + } + if (dump_mask & eDumpOptionDefaultValue && + m_current_value != m_default_value && m_default_value) { + DefaultValueFormat label{strm}; + strm.QuotedCString(m_default_value.GetPath().data()); } } } diff --git a/lldb/source/Interpreter/OptionValueFormat.cpp b/lldb/source/Interpreter/OptionValueFormat.cpp index bc4e77923d10e..f642595a56d97 100644 --- a/lldb/source/Interpreter/OptionValueFormat.cpp +++ b/lldb/source/Interpreter/OptionValueFormat.cpp @@ -10,6 +10,7 @@ #include "lldb/DataFormatters/FormatManager.h" #include "lldb/Interpreter/OptionArgParser.h" +#include "lldb/Interpreter/OptionValue.h" #include "lldb/Utility/Stream.h" using namespace lldb; @@ -23,6 +24,11 @@ void OptionValueFormat::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, if (dump_mask & eDumpOptionType) strm.PutCString(" = "); strm.PutCString(FormatManager::GetFormatAsCString(m_current_value)); + if (dump_mask & eDumpOptionDefaultValue && + m_current_value != m_default_value) { + DefaultValueFormat label{strm}; + strm.PutCString(FormatManager::GetFormatAsCString(m_default_value)); + } } } diff --git a/lldb/source/Interpreter/OptionValueFormatEntity.cpp b/lldb/source/Interpreter/OptionValueFormatEntity.cpp index d8b830115005c..96529fd13c3b0 100644 --- a/lldb/source/Interpreter/OptionValueFormatEntity.cpp +++ b/lldb/source/Interpreter/OptionValueFormatEntity.cpp @@ -10,6 +10,7 @@ #include "lldb/Core/Module.h" #include "lldb/Interpreter/CommandInterpreter.h" +#include "lldb/Interpreter/OptionValue.h" #include "lldb/Utility/Stream.h" #include "lldb/Utility/StringList.h" using namespace lldb; @@ -33,10 +34,8 @@ void OptionValueFormatEntity::Clear() { m_value_was_set = false; } -static void EscapeBackticks(llvm::StringRef str, std::string &dst) { - dst.clear(); - dst.reserve(str.size()); - +static std::string EscapeBackticks(llvm::StringRef str) { + std::string dst; for (size_t i = 0, e = str.size(); i != e; ++i) { char c = str[i]; if (c == '`') { @@ -45,6 +44,7 @@ static void EscapeBackticks(llvm::StringRef str, std::string &dst) { } dst += c; } + return dst; } void OptionValueFormatEntity::DumpValue(const ExecutionContext *exe_ctx, @@ -54,17 +54,18 @@ void OptionValueFormatEntity::DumpValue(const ExecutionContext *exe_ctx, if (dump_mask & eDumpOptionValue) { if (dump_mask & eDumpOptionType) strm.PutCString(" = "); - std::string escaped; - EscapeBackticks(m_current_format, escaped); - strm << '"' << escaped << '"'; + strm.QuotedCString(EscapeBackticks(m_current_format).data()); + if (dump_mask & eDumpOptionDefaultValue && + m_current_format != m_default_format) { + DefaultValueFormat label{strm}; + strm.QuotedCString(EscapeBackticks(m_default_format).data()); + } } } llvm::json::Value OptionValueFormatEntity::ToJSON(const ExecutionContext *exe_ctx) const { - std::string escaped; - EscapeBackticks(m_current_format, escaped); - return escaped; + return EscapeBackticks(m_current_format); } Status OptionValueFormatEntity::SetValueFromString(llvm::StringRef value_str, diff --git a/lldb/source/Interpreter/OptionValueLanguage.cpp b/lldb/source/Interpreter/OptionValueLanguage.cpp index 0fdaacb02594e..55023704ba887 100644 --- a/lldb/source/Interpreter/OptionValueLanguage.cpp +++ b/lldb/source/Interpreter/OptionValueLanguage.cpp @@ -9,8 +9,9 @@ #include "lldb/Interpreter/OptionValueLanguage.h" #include "lldb/DataFormatters/FormatManager.h" -#include "lldb/Target/Language.h" +#include "lldb/Interpreter/OptionValue.h" #include "lldb/Symbol/TypeSystem.h" +#include "lldb/Target/Language.h" #include "lldb/Utility/Args.h" #include "lldb/Utility/Stream.h" @@ -26,6 +27,12 @@ void OptionValueLanguage::DumpValue(const ExecutionContext *exe_ctx, strm.PutCString(" = "); if (m_current_value != eLanguageTypeUnknown) strm.PutCString(Language::GetNameForLanguageType(m_current_value)); + if (dump_mask & eDumpOptionDefaultValue && + m_current_value != m_default_value && + m_default_value != eLanguageTypeUnknown) { + DefaultValueFormat label{strm}; + strm.PutCString(Language::GetNameForLanguageType(m_default_value)); + } } } diff --git a/lldb/source/Interpreter/OptionValueRegex.cpp b/lldb/source/Interpreter/OptionValueRegex.cpp index 91ec41df6ee50..8d2e02c26177b 100644 --- a/lldb/source/Interpreter/OptionValueRegex.cpp +++ b/lldb/source/Interpreter/OptionValueRegex.cpp @@ -8,6 +8,7 @@ #include "lldb/Interpreter/OptionValueRegex.h" +#include "lldb/Interpreter/OptionValue.h" #include "lldb/Utility/Stream.h" using namespace lldb; @@ -24,6 +25,12 @@ void OptionValueRegex::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, llvm::StringRef regex_text = m_regex.GetText(); strm.Printf("%s", regex_text.str().c_str()); } + if (dump_mask & eDumpOptionDefaultValue && + m_regex.GetText() != m_default_regex_str && + !m_default_regex_str.empty()) { + DefaultValueFormat label{strm}; + strm.PutCString(m_default_regex_str); + } } } diff --git a/lldb/source/Interpreter/OptionValueSInt64.cpp b/lldb/source/Interpreter/OptionValueSInt64.cpp index df7aee99e212c..ec5a6d200ede0 100644 --- a/lldb/source/Interpreter/OptionValueSInt64.cpp +++ b/lldb/source/Interpreter/OptionValueSInt64.cpp @@ -8,6 +8,7 @@ #include "lldb/Interpreter/OptionValueSInt64.h" +#include "lldb/Interpreter/OptionValue.h" #include "lldb/Utility/Stream.h" using namespace lldb; @@ -26,6 +27,11 @@ void OptionValueSInt64::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, if (dump_mask & eDumpOptionType) strm.PutCString(" = "); strm.Printf("%" PRIi64, m_current_value); + if (dump_mask & eDumpOptionDefaultValue && + m_current_value != m_default_value) { + DefaultValueFormat label{strm}; + strm.Printf("%" PRIi64, m_default_value); + } } } diff --git a/lldb/source/Interpreter/OptionValueString.cpp b/lldb/source/Interpreter/OptionValueString.cpp index ae30661a56d05..62ca6f9890026 100644 --- a/lldb/source/Interpreter/OptionValueString.cpp +++ b/lldb/source/Interpreter/OptionValueString.cpp @@ -9,12 +9,28 @@ #include "lldb/Interpreter/OptionValueString.h" #include "lldb/Host/OptionParser.h" +#include "lldb/Interpreter/OptionValue.h" #include "lldb/Utility/Args.h" #include "lldb/Utility/Stream.h" using namespace lldb; using namespace lldb_private; +static void DumpValue(Stream &strm, const std::string &str, bool escape, + bool raw) { + if (escape) { + std::string escaped_str; + Args::ExpandEscapedCharacters(str.data(), escaped_str); + ::DumpValue(strm, escaped_str, false, raw); + return; + } + + if (raw) + strm.PutCString(str); + else + strm.QuotedCString(str.data()); +} + void OptionValueString::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, uint32_t dump_mask) { if (dump_mask & eDumpOptionType) @@ -22,21 +38,15 @@ void OptionValueString::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, if (dump_mask & eDumpOptionValue) { if (dump_mask & eDumpOptionType) strm.PutCString(" = "); - if (!m_current_value.empty() || m_value_was_set) { - if (m_options.Test(eOptionEncodeCharacterEscapeSequences)) { - std::string expanded_escape_value; - Args::ExpandEscapedCharacters(m_current_value.c_str(), - expanded_escape_value); - if (dump_mask & eDumpOptionRaw) - strm.Printf("%s", expanded_escape_value.c_str()); - else - strm.Printf("\"%s\"", expanded_escape_value.c_str()); - } else { - if (dump_mask & eDumpOptionRaw) - strm.Printf("%s", m_current_value.c_str()); - else - strm.Printf("\"%s\"", m_current_value.c_str()); - } + const bool escape = m_options.Test(eOptionEncodeCharacterEscapeSequences); + const bool raw = dump_mask & eDumpOptionRaw; + if (!m_current_value.empty() || m_value_was_set) + ::DumpValue(strm, m_current_value, escape, raw); + + if (dump_mask & eDumpOptionDefaultValue && + m_current_value != m_default_value && !m_default_value.empty()) { + DefaultValueFormat label{strm}; + ::DumpValue(strm, m_default_value, escape, raw); } } } diff --git a/lldb/source/Interpreter/OptionValueUInt64.cpp b/lldb/source/Interpreter/OptionValueUInt64.cpp index aa5e9a21c8c28..3b633425fb9be 100644 --- a/lldb/source/Interpreter/OptionValueUInt64.cpp +++ b/lldb/source/Interpreter/OptionValueUInt64.cpp @@ -8,6 +8,7 @@ #include "lldb/Interpreter/OptionValueUInt64.h" +#include "lldb/Interpreter/OptionValue.h" #include "lldb/Utility/Stream.h" using namespace lldb; @@ -30,6 +31,11 @@ void OptionValueUInt64::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, if (dump_mask & eDumpOptionType) strm.PutCString(" = "); strm.Printf("%" PRIu64, m_current_value); + if (dump_mask & eDumpOptionDefaultValue && + m_current_value != m_default_value) { + DefaultValueFormat label{strm}; + strm.Printf("%" PRIu64, m_default_value); + } } } diff --git a/lldb/source/Utility/ArchSpec.cpp b/lldb/source/Utility/ArchSpec.cpp index 7c71aaae6bcf2..8f14cf6e39438 100644 --- a/lldb/source/Utility/ArchSpec.cpp +++ b/lldb/source/Utility/ArchSpec.cpp @@ -1439,6 +1439,10 @@ bool lldb_private::operator==(const ArchSpec &lhs, const ArchSpec &rhs) { return lhs.GetCore() == rhs.GetCore(); } +bool lldb_private::operator!=(const ArchSpec &lhs, const ArchSpec &rhs) { + return !(lhs == rhs); +} + bool ArchSpec::IsFullySpecifiedTriple() const { if (!TripleOSWasSpecified()) return false; >From 6b5b7d5879b5f3a4e0a6043c9236275115a803dd Mon Sep 17 00:00:00 2001 From: Dave Lee <davelee....@gmail.com> Date: Tue, 12 Aug 2025 12:34:13 -0700 Subject: [PATCH 02/10] paren init --- lldb/source/Interpreter/OptionValueArch.cpp | 2 +- lldb/source/Interpreter/OptionValueBoolean.cpp | 2 +- lldb/source/Interpreter/OptionValueChar.cpp | 2 +- lldb/source/Interpreter/OptionValueEnumeration.cpp | 2 +- lldb/source/Interpreter/OptionValueFileSpec.cpp | 2 +- lldb/source/Interpreter/OptionValueFormat.cpp | 2 +- lldb/source/Interpreter/OptionValueFormatEntity.cpp | 2 +- lldb/source/Interpreter/OptionValueLanguage.cpp | 2 +- lldb/source/Interpreter/OptionValueRegex.cpp | 2 +- lldb/source/Interpreter/OptionValueSInt64.cpp | 2 +- lldb/source/Interpreter/OptionValueString.cpp | 2 +- lldb/source/Interpreter/OptionValueUInt64.cpp | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/lldb/source/Interpreter/OptionValueArch.cpp b/lldb/source/Interpreter/OptionValueArch.cpp index 62c53ee05f0ce..a960e39d35a62 100644 --- a/lldb/source/Interpreter/OptionValueArch.cpp +++ b/lldb/source/Interpreter/OptionValueArch.cpp @@ -34,7 +34,7 @@ void OptionValueArch::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, if (dump_mask & eDumpOptionDefaultValue && m_current_value != m_default_value && m_default_value.IsValid()) { - DefaultValueFormat label{strm}; + DefaultValueFormat label(strm); strm.PutCString(m_default_value.GetArchitectureName()); } } diff --git a/lldb/source/Interpreter/OptionValueBoolean.cpp b/lldb/source/Interpreter/OptionValueBoolean.cpp index 1617e151f6bb2..023c243b3efc1 100644 --- a/lldb/source/Interpreter/OptionValueBoolean.cpp +++ b/lldb/source/Interpreter/OptionValueBoolean.cpp @@ -30,7 +30,7 @@ void OptionValueBoolean::DumpValue(const ExecutionContext *exe_ctx, strm.PutCString(m_current_value ? "true" : "false"); if (dump_mask & eDumpOptionDefaultValue && m_current_value != m_default_value) { - DefaultValueFormat label{strm}; + DefaultValueFormat label(strm); strm.PutCString(m_default_value ? "true" : "false"); } } diff --git a/lldb/source/Interpreter/OptionValueChar.cpp b/lldb/source/Interpreter/OptionValueChar.cpp index 4efef2532bbb1..595dcba49b61a 100644 --- a/lldb/source/Interpreter/OptionValueChar.cpp +++ b/lldb/source/Interpreter/OptionValueChar.cpp @@ -35,7 +35,7 @@ void OptionValueChar::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, DumpChar(strm, m_current_value); if (dump_mask & eDumpOptionDefaultValue && m_current_value != m_default_value) { - DefaultValueFormat label{strm}; + DefaultValueFormat label(strm); DumpChar(strm, m_default_value); } } diff --git a/lldb/source/Interpreter/OptionValueEnumeration.cpp b/lldb/source/Interpreter/OptionValueEnumeration.cpp index 671ceb79fab67..eb31bde498b7c 100644 --- a/lldb/source/Interpreter/OptionValueEnumeration.cpp +++ b/lldb/source/Interpreter/OptionValueEnumeration.cpp @@ -41,7 +41,7 @@ void OptionValueEnumeration::DumpValue(const ExecutionContext *exe_ctx, DumpEnum(strm, m_current_value); if (dump_mask & eDumpOptionDefaultValue && m_current_value != m_default_value) { - DefaultValueFormat label{strm}; + DefaultValueFormat label(strm); DumpEnum(strm, m_default_value); } } diff --git a/lldb/source/Interpreter/OptionValueFileSpec.cpp b/lldb/source/Interpreter/OptionValueFileSpec.cpp index 0f186bdb6ebfa..89cc7226f69ca 100644 --- a/lldb/source/Interpreter/OptionValueFileSpec.cpp +++ b/lldb/source/Interpreter/OptionValueFileSpec.cpp @@ -46,7 +46,7 @@ void OptionValueFileSpec::DumpValue(const ExecutionContext *exe_ctx, } if (dump_mask & eDumpOptionDefaultValue && m_current_value != m_default_value && m_default_value) { - DefaultValueFormat label{strm}; + DefaultValueFormat label(strm); strm.QuotedCString(m_default_value.GetPath().data()); } } diff --git a/lldb/source/Interpreter/OptionValueFormat.cpp b/lldb/source/Interpreter/OptionValueFormat.cpp index f642595a56d97..05990fb50c356 100644 --- a/lldb/source/Interpreter/OptionValueFormat.cpp +++ b/lldb/source/Interpreter/OptionValueFormat.cpp @@ -26,7 +26,7 @@ void OptionValueFormat::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, strm.PutCString(FormatManager::GetFormatAsCString(m_current_value)); if (dump_mask & eDumpOptionDefaultValue && m_current_value != m_default_value) { - DefaultValueFormat label{strm}; + DefaultValueFormat label(strm); strm.PutCString(FormatManager::GetFormatAsCString(m_default_value)); } } diff --git a/lldb/source/Interpreter/OptionValueFormatEntity.cpp b/lldb/source/Interpreter/OptionValueFormatEntity.cpp index 96529fd13c3b0..78afa14a66dd7 100644 --- a/lldb/source/Interpreter/OptionValueFormatEntity.cpp +++ b/lldb/source/Interpreter/OptionValueFormatEntity.cpp @@ -57,7 +57,7 @@ void OptionValueFormatEntity::DumpValue(const ExecutionContext *exe_ctx, strm.QuotedCString(EscapeBackticks(m_current_format).data()); if (dump_mask & eDumpOptionDefaultValue && m_current_format != m_default_format) { - DefaultValueFormat label{strm}; + DefaultValueFormat label(strm); strm.QuotedCString(EscapeBackticks(m_default_format).data()); } } diff --git a/lldb/source/Interpreter/OptionValueLanguage.cpp b/lldb/source/Interpreter/OptionValueLanguage.cpp index 55023704ba887..bb28dc8debe6d 100644 --- a/lldb/source/Interpreter/OptionValueLanguage.cpp +++ b/lldb/source/Interpreter/OptionValueLanguage.cpp @@ -30,7 +30,7 @@ void OptionValueLanguage::DumpValue(const ExecutionContext *exe_ctx, if (dump_mask & eDumpOptionDefaultValue && m_current_value != m_default_value && m_default_value != eLanguageTypeUnknown) { - DefaultValueFormat label{strm}; + DefaultValueFormat label(strm); strm.PutCString(Language::GetNameForLanguageType(m_default_value)); } } diff --git a/lldb/source/Interpreter/OptionValueRegex.cpp b/lldb/source/Interpreter/OptionValueRegex.cpp index 8d2e02c26177b..30e307a7240ef 100644 --- a/lldb/source/Interpreter/OptionValueRegex.cpp +++ b/lldb/source/Interpreter/OptionValueRegex.cpp @@ -28,7 +28,7 @@ void OptionValueRegex::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, if (dump_mask & eDumpOptionDefaultValue && m_regex.GetText() != m_default_regex_str && !m_default_regex_str.empty()) { - DefaultValueFormat label{strm}; + DefaultValueFormat label(strm); strm.PutCString(m_default_regex_str); } } diff --git a/lldb/source/Interpreter/OptionValueSInt64.cpp b/lldb/source/Interpreter/OptionValueSInt64.cpp index ec5a6d200ede0..00f1cc37dddac 100644 --- a/lldb/source/Interpreter/OptionValueSInt64.cpp +++ b/lldb/source/Interpreter/OptionValueSInt64.cpp @@ -29,7 +29,7 @@ void OptionValueSInt64::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, strm.Printf("%" PRIi64, m_current_value); if (dump_mask & eDumpOptionDefaultValue && m_current_value != m_default_value) { - DefaultValueFormat label{strm}; + DefaultValueFormat label(strm); strm.Printf("%" PRIi64, m_default_value); } } diff --git a/lldb/source/Interpreter/OptionValueString.cpp b/lldb/source/Interpreter/OptionValueString.cpp index 62ca6f9890026..97b3e43e703eb 100644 --- a/lldb/source/Interpreter/OptionValueString.cpp +++ b/lldb/source/Interpreter/OptionValueString.cpp @@ -45,7 +45,7 @@ void OptionValueString::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, if (dump_mask & eDumpOptionDefaultValue && m_current_value != m_default_value && !m_default_value.empty()) { - DefaultValueFormat label{strm}; + DefaultValueFormat label(strm); ::DumpValue(strm, m_default_value, escape, raw); } } diff --git a/lldb/source/Interpreter/OptionValueUInt64.cpp b/lldb/source/Interpreter/OptionValueUInt64.cpp index 3b633425fb9be..63f83cbcd60a3 100644 --- a/lldb/source/Interpreter/OptionValueUInt64.cpp +++ b/lldb/source/Interpreter/OptionValueUInt64.cpp @@ -33,7 +33,7 @@ void OptionValueUInt64::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, strm.Printf("%" PRIu64, m_current_value); if (dump_mask & eDumpOptionDefaultValue && m_current_value != m_default_value) { - DefaultValueFormat label{strm}; + DefaultValueFormat label(strm); strm.Printf("%" PRIu64, m_default_value); } } >From d87c7fb758011ac0f7e75b159bfd38585597e081 Mon Sep 17 00:00:00 2001 From: Dave Lee <davelee....@gmail.com> Date: Tue, 12 Aug 2025 12:38:12 -0700 Subject: [PATCH 03/10] restore unintentionally deleted line --- lldb/source/Interpreter/OptionValueFormatEntity.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/lldb/source/Interpreter/OptionValueFormatEntity.cpp b/lldb/source/Interpreter/OptionValueFormatEntity.cpp index 78afa14a66dd7..bae1b5c77835b 100644 --- a/lldb/source/Interpreter/OptionValueFormatEntity.cpp +++ b/lldb/source/Interpreter/OptionValueFormatEntity.cpp @@ -36,6 +36,7 @@ void OptionValueFormatEntity::Clear() { static std::string EscapeBackticks(llvm::StringRef str) { std::string dst; + dst.reserve(str.size()); for (size_t i = 0, e = str.size(); i != e; ++i) { char c = str[i]; if (c == '`') { >From e818dae50584672fd75372e3fd5b7fe58c0ebf0c Mon Sep 17 00:00:00 2001 From: Dave Lee <davelee....@gmail.com> Date: Tue, 12 Aug 2025 12:39:29 -0700 Subject: [PATCH 04/10] rename string helper function --- lldb/source/Interpreter/OptionValueString.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lldb/source/Interpreter/OptionValueString.cpp b/lldb/source/Interpreter/OptionValueString.cpp index 97b3e43e703eb..f6ddff3603906 100644 --- a/lldb/source/Interpreter/OptionValueString.cpp +++ b/lldb/source/Interpreter/OptionValueString.cpp @@ -16,12 +16,12 @@ using namespace lldb; using namespace lldb_private; -static void DumpValue(Stream &strm, const std::string &str, bool escape, - bool raw) { +static void DumpString(Stream &strm, const std::string &str, bool escape, + bool raw) { if (escape) { std::string escaped_str; Args::ExpandEscapedCharacters(str.data(), escaped_str); - ::DumpValue(strm, escaped_str, false, raw); + DumpString(strm, escaped_str, false, raw); return; } @@ -41,12 +41,12 @@ void OptionValueString::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, const bool escape = m_options.Test(eOptionEncodeCharacterEscapeSequences); const bool raw = dump_mask & eDumpOptionRaw; if (!m_current_value.empty() || m_value_was_set) - ::DumpValue(strm, m_current_value, escape, raw); + DumpString(strm, m_current_value, escape, raw); if (dump_mask & eDumpOptionDefaultValue && m_current_value != m_default_value && !m_default_value.empty()) { DefaultValueFormat label(strm); - ::DumpValue(strm, m_default_value, escape, raw); + DumpString(strm, m_default_value, escape, raw); } } } >From 1f70b5b3bb7c1be55fbca288814a0516b55508c0 Mon Sep 17 00:00:00 2001 From: Dave Lee <davelee....@gmail.com> Date: Tue, 12 Aug 2025 17:09:00 -0700 Subject: [PATCH 05/10] Rename flag to --include-defaults --- lldb/source/Commands/CommandObjectSettings.cpp | 10 +++++----- lldb/source/Commands/Options.td | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lldb/source/Commands/CommandObjectSettings.cpp b/lldb/source/Commands/CommandObjectSettings.cpp index e638df75b8c9a..126f57c738115 100644 --- a/lldb/source/Commands/CommandObjectSettings.cpp +++ b/lldb/source/Commands/CommandObjectSettings.cpp @@ -261,8 +261,8 @@ class CommandObjectSettingsShow : public CommandObjectParsed { ExecutionContext *execution_context) override { const int short_option = m_getopt_table[option_idx].val; switch (short_option) { - case 'v': - m_verbose = true; + case 'd': + m_include_defaults = true; break; default: llvm_unreachable("Unimplemented option"); @@ -271,14 +271,14 @@ class CommandObjectSettingsShow : public CommandObjectParsed { } void OptionParsingStarting(ExecutionContext *execution_context) override { - m_verbose = false; + m_include_defaults = false; } llvm::ArrayRef<OptionDefinition> GetDefinitions() override { return g_settings_show_options; } - bool m_verbose = false; + bool m_include_defaults = false; }; protected: @@ -286,7 +286,7 @@ class CommandObjectSettingsShow : public CommandObjectParsed { result.SetStatus(eReturnStatusSuccessFinishResult); uint32_t dump_mask = OptionValue::eDumpGroupValue; - if (m_options.m_verbose) + if (m_options.m_include_defaults) dump_mask |= OptionValue::eDumpOptionDefaultValue; if (!args.empty()) { diff --git a/lldb/source/Commands/Options.td b/lldb/source/Commands/Options.td index 596f959b76d4a..fd72342c18413 100644 --- a/lldb/source/Commands/Options.td +++ b/lldb/source/Commands/Options.td @@ -57,8 +57,8 @@ let Command = "settings clear" in { } let Command = "settings show" in { - def setshow_verbose : Option<"verbose", "v">, - Desc<"Enable verbose output.">; + def setshow_include_defaults : Option<"include-defaults", "d">, + Desc<"Include default values if defined.">; } let Command = "breakpoint list" in { >From b831cbfea8f54e7cda4c70d8e67a1299764cd41b Mon Sep 17 00:00:00 2001 From: Dave Lee <davelee....@gmail.com> Date: Wed, 13 Aug 2025 10:05:47 -0700 Subject: [PATCH 06/10] make DefaultValueFormat a class --- lldb/include/lldb/Interpreter/OptionValue.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lldb/include/lldb/Interpreter/OptionValue.h b/lldb/include/lldb/Interpreter/OptionValue.h index cbf117f2f8326..9c992821251cb 100644 --- a/lldb/include/lldb/Interpreter/OptionValue.h +++ b/lldb/include/lldb/Interpreter/OptionValue.h @@ -340,11 +340,17 @@ class OptionValue { // DeepCopy to it. Inherit from Cloneable to avoid doing this manually. virtual lldb::OptionValueSP Clone() const = 0; - struct DefaultValueFormat { + class DefaultValueFormat { + public: DefaultValueFormat(Stream &stream) : stream(stream) { stream.PutCString(" (default: "); } ~DefaultValueFormat() { stream.PutChar(')'); } + + DefaultValueFormat(const DefaultValueFormat &) = delete; + DefaultValueFormat &operator=(const DefaultValueFormat &) = delete; + + private: Stream &stream; }; >From 281b80a3e6142147e8d850422dd91232229918b5 Mon Sep 17 00:00:00 2001 From: Dave Lee <davelee....@gmail.com> Date: Wed, 13 Aug 2025 10:06:47 -0700 Subject: [PATCH 07/10] revert to original quoting style --- lldb/source/Interpreter/OptionValueFileSpec.cpp | 4 ++-- lldb/source/Interpreter/OptionValueFormatEntity.cpp | 4 ++-- lldb/source/Interpreter/OptionValueString.cpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lldb/source/Interpreter/OptionValueFileSpec.cpp b/lldb/source/Interpreter/OptionValueFileSpec.cpp index 89cc7226f69ca..8d4966dcda0bc 100644 --- a/lldb/source/Interpreter/OptionValueFileSpec.cpp +++ b/lldb/source/Interpreter/OptionValueFileSpec.cpp @@ -42,12 +42,12 @@ void OptionValueFileSpec::DumpValue(const ExecutionContext *exe_ctx, strm.PutCString(" = "); if (m_current_value) { - strm.QuotedCString(m_current_value.GetPath().data()); + strm << '"' << m_current_value.GetPath() << '"'; } if (dump_mask & eDumpOptionDefaultValue && m_current_value != m_default_value && m_default_value) { DefaultValueFormat label(strm); - strm.QuotedCString(m_default_value.GetPath().data()); + strm << '"' << m_default_value.GetPath() << '"'; } } } diff --git a/lldb/source/Interpreter/OptionValueFormatEntity.cpp b/lldb/source/Interpreter/OptionValueFormatEntity.cpp index bae1b5c77835b..b31dd4e475878 100644 --- a/lldb/source/Interpreter/OptionValueFormatEntity.cpp +++ b/lldb/source/Interpreter/OptionValueFormatEntity.cpp @@ -55,11 +55,11 @@ void OptionValueFormatEntity::DumpValue(const ExecutionContext *exe_ctx, if (dump_mask & eDumpOptionValue) { if (dump_mask & eDumpOptionType) strm.PutCString(" = "); - strm.QuotedCString(EscapeBackticks(m_current_format).data()); + strm << '"' << EscapeBackticks(m_current_format) << '"'; if (dump_mask & eDumpOptionDefaultValue && m_current_format != m_default_format) { DefaultValueFormat label(strm); - strm.QuotedCString(EscapeBackticks(m_default_format).data()); + strm << '"' << EscapeBackticks(m_default_format) << '"'; } } } diff --git a/lldb/source/Interpreter/OptionValueString.cpp b/lldb/source/Interpreter/OptionValueString.cpp index f6ddff3603906..022a27d069f48 100644 --- a/lldb/source/Interpreter/OptionValueString.cpp +++ b/lldb/source/Interpreter/OptionValueString.cpp @@ -20,7 +20,7 @@ static void DumpString(Stream &strm, const std::string &str, bool escape, bool raw) { if (escape) { std::string escaped_str; - Args::ExpandEscapedCharacters(str.data(), escaped_str); + Args::ExpandEscapedCharacters(str.c_str(), escaped_str); DumpString(strm, escaped_str, false, raw); return; } @@ -28,7 +28,7 @@ static void DumpString(Stream &strm, const std::string &str, bool escape, if (raw) strm.PutCString(str); else - strm.QuotedCString(str.data()); + strm.QuotedCString(str.c_str()); } void OptionValueString::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, >From 20a7fcc475cd96648982973caa7e7287b156cc48 Mon Sep 17 00:00:00 2001 From: Dave Lee <davelee....@gmail.com> Date: Sat, 16 Aug 2025 12:40:52 -0700 Subject: [PATCH 08/10] simplify flag name to --defaults --- lldb/source/Commands/Options.td | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lldb/source/Commands/Options.td b/lldb/source/Commands/Options.td index fd72342c18413..17d72cdcad129 100644 --- a/lldb/source/Commands/Options.td +++ b/lldb/source/Commands/Options.td @@ -57,7 +57,7 @@ let Command = "settings clear" in { } let Command = "settings show" in { - def setshow_include_defaults : Option<"include-defaults", "d">, + def setshow_defaults : Option<"defaults", "d">, Desc<"Include default values if defined.">; } >From 1697a6f1a31317f6562549bf53056fba0829fa8a Mon Sep 17 00:00:00 2001 From: Dave Lee <davelee....@gmail.com> Date: Sat, 16 Aug 2025 12:43:12 -0700 Subject: [PATCH 09/10] add tests for scalar settings types --- .../API/commands/settings/TestSettings.py | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/lldb/test/API/commands/settings/TestSettings.py b/lldb/test/API/commands/settings/TestSettings.py index bc864942055c0..e022b974ffb53 100644 --- a/lldb/test/API/commands/settings/TestSettings.py +++ b/lldb/test/API/commands/settings/TestSettings.py @@ -972,6 +972,74 @@ def test_settings_set_exists(self): # A known option should fail if its argument is invalid. self.expect("settings set auto-confirm bogus", error=True) + def test_settings_show_defaults(self): + # boolean + self.expect( + "settings show --defaults auto-one-line-summaries", + matching=False, + substrs=["(default: true)"], + ) + self.runCmd("settings set auto-one-line-summaries false") + self.expect( + "settings show --defaults auto-one-line-summaries", + substrs=["= false (default: true)"], + ) + # unsigned + self.expect( + "settings show --defaults stop-line-count-before", + matching=False, + patterns=[r"\(default: \d+\)"], + ) + self.runCmd("settings set stop-line-count-before 99") + self.expect( + "settings show --defaults stop-line-count-before", + patterns=[r"= 99 \(default: \d+\)"], + ) + # string + self.expect( + "settings show --defaults prompt", + matching=False, + patterns=[r'\(default: ".+"\)'], + ) + self.runCmd("settings set prompt '<LlDb> '") + self.expect( + "settings show --defaults prompt", + patterns=[r'= "<LlDb> " \(default: ".+"\)'], + ) + # enum + self.expect( + "settings show --defaults stop-disassembly-display", + matching=False, + patterns=[r"\(default: .+\)"], + ) + self.runCmd("settings set stop-disassembly-display no-source") + self.expect( + "settings show --defaults stop-disassembly-display", + patterns=[r"= no-source \(default: .+\)"], + ) + # regex + self.expect( + "settings show --defaults target.process.thread.step-avoid-regexp", + matching=False, + patterns=[r"\(default: .+\)"], + ) + self.runCmd("settings set target.process.thread.step-avoid-regexp dotstar") + self.expect( + "settings show --defaults target.process.thread.step-avoid-regexp", + patterns=[r"= dotstar \(default: .+\)"], + ) + # format-string + self.expect( + "settings show --defaults disassembly-format", + matching=False, + patterns=[r'\(default: ".+"\)'], + ) + self.runCmd("settings set disassembly-format dollar") + self.expect( + "settings show --defaults disassembly-format", + patterns=[r'= "dollar" \(default: ".+"\)'], + ) + def get_setting_json(self, setting_path=None): settings_data = self.dbg.GetSetting(setting_path) stream = lldb.SBStream() >From eb7116c248535894a8cb1eb90a0a44d5599aadfe Mon Sep 17 00:00:00 2001 From: Dave Lee <davelee....@gmail.com> Date: Sat, 16 Aug 2025 13:49:58 -0700 Subject: [PATCH 10/10] now add support for collection settings --- lldb/source/Interpreter/OptionValueArray.cpp | 12 ++++- .../Interpreter/OptionValueDictionary.cpp | 8 +++- .../Interpreter/OptionValueFileSpecList.cpp | 13 ++++-- .../Interpreter/OptionValuePathMappings.cpp | 12 ++++- .../API/commands/settings/TestSettings.py | 44 +++++++++++++++++++ 5 files changed, 81 insertions(+), 8 deletions(-) diff --git a/lldb/source/Interpreter/OptionValueArray.cpp b/lldb/source/Interpreter/OptionValueArray.cpp index f6c14dee525e9..5600333c111a7 100644 --- a/lldb/source/Interpreter/OptionValueArray.cpp +++ b/lldb/source/Interpreter/OptionValueArray.cpp @@ -8,6 +8,7 @@ #include "lldb/Interpreter/OptionValueArray.h" +#include "lldb/Interpreter/OptionValue.h" #include "lldb/Utility/Args.h" #include "lldb/Utility/Stream.h" @@ -27,8 +28,15 @@ void OptionValueArray::DumpValue(const ExecutionContext *exe_ctx, Stream &strm, if (dump_mask & eDumpOptionValue) { const bool one_line = dump_mask & eDumpOptionCommand; const uint32_t size = m_values.size(); - if (dump_mask & eDumpOptionType) - strm.Printf(" =%s", (m_values.size() > 0 && !one_line) ? "\n" : ""); + if (dump_mask & (eDumpOptionType | eDumpOptionDefaultValue)) { + strm.PutCString(" ="); + if (dump_mask & eDumpOptionDefaultValue && !m_values.empty()) { + DefaultValueFormat label(strm); + strm.PutCString("empty"); + } + if (!m_values.empty() && !one_line) + strm.PutCString("\n"); + } if (!one_line) strm.IndentMore(); for (uint32_t i = 0; i < size; ++i) { diff --git a/lldb/source/Interpreter/OptionValueDictionary.cpp b/lldb/source/Interpreter/OptionValueDictionary.cpp index 19e21dd6f4c9a..0efc76bb7cd94 100644 --- a/lldb/source/Interpreter/OptionValueDictionary.cpp +++ b/lldb/source/Interpreter/OptionValueDictionary.cpp @@ -9,6 +9,7 @@ #include "lldb/Interpreter/OptionValueDictionary.h" #include "lldb/DataFormatters/FormatManager.h" +#include "lldb/Interpreter/OptionValue.h" #include "lldb/Interpreter/OptionValueEnumeration.h" #include "lldb/Interpreter/OptionValueString.h" #include "lldb/Utility/Args.h" @@ -30,8 +31,13 @@ void OptionValueDictionary::DumpValue(const ExecutionContext *exe_ctx, } if (dump_mask & eDumpOptionValue) { const bool one_line = dump_mask & eDumpOptionCommand; - if (dump_mask & eDumpOptionType) + if (dump_mask & (eDumpOptionType | eDumpOptionDefaultValue)) { strm.PutCString(" ="); + if (dump_mask & eDumpOptionDefaultValue && !m_values.empty()) { + DefaultValueFormat label(strm); + strm.PutCString("empty"); + } + } if (!one_line) strm.IndentMore(); diff --git a/lldb/source/Interpreter/OptionValueFileSpecList.cpp b/lldb/source/Interpreter/OptionValueFileSpecList.cpp index f252dc4603cc1..f331c5d13f461 100644 --- a/lldb/source/Interpreter/OptionValueFileSpecList.cpp +++ b/lldb/source/Interpreter/OptionValueFileSpecList.cpp @@ -8,6 +8,7 @@ #include "lldb/Interpreter/OptionValueFileSpecList.h" +#include "lldb/Interpreter/OptionValue.h" #include "lldb/Utility/Args.h" #include "lldb/Utility/Stream.h" @@ -22,9 +23,15 @@ void OptionValueFileSpecList::DumpValue(const ExecutionContext *exe_ctx, if (dump_mask & eDumpOptionValue) { const bool one_line = dump_mask & eDumpOptionCommand; const uint32_t size = m_current_value.GetSize(); - if (dump_mask & eDumpOptionType) - strm.Printf(" =%s", - (m_current_value.GetSize() > 0 && !one_line) ? "\n" : ""); + if (dump_mask & (eDumpOptionType | eDumpOptionDefaultValue)) { + strm.Printf(" ="); + if (dump_mask & eDumpOptionDefaultValue && !m_current_value.IsEmpty()) { + DefaultValueFormat label(strm); + strm.PutCString("empty"); + } + if (!m_current_value.IsEmpty() && !one_line) + strm.PutCString("\n"); + } if (!one_line) strm.IndentMore(); for (uint32_t i = 0; i < size; ++i) { diff --git a/lldb/source/Interpreter/OptionValuePathMappings.cpp b/lldb/source/Interpreter/OptionValuePathMappings.cpp index 95b8e64171455..abf4d429602e4 100644 --- a/lldb/source/Interpreter/OptionValuePathMappings.cpp +++ b/lldb/source/Interpreter/OptionValuePathMappings.cpp @@ -9,6 +9,7 @@ #include "lldb/Interpreter/OptionValuePathMappings.h" #include "lldb/Host/FileSystem.h" +#include "lldb/Interpreter/OptionValue.h" #include "lldb/Utility/Args.h" #include "lldb/Utility/FileSpec.h" #include "lldb/Utility/Stream.h" @@ -28,8 +29,15 @@ void OptionValuePathMappings::DumpValue(const ExecutionContext *exe_ctx, if (dump_mask & eDumpOptionType) strm.Printf("(%s)", GetTypeAsCString()); if (dump_mask & eDumpOptionValue) { - if (dump_mask & eDumpOptionType) - strm.Printf(" =%s", (m_path_mappings.GetSize() > 0) ? "\n" : ""); + if (dump_mask & (eDumpOptionType | eDumpOptionDefaultValue)) { + strm.Printf(" ="); + if (dump_mask & eDumpOptionDefaultValue && !m_path_mappings.IsEmpty()) { + DefaultValueFormat label(strm); + strm.PutCString("empty"); + } + if (!m_path_mappings.IsEmpty()) + strm.PutCString("\n"); + } m_path_mappings.Dump(&strm); } } diff --git a/lldb/test/API/commands/settings/TestSettings.py b/lldb/test/API/commands/settings/TestSettings.py index e022b974ffb53..a7a92442e543f 100644 --- a/lldb/test/API/commands/settings/TestSettings.py +++ b/lldb/test/API/commands/settings/TestSettings.py @@ -1039,6 +1039,50 @@ def test_settings_show_defaults(self): "settings show --defaults disassembly-format", patterns=[r'= "dollar" \(default: ".+"\)'], ) + # arrays + self.expect( + "settings show --defaults target.unset-env-vars", + matching=False, + substrs=["(default: empty)"], + ) + self.runCmd("settings set target.unset-env-vars PATH") + self.expect( + "settings show --defaults target.unset-env-vars", + substrs=["(default: empty)", '[0]: "PATH"'], + ) + # dictionaries + self.expect( + "settings show --defaults target.env-vars", + matching=False, + substrs=["(default: empty)"], + ) + self.runCmd("settings set target.env-vars THING=value") + self.expect( + "settings show --defaults target.env-vars", + substrs=["(default: empty)", "THING=value"], + ) + # file list + self.expect( + "settings show --defaults target.exec-search-paths", + matching=False, + substrs=["(default: empty)"], + ) + self.runCmd("settings set target.exec-search-paths /tmp") + self.expect( + "settings show --defaults target.exec-search-paths", + substrs=["(default: empty)", "[0]: /tmp"], + ) + # path map + self.expect( + "settings show --defaults target.source-map", + matching=False, + substrs=["(default: empty)"], + ) + self.runCmd("settings set target.source-map /abc /tmp") + self.expect( + "settings show --defaults target.source-map", + substrs=["(default: empty)", '[0] "/abc" -> "/tmp"'], + ) def get_setting_json(self, setting_path=None): settings_data = self.dbg.GetSetting(setting_path) _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits