Skip to content

Commit

Permalink
[lldb] Add --exists flag to settings set
Browse files Browse the repository at this point in the history
Add a --exists/-e flag to `settings set` that sets the setting if it
exists, but doesn't print an error otherwise. This is useful for example
when setting options in your ~/.lldbinit that might not exist in older
versions of lldb.

Differential revision: https://reviews.llvm.org/D121155
  • Loading branch information
JDevlieghere committed Mar 9, 2022
1 parent 04fff54 commit 8a0fa4d
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 5 deletions.
12 changes: 8 additions & 4 deletions lldb/source/Commands/CommandObjectSettings.cpp
Expand Up @@ -102,6 +102,9 @@ insert-before or insert-after.");
case 'g':
m_global = true;
break;
case 'e':
m_exists = true;
break;
default:
llvm_unreachable("Unimplemented option");
}
Expand All @@ -112,6 +115,7 @@ insert-before or insert-after.");
void OptionParsingStarting(ExecutionContext *execution_context) override {
m_global = false;
m_force = false;
m_exists = false;
}

llvm::ArrayRef<OptionDefinition> GetDefinitions() override {
Expand All @@ -120,7 +124,8 @@ insert-before or insert-after.");

// Instance variables to hold the values for command options.
bool m_global = false;
bool m_force;
bool m_force = false;
bool m_exists = false;
};

void
Expand Down Expand Up @@ -219,13 +224,12 @@ insert-before or insert-after.");
var_name, var_value);
}

if (error.Fail()) {
if (error.Fail() && !m_options.m_exists) {
result.AppendError(error.AsCString());
return false;
} else {
result.SetStatus(eReturnStatusSuccessFinishResult);
}

result.SetStatus(eReturnStatusSuccessFinishResult);
return result.Succeeded();
}

Expand Down
5 changes: 4 additions & 1 deletion lldb/source/Commands/Options.td
Expand Up @@ -22,6 +22,9 @@ let Command = "settings set" in {
Desc<"Apply the new value to the global default value.">;
def setset_force : Option<"force", "f">,
Desc<"Force an empty value to be accepted as the default.">;
def setset_exists : Option<"exists", "e">,
Desc<"Set the setting if it exists, but do not cause the command to raise "
"an error if it does not exist.">;
}

let Command = "settings write" in {
Expand Down Expand Up @@ -957,7 +960,7 @@ let Command = "target modules lookup" in {
def target_modules_lookup_type : Option<"type", "t">, Group<6>, Arg<"Name">,
Required, Desc<"Lookup a type by name in the debug symbols in one or more "
"target modules.">;
def target_modules_lookup_variables_ranges : Option<"show-variable-ranges",
def target_modules_lookup_variables_ranges : Option<"show-variable-ranges",
"\\x01">, GroupRange<1, 6>, Desc<"Dump valid ranges of variables (must be "
"used in conjunction with --verbose">;
def target_modules_lookup_verbose : Option<"verbose", "v">,
Expand Down
10 changes: 10 additions & 0 deletions lldb/test/API/commands/settings/TestSettings.py
Expand Up @@ -779,3 +779,13 @@ def test_experimental_settings(self):
# finally, confirm that trying to set a setting that does not exist still fails.
# (SHOWING a setting that does not exist does not currently yield an error.)
self.expect('settings set target.setting-which-does-not-exist true', error=True)

def test_settings_set_exists(self):
cmdinterp = self.dbg.GetCommandInterpreter()

# An unknown option should succeed.
self.expect('settings set -e foo bar')
self.expect('settings set --exists foo bar')

# A known option should fail if its argument is invalid.
self.expect("settings set auto-confirm bogus", error=True)

0 comments on commit 8a0fa4d

Please sign in to comment.