Skip to content

Commit

Permalink
Propagate command interpreter errors from lldlbinit
Browse files Browse the repository at this point in the history
This patch ensures that we propagate errors coming from the lldbinit
file trough the command/script interpreter. Before, if you did something
like command script import syntax_error.py, and the python file
contained a syntax error, lldb wouldn't tell you about it. This changes
with the current patch: errors are now propagated by default.

PS: Jim authored this change and I added testing.

Differential revision: https://reviews.llvm.org/D61579

llvm-svn: 360216
  • Loading branch information
JDevlieghere authored and MrSidims committed May 24, 2019
1 parent b82686e commit 64e42be
Show file tree
Hide file tree
Showing 11 changed files with 48 additions and 8 deletions.
22 changes: 17 additions & 5 deletions lldb/include/lldb/Interpreter/CommandInterpreter.h
Expand Up @@ -53,33 +53,38 @@ class CommandInterpreterRunOptions {
/// \b false, print no ouput in this case. This setting has an effect only
/// if \param echo_commands is \b true.
/// \param[in] print_results
/// If \b true print the results of the command after executing it. If
/// \b false, execute silently.
/// If \b true and the command succeeds, print the results of the command
/// after executing it. If \b false, execute silently.
/// \param[in] print_errors
/// If \b true and the command fails, print the results of the command
/// after executing it. If \b false, execute silently.
/// \param[in] add_to_history
/// If \b true add the commands to the command history. If \b false, don't
/// add them.
CommandInterpreterRunOptions(LazyBool stop_on_continue,
LazyBool stop_on_error, LazyBool stop_on_crash,
LazyBool echo_commands, LazyBool echo_comments,
LazyBool print_results, LazyBool add_to_history)
LazyBool print_results, LazyBool print_errors,
LazyBool add_to_history)
: m_stop_on_continue(stop_on_continue), m_stop_on_error(stop_on_error),
m_stop_on_crash(stop_on_crash), m_echo_commands(echo_commands),
m_echo_comment_commands(echo_comments), m_print_results(print_results),
m_add_to_history(add_to_history) {}
m_print_errors(print_errors), m_add_to_history(add_to_history) {}

CommandInterpreterRunOptions()
: m_stop_on_continue(eLazyBoolCalculate),
m_stop_on_error(eLazyBoolCalculate),
m_stop_on_crash(eLazyBoolCalculate),
m_echo_commands(eLazyBoolCalculate),
m_echo_comment_commands(eLazyBoolCalculate),
m_print_results(eLazyBoolCalculate),
m_print_results(eLazyBoolCalculate), m_print_errors(eLazyBoolCalculate),
m_add_to_history(eLazyBoolCalculate) {}

void SetSilent(bool silent) {
LazyBool value = silent ? eLazyBoolNo : eLazyBoolYes;

m_print_results = value;
m_print_errors = value;
m_echo_commands = value;
m_echo_comment_commands = value;
m_add_to_history = value;
Expand Down Expand Up @@ -127,6 +132,12 @@ class CommandInterpreterRunOptions {
m_print_results = print_results ? eLazyBoolYes : eLazyBoolNo;
}

bool GetPrintErrors() const { return DefaultToYes(m_print_errors); }

void SetPrintErrors(bool print_errors) {
m_print_errors = print_errors ? eLazyBoolYes : eLazyBoolNo;
}

bool GetAddToHistory() const { return DefaultToYes(m_add_to_history); }

void SetAddToHistory(bool add_to_history) {
Expand All @@ -139,6 +150,7 @@ class CommandInterpreterRunOptions {
LazyBool m_echo_commands;
LazyBool m_echo_comment_commands;
LazyBool m_print_results;
LazyBool m_print_errors;
LazyBool m_add_to_history;

private:
Expand Down
1 change: 1 addition & 0 deletions lldb/lit/Driver/Inputs/.lldbinit
@@ -1 +1,2 @@
settings set -f frame-format "bogus"
command script import syntax_error.py
1 change: 1 addition & 0 deletions lldb/lit/Driver/Inputs/syntax_error.py
@@ -0,0 +1 @@
prlnt("foo")
2 changes: 2 additions & 0 deletions lldb/lit/Driver/LocalLLDBInit.test
@@ -1,6 +1,7 @@
# RUN: mkdir -p %t.root
# RUN: mkdir -p %t.home
# RUN: cp %S/Inputs/.lldbinit %t.root
# RUN: cp %S/Inputs/syntax_error.py %t.root
# RUN: cd %t.root
# RUN: env HOME=%t.home %lldb-init -o 'settings show frame-format' 2>&1 | FileCheck %s --check-prefix=WARNINIT --check-prefix=CHECK
# RUN: env HOME=%t.home %lldb-init -local-lldbinit -o 'settings show frame-format' 2>&1 | FileCheck %s --check-prefix=ALLOWINIT --check-prefix=NOINIT
Expand All @@ -9,4 +10,5 @@
# WARNINIT: There is a .lldbinit file in the current directory which is not being read.
# NOINIT-NOT: There is a .lldbinit file in the current directory which is not being read.
# CHECK-NOT: bogus
# ALLOWINIT: name 'prlnt' is not defined
# ALLOWINIT: bogus
1 change: 1 addition & 0 deletions lldb/source/Breakpoint/BreakpointOptions.cpp
Expand Up @@ -646,6 +646,7 @@ bool BreakpointOptions::BreakpointOptionsCallbackFunction(
options.SetStopOnError(data->stop_on_error);
options.SetEchoCommands(true);
options.SetPrintResults(true);
options.SetPrintErrors(true);
options.SetAddToHistory(false);

debugger.GetCommandInterpreter().HandleCommands(commands, &exe_ctx,
Expand Down
1 change: 1 addition & 0 deletions lldb/source/Commands/CommandObjectBugreport.cpp
Expand Up @@ -94,6 +94,7 @@ class CommandObjectBugreportUnwind : public CommandObjectParsed {
options.SetStopOnError(false);
options.SetEchoCommands(true);
options.SetPrintResults(true);
options.SetPrintErrors(true);
options.SetAddToHistory(false);
m_interpreter.HandleCommands(commands, &m_exe_ctx, options, result);

Expand Down
1 change: 1 addition & 0 deletions lldb/source/Commands/CommandObjectCommands.cpp
Expand Up @@ -322,6 +322,7 @@ class CommandObjectCommandsSource : public CommandObjectParsed {
options.SetSilent(true);
} else {
options.SetPrintResults(true);
options.SetPrintErrors(true);
options.SetEchoCommands(m_interpreter.GetEchoCommands());
options.SetEchoCommentCommands(m_interpreter.GetEchoCommentCommands());
}
Expand Down
1 change: 1 addition & 0 deletions lldb/source/Commands/CommandObjectSettings.cpp
Expand Up @@ -501,6 +501,7 @@ class CommandObjectSettingsRead : public CommandObjectParsed {
options.SetAddToHistory(false);
options.SetEchoCommands(false);
options.SetPrintResults(true);
options.SetPrintErrors(true);
options.SetStopOnError(false);
m_interpreter.HandleCommandsFromFile(file, &clean_ctx, options, result);
return result.Succeeded();
Expand Down
1 change: 1 addition & 0 deletions lldb/source/Commands/CommandObjectWatchpointCommand.cpp
Expand Up @@ -295,6 +295,7 @@ are no syntax errors may indicate that a function was declared but never called.
options.SetStopOnError(data->stop_on_error);
options.SetEchoCommands(false);
options.SetPrintResults(true);
options.SetPrintErrors(true);
options.SetAddToHistory(false);

debugger.GetCommandInterpreter().HandleCommands(commands, &exe_ctx,
Expand Down
24 changes: 21 additions & 3 deletions lldb/source/Interpreter/CommandInterpreter.cpp
Expand Up @@ -2173,6 +2173,7 @@ void CommandInterpreter::SourceInitFile(bool in_cwd,
const bool saved_batch = SetBatchCommandMode(true);
CommandInterpreterRunOptions options;
options.SetSilent(true);
options.SetPrintErrors(true);
options.SetStopOnError(false);
options.SetStopOnContinue(true);

Expand Down Expand Up @@ -2364,7 +2365,8 @@ enum {
eHandleCommandFlagEchoCommand = (1u << 2),
eHandleCommandFlagEchoCommentCommand = (1u << 3),
eHandleCommandFlagPrintResult = (1u << 4),
eHandleCommandFlagStopOnCrash = (1u << 5)
eHandleCommandFlagPrintErrors = (1u << 5),
eHandleCommandFlagStopOnCrash = (1u << 6)
};

void CommandInterpreter::HandleCommandsFromFile(
Expand Down Expand Up @@ -2463,6 +2465,17 @@ void CommandInterpreter::HandleCommandsFromFile(
flags |= eHandleCommandFlagPrintResult;
}

if (options.m_print_errors == eLazyBoolCalculate) {
if (m_command_source_flags.empty()) {
// Print output by default
flags |= eHandleCommandFlagPrintErrors;
} else if (m_command_source_flags.back() & eHandleCommandFlagPrintErrors) {
flags |= eHandleCommandFlagPrintErrors;
}
} else if (options.m_print_errors == eLazyBoolYes) {
flags |= eHandleCommandFlagPrintErrors;
}

if (flags & eHandleCommandFlagPrintResult) {
debugger.GetOutputFile()->Printf("Executing commands in '%s'.\n",
cmd_file_path.c_str());
Expand Down Expand Up @@ -2790,7 +2803,9 @@ void CommandInterpreter::IOHandlerInputComplete(IOHandler &io_handler,
HandleCommand(line.c_str(), eLazyBoolCalculate, result);

// Now emit the command output text from the command we just executed
if (io_handler.GetFlags().Test(eHandleCommandFlagPrintResult)) {
if ((result.Succeeded() &&
io_handler.GetFlags().Test(eHandleCommandFlagPrintResult)) ||
io_handler.GetFlags().Test(eHandleCommandFlagPrintErrors)) {
// Display any STDOUT/STDERR _prior_ to emitting the command result text
GetProcessOutput();

Expand Down Expand Up @@ -2960,8 +2975,11 @@ CommandInterpreter::GetIOHandler(bool force_create,
flags |= eHandleCommandFlagEchoCommentCommand;
if (options->m_print_results != eLazyBoolNo)
flags |= eHandleCommandFlagPrintResult;
if (options->m_print_errors != eLazyBoolNo)
flags |= eHandleCommandFlagPrintErrors;
} else {
flags = eHandleCommandFlagEchoCommand | eHandleCommandFlagPrintResult;
flags = eHandleCommandFlagEchoCommand | eHandleCommandFlagPrintResult |
eHandleCommandFlagPrintErrors;
}

m_command_io_handler_sp = std::make_shared<IOHandlerEditline>(
Expand Down
1 change: 1 addition & 0 deletions lldb/source/Target/Target.cpp
Expand Up @@ -2652,6 +2652,7 @@ void Target::RunStopHooks() {
options.SetStopOnError(true);
options.SetEchoCommands(false);
options.SetPrintResults(true);
options.SetPrintErrors(true);
options.SetAddToHistory(false);

// Force Async:
Expand Down

0 comments on commit 64e42be

Please sign in to comment.