mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-29 09:26:06 +00:00

Follow up to "Suppress persistent result when running po" (D144044). This change delays removal of the persistent result until after `Dump` has been called. In doing so, the persistent result is available for the purpose of getting its object description. In the original change, the persistent result removal happens indirectly, by setting `EvaluateExpressionOptions::SetSuppressPersistentResult`. In practice this has worked, however this exposed a latent bug in swift-lldb. The subtlety, and the bug, depend on when the persisteted result variable is removed. When the result is removed via `SetSuppressPersistentResult`, it happens within the call to `Target::EvaluateExpression`. That is, by the time the call returns, the persistent result is already removed. The issue occurs shortly thereafter, when `ValueObject::Dump` is called, it cannot make use of the persistent result variable (instead it uses the `ValueObjectConstResult`). In swift-lldb, this causes an additional expression evaluation to happen. It first tries an expression that reference `$R0` etc, but that always fails because `$R0` is removed. The fallback to this failure does work most of the time, but there's at least one bug involving imported Clang types. Differential Revision: https://reviews.llvm.org/D150619
108 lines
3.9 KiB
C++
108 lines
3.9 KiB
C++
//===-- CommandObjectExpression.h -------------------------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLDB_SOURCE_COMMANDS_COMMANDOBJECTEXPRESSION_H
|
|
#define LLDB_SOURCE_COMMANDS_COMMANDOBJECTEXPRESSION_H
|
|
|
|
#include "lldb/Core/IOHandler.h"
|
|
#include "lldb/Interpreter/CommandObject.h"
|
|
#include "lldb/Interpreter/OptionGroupBoolean.h"
|
|
#include "lldb/Interpreter/OptionGroupFormat.h"
|
|
#include "lldb/Interpreter/OptionGroupValueObjectDisplay.h"
|
|
#include "lldb/Target/Target.h"
|
|
#include "lldb/lldb-private-enumerations.h"
|
|
|
|
namespace lldb_private {
|
|
|
|
class CommandObjectExpression : public CommandObjectRaw,
|
|
public IOHandlerDelegate {
|
|
public:
|
|
class CommandOptions : public OptionGroup {
|
|
public:
|
|
CommandOptions();
|
|
|
|
~CommandOptions() override;
|
|
|
|
llvm::ArrayRef<OptionDefinition> GetDefinitions() override;
|
|
|
|
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_value,
|
|
ExecutionContext *execution_context) override;
|
|
|
|
void OptionParsingStarting(ExecutionContext *execution_context) override;
|
|
|
|
/// Return the appropriate expression options used for evaluating the
|
|
/// expression in the given target.
|
|
EvaluateExpressionOptions GetEvaluateExpressionOptions(
|
|
const Target &target,
|
|
const OptionGroupValueObjectDisplay &display_opts);
|
|
|
|
bool ShouldSuppressResult(
|
|
const OptionGroupValueObjectDisplay &display_opts) const;
|
|
|
|
bool top_level;
|
|
bool unwind_on_error;
|
|
bool ignore_breakpoints;
|
|
bool allow_jit;
|
|
bool show_types;
|
|
bool show_summary;
|
|
bool debug;
|
|
uint32_t timeout;
|
|
bool try_all_threads;
|
|
lldb::LanguageType language;
|
|
LanguageRuntimeDescriptionDisplayVerbosity m_verbosity;
|
|
LazyBool auto_apply_fixits;
|
|
LazyBool suppress_persistent_result;
|
|
};
|
|
|
|
CommandObjectExpression(CommandInterpreter &interpreter);
|
|
|
|
~CommandObjectExpression() override;
|
|
|
|
Options *GetOptions() override;
|
|
|
|
void HandleCompletion(CompletionRequest &request) override;
|
|
|
|
protected:
|
|
// IOHandler::Delegate functions
|
|
void IOHandlerInputComplete(IOHandler &io_handler,
|
|
std::string &line) override;
|
|
|
|
bool IOHandlerIsInputComplete(IOHandler &io_handler,
|
|
StringList &lines) override;
|
|
|
|
bool DoExecute(llvm::StringRef command, CommandReturnObject &result) override;
|
|
|
|
/// Evaluates the given expression.
|
|
/// \param output_stream The stream to which the evaluation result will be
|
|
/// printed.
|
|
/// \param error_stream Contains error messages that should be displayed to
|
|
/// the user in case the evaluation fails.
|
|
/// \param result A CommandReturnObject which status will be set to the
|
|
/// appropriate value depending on evaluation success and
|
|
/// whether the expression produced any result.
|
|
/// \return Returns true iff the expression was successfully evaluated,
|
|
/// executed and the result could be printed to the output stream.
|
|
bool EvaluateExpression(llvm::StringRef expr, Stream &output_stream,
|
|
Stream &error_stream, CommandReturnObject &result);
|
|
|
|
void GetMultilineExpression();
|
|
|
|
OptionGroupOptions m_option_group;
|
|
OptionGroupFormat m_format_options;
|
|
OptionGroupValueObjectDisplay m_varobj_options;
|
|
OptionGroupBoolean m_repl_option;
|
|
CommandOptions m_command_options;
|
|
uint32_t m_expr_line_count;
|
|
std::string m_expr_lines; // Multi-line expression support
|
|
std::string m_fixed_expression; // Holds the current expression's fixed text.
|
|
};
|
|
|
|
} // namespace lldb_private
|
|
|
|
#endif // LLDB_SOURCE_COMMANDS_COMMANDOBJECTEXPRESSION_H
|