180814287SRaphael Isemann //===-- ThreadPlanCallUserExpression.cpp ----------------------------------===// 2f48169bbSJim Ingham // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6f48169bbSJim Ingham // 7f48169bbSJim Ingham //===----------------------------------------------------------------------===// 8f48169bbSJim Ingham 9f48169bbSJim Ingham #include "lldb/Target/ThreadPlanCallUserExpression.h" 10f48169bbSJim Ingham 1146d005dbSJim Ingham 12f48169bbSJim Ingham #include "lldb/Breakpoint/Breakpoint.h" 13f48169bbSJim Ingham #include "lldb/Breakpoint/BreakpointLocation.h" 14f48169bbSJim Ingham #include "lldb/Core/Address.h" 15579e70c9SSean Callanan #include "lldb/Expression/DiagnosticManager.h" 16bab7e3d7SAlex Langford #include "lldb/Expression/DynamicCheckerFunctions.h" 17579e70c9SSean Callanan #include "lldb/Expression/UserExpression.h" 1897a14e60SZachary Turner #include "lldb/Host/HostInfo.h" 19f48169bbSJim Ingham #include "lldb/Target/LanguageRuntime.h" 20f48169bbSJim Ingham #include "lldb/Target/Process.h" 21f48169bbSJim Ingham #include "lldb/Target/RegisterContext.h" 22f48169bbSJim Ingham #include "lldb/Target/StopInfo.h" 23f48169bbSJim Ingham #include "lldb/Target/Target.h" 24f48169bbSJim Ingham #include "lldb/Target/Thread.h" 25f48169bbSJim Ingham #include "lldb/Target/ThreadPlanRunToAddress.h" 266f9e6901SZachary Turner #include "lldb/Utility/Log.h" 27bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 28f48169bbSJim Ingham 29f48169bbSJim Ingham using namespace lldb; 30f48169bbSJim Ingham using namespace lldb_private; 31f48169bbSJim Ingham 32f48169bbSJim Ingham // ThreadPlanCallUserExpression: Plan to call a single function 33f48169bbSJim Ingham 34b9c1b51eSKate Stone ThreadPlanCallUserExpression::ThreadPlanCallUserExpression( 35b9c1b51eSKate Stone Thread &thread, Address &function, llvm::ArrayRef<lldb::addr_t> args, 366fbc48bcSJim Ingham const EvaluateExpressionOptions &options, 37b9c1b51eSKate Stone lldb::UserExpressionSP &user_expression_sp) 38b9c1b51eSKate Stone : ThreadPlanCallFunction(thread, function, CompilerType(), args, options), 39b9c1b51eSKate Stone m_user_expression_sp(user_expression_sp) { 4005097246SAdrian Prantl // User expressions are generally "User generated" so we should set them up 4105097246SAdrian Prantl // to stop when done. 42*04cbfa95SQuinn Pham SetIsControllingPlan(true); 43923886ceSJim Ingham SetOkayToDiscard(false); 44f48169bbSJim Ingham } 45f48169bbSJim Ingham 46fd2433e1SJonas Devlieghere ThreadPlanCallUserExpression::~ThreadPlanCallUserExpression() = default; 47f48169bbSJim Ingham 48b9c1b51eSKate Stone void ThreadPlanCallUserExpression::GetDescription( 49b9c1b51eSKate Stone Stream *s, lldb::DescriptionLevel level) { 5030fadafeSJim Ingham if (level == eDescriptionLevelBrief) 5130fadafeSJim Ingham s->Printf("User Expression thread plan"); 5230fadafeSJim Ingham else 53f48169bbSJim Ingham ThreadPlanCallFunction::GetDescription(s, level); 54ce553d88SJim Ingham } 55ce553d88SJim Ingham 568b38565bSLang Hames void ThreadPlanCallUserExpression::DidPush() { 578b38565bSLang Hames ThreadPlanCallFunction::DidPush(); 588b38565bSLang Hames if (m_user_expression_sp) 598b38565bSLang Hames m_user_expression_sp->WillStartExecuting(); 608b38565bSLang Hames } 618b38565bSLang Hames 6241d0b20cSDave Lee void ThreadPlanCallUserExpression::DidPop() { 6341d0b20cSDave Lee ThreadPlanCallFunction::DidPop(); 6430fadafeSJim Ingham if (m_user_expression_sp) 6530fadafeSJim Ingham m_user_expression_sp.reset(); 6630fadafeSJim Ingham } 6730fadafeSJim Ingham 68b9c1b51eSKate Stone bool ThreadPlanCallUserExpression::MischiefManaged() { 6930fadafeSJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_STEP)); 7030fadafeSJim Ingham 71b9c1b51eSKate Stone if (IsPlanComplete()) { 7263e5fb76SJonas Devlieghere LLDB_LOGF(log, "ThreadPlanCallFunction(%p): Completed call function plan.", 7330fadafeSJim Ingham static_cast<void *>(this)); 7430fadafeSJim Ingham 75b9c1b51eSKate Stone if (m_manage_materialization && PlanSucceeded() && m_user_expression_sp) { 7630fadafeSJim Ingham lldb::addr_t function_stack_top; 7730fadafeSJim Ingham lldb::addr_t function_stack_bottom; 7830fadafeSJim Ingham lldb::addr_t function_stack_pointer = GetFunctionStackPointer(); 7930fadafeSJim Ingham 8097a14e60SZachary Turner function_stack_bottom = function_stack_pointer - HostInfo::GetPageSize(); 8130fadafeSJim Ingham function_stack_top = function_stack_pointer; 8230fadafeSJim Ingham 83579e70c9SSean Callanan DiagnosticManager diagnostics; 8430fadafeSJim Ingham 8530fadafeSJim Ingham ExecutionContext exe_ctx(GetThread()); 8630fadafeSJim Ingham 87b9c1b51eSKate Stone m_user_expression_sp->FinalizeJITExecution( 88b9c1b51eSKate Stone diagnostics, exe_ctx, m_result_var_sp, function_stack_bottom, 89579e70c9SSean Callanan function_stack_top); 9030fadafeSJim Ingham } 9130fadafeSJim Ingham 9230fadafeSJim Ingham ThreadPlan::MischiefManaged(); 9330fadafeSJim Ingham return true; 94b9c1b51eSKate Stone } else { 9530fadafeSJim Ingham return false; 9630fadafeSJim Ingham } 9730fadafeSJim Ingham } 9830fadafeSJim Ingham 99b9c1b51eSKate Stone StopInfoSP ThreadPlanCallUserExpression::GetRealStopInfo() { 100ce553d88SJim Ingham StopInfoSP stop_info_sp = ThreadPlanCallFunction::GetRealStopInfo(); 10160c4118cSJim Ingham 102b9c1b51eSKate Stone if (stop_info_sp) { 103ce553d88SJim Ingham lldb::addr_t addr = GetStopAddress(); 104e4598dc0SJim Ingham DynamicCheckerFunctions *checkers = m_process.GetDynamicCheckers(); 105ce553d88SJim Ingham StreamString s; 106ce553d88SJim Ingham 107ce553d88SJim Ingham if (checkers && checkers->DoCheckersExplainStop(addr, s)) 108ce553d88SJim Ingham stop_info_sp->SetDescription(s.GetData()); 10960c4118cSJim Ingham } 110ce553d88SJim Ingham 111ce553d88SJim Ingham return stop_info_sp; 112f48169bbSJim Ingham } 1138b38565bSLang Hames 1148b38565bSLang Hames void ThreadPlanCallUserExpression::DoTakedown(bool success) { 1158b38565bSLang Hames ThreadPlanCallFunction::DoTakedown(success); 1168b38565bSLang Hames m_user_expression_sp->DidFinishExecuting(); 1178b38565bSLang Hames } 118