Author: Michael Buch Date: 2024-04-11T20:29:18+02:00 New Revision: fc52ee336b394d84110184d625cda1d4f84d8098
URL: https://github.com/llvm/llvm-project/commit/fc52ee336b394d84110184d625cda1d4f84d8098 DIFF: https://github.com/llvm/llvm-project/commit/fc52ee336b394d84110184d625cda1d4f84d8098.diff LOG: [lldb][ClangUserExpression][NFCI] Pass the most specific ExecutionContextScope possible into ClangExpressionParser (#87657) The `ClangExpressionParser` takes an `ExecutionContextScope` which it uses to query the `Process`/`Target`/`StackFrame` to set various compiler options in preparation for parsing an expression. However, `TryParse` constructs the parser with a `Process` or `Target`, never a `StackFrame`. So when the parser tries to retrieve the current `StackFrame` from the `exe_scope`, it doesn't succeed. In future patches we want to query the `StackFrame` from within the `ClangExpressionParser` constructor. This patch simplifies `TryParse`, by removing the redundant `exe_scope` parameter, and instead uses the `exe_ctx` to derive the most fitting `exe_scope` to pass into `ClangExpressionParser`. Not entirely sure how to test this. This patch is a prerequisite to get subsequent patches that set `LangOpts` based on the current `StackFrame` to work. Added: Modified: lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.h Removed: ################################################################################ diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp index 30bc81c9ed8c19..5776b1e94e0721 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp @@ -553,9 +553,9 @@ bool ClangUserExpression::PrepareForParsing( } bool ClangUserExpression::TryParse( - DiagnosticManager &diagnostic_manager, ExecutionContextScope *exe_scope, - ExecutionContext &exe_ctx, lldb_private::ExecutionPolicy execution_policy, - bool keep_result_in_memory, bool generate_debug_info) { + DiagnosticManager &diagnostic_manager, ExecutionContext &exe_ctx, + lldb_private::ExecutionPolicy execution_policy, bool keep_result_in_memory, + bool generate_debug_info) { m_materializer_up = std::make_unique<Materializer>(); ResetDeclMap(exe_ctx, m_result_delegate, keep_result_in_memory); @@ -574,7 +574,8 @@ bool ClangUserExpression::TryParse( } m_parser = std::make_unique<ClangExpressionParser>( - exe_scope, *this, generate_debug_info, m_include_directories, m_filename); + exe_ctx.GetBestExecutionContextScope(), *this, generate_debug_info, + m_include_directories, m_filename); unsigned num_errors = m_parser->Parse(diagnostic_manager); @@ -669,15 +670,8 @@ bool ClangUserExpression::Parse(DiagnosticManager &diagnostic_manager, // Parse the expression // - Process *process = exe_ctx.GetProcessPtr(); - ExecutionContextScope *exe_scope = process; - - if (!exe_scope) - exe_scope = exe_ctx.GetTargetPtr(); - - bool parse_success = TryParse(diagnostic_manager, exe_scope, exe_ctx, - execution_policy, keep_result_in_memory, - generate_debug_info); + bool parse_success = TryParse(diagnostic_manager, exe_ctx, execution_policy, + keep_result_in_memory, generate_debug_info); // If the expression failed to parse, check if retrying parsing with a loaded // C++ module is possible. if (!parse_success && shouldRetryWithCppModule(*target, execution_policy)) { @@ -695,9 +689,8 @@ bool ClangUserExpression::Parse(DiagnosticManager &diagnostic_manager, // so recreate those. CreateSourceCode(retry_manager, exe_ctx, m_imported_cpp_modules, /*for_completion*/ false); - parse_success = TryParse(retry_manager, exe_scope, exe_ctx, - execution_policy, keep_result_in_memory, - generate_debug_info); + parse_success = TryParse(retry_manager, exe_ctx, execution_policy, + keep_result_in_memory, generate_debug_info); // Return the parse diagnostics if we were successful. if (parse_success) diagnostic_manager = std::move(retry_manager); @@ -759,6 +752,7 @@ bool ClangUserExpression::Parse(DiagnosticManager &diagnostic_manager, } } + Process *process = exe_ctx.GetProcessPtr(); if (process && m_jit_start_addr != LLDB_INVALID_ADDRESS) m_jit_process_wp = lldb::ProcessWP(process->shared_from_this()); return true; @@ -840,13 +834,8 @@ bool ClangUserExpression::Complete(ExecutionContext &exe_ctx, DeclMap()->SetLookupsEnabled(true); } - Process *process = exe_ctx.GetProcessPtr(); - ExecutionContextScope *exe_scope = process; - - if (!exe_scope) - exe_scope = exe_ctx.GetTargetPtr(); - - ClangExpressionParser parser(exe_scope, *this, false); + ClangExpressionParser parser(exe_ctx.GetBestExecutionContextScope(), *this, + false); // We have to find the source code location where the user text is inside // the transformed expression code. When creating the transformed text, we diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.h b/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.h index 7a8c095f61183b..bc07cbcf9e646d 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.h +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangUserExpression.h @@ -185,9 +185,9 @@ class ClangUserExpression : public LLVMUserExpression { /// The parameter have the same meaning as in ClangUserExpression::Parse. /// \see ClangUserExpression::Parse bool TryParse(DiagnosticManager &diagnostic_manager, - ExecutionContextScope *exe_scope, ExecutionContext &exe_ctx, - lldb_private::ExecutionPolicy execution_policy, bool keep_result_in_memory, - bool generate_debug_info); + ExecutionContext &exe_ctx, + lldb_private::ExecutionPolicy execution_policy, + bool keep_result_in_memory, bool generate_debug_info); void SetupCppModuleImports(ExecutionContext &exe_ctx); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits