1c156427dSZachary Turner //===-- ThreadPlanCallUserExpression.cpp -------------------------*- C++-*-===// 2f48169bbSJim Ingham // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler 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" 1693749ab3SZachary Turner #include "lldb/Expression/IRDynamicChecks.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 //---------------------------------------------------------------------- 33f48169bbSJim Ingham // ThreadPlanCallUserExpression: Plan to call a single function 34f48169bbSJim Ingham //---------------------------------------------------------------------- 35f48169bbSJim Ingham 36b9c1b51eSKate Stone ThreadPlanCallUserExpression::ThreadPlanCallUserExpression( 37b9c1b51eSKate Stone Thread &thread, Address &function, llvm::ArrayRef<lldb::addr_t> args, 386fbc48bcSJim Ingham const EvaluateExpressionOptions &options, 39b9c1b51eSKate Stone lldb::UserExpressionSP &user_expression_sp) 40b9c1b51eSKate Stone : ThreadPlanCallFunction(thread, function, CompilerType(), args, options), 41b9c1b51eSKate Stone m_user_expression_sp(user_expression_sp) { 4205097246SAdrian Prantl // User expressions are generally "User generated" so we should set them up 4305097246SAdrian Prantl // to stop when done. 44923886ceSJim Ingham SetIsMasterPlan(true); 45923886ceSJim Ingham SetOkayToDiscard(false); 46f48169bbSJim Ingham } 47f48169bbSJim Ingham 48b9c1b51eSKate Stone ThreadPlanCallUserExpression::~ThreadPlanCallUserExpression() {} 49f48169bbSJim Ingham 50b9c1b51eSKate Stone void ThreadPlanCallUserExpression::GetDescription( 51b9c1b51eSKate Stone Stream *s, lldb::DescriptionLevel level) { 5230fadafeSJim Ingham if (level == eDescriptionLevelBrief) 5330fadafeSJim Ingham s->Printf("User Expression thread plan"); 5430fadafeSJim Ingham else 55f48169bbSJim Ingham ThreadPlanCallFunction::GetDescription(s, level); 56ce553d88SJim Ingham } 57ce553d88SJim Ingham 588b38565bSLang Hames void ThreadPlanCallUserExpression::DidPush() { 598b38565bSLang Hames ThreadPlanCallFunction::DidPush(); 608b38565bSLang Hames if (m_user_expression_sp) 618b38565bSLang Hames m_user_expression_sp->WillStartExecuting(); 628b38565bSLang Hames } 638b38565bSLang Hames 64b9c1b51eSKate Stone void ThreadPlanCallUserExpression::WillPop() { 6530fadafeSJim Ingham ThreadPlanCallFunction::WillPop(); 6630fadafeSJim Ingham if (m_user_expression_sp) 6730fadafeSJim Ingham m_user_expression_sp.reset(); 6830fadafeSJim Ingham } 6930fadafeSJim Ingham 70b9c1b51eSKate Stone bool ThreadPlanCallUserExpression::MischiefManaged() { 7130fadafeSJim Ingham Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_STEP)); 7230fadafeSJim Ingham 73b9c1b51eSKate Stone if (IsPlanComplete()) { 7430fadafeSJim Ingham if (log) 7530fadafeSJim Ingham log->Printf("ThreadPlanCallFunction(%p): Completed call function plan.", 7630fadafeSJim Ingham static_cast<void *>(this)); 7730fadafeSJim Ingham 78b9c1b51eSKate Stone if (m_manage_materialization && PlanSucceeded() && m_user_expression_sp) { 7930fadafeSJim Ingham lldb::addr_t function_stack_top; 8030fadafeSJim Ingham lldb::addr_t function_stack_bottom; 8130fadafeSJim Ingham lldb::addr_t function_stack_pointer = GetFunctionStackPointer(); 8230fadafeSJim Ingham 8397a14e60SZachary Turner function_stack_bottom = function_stack_pointer - HostInfo::GetPageSize(); 8430fadafeSJim Ingham function_stack_top = function_stack_pointer; 8530fadafeSJim Ingham 86579e70c9SSean Callanan DiagnosticManager diagnostics; 8730fadafeSJim Ingham 8830fadafeSJim Ingham ExecutionContext exe_ctx(GetThread()); 8930fadafeSJim Ingham 90b9c1b51eSKate Stone m_user_expression_sp->FinalizeJITExecution( 91b9c1b51eSKate Stone diagnostics, exe_ctx, m_result_var_sp, function_stack_bottom, 92579e70c9SSean Callanan function_stack_top); 9330fadafeSJim Ingham } 9430fadafeSJim Ingham 9530fadafeSJim Ingham ThreadPlan::MischiefManaged(); 9630fadafeSJim Ingham return true; 97b9c1b51eSKate Stone } else { 9830fadafeSJim Ingham return false; 9930fadafeSJim Ingham } 10030fadafeSJim Ingham } 10130fadafeSJim Ingham 102b9c1b51eSKate Stone StopInfoSP ThreadPlanCallUserExpression::GetRealStopInfo() { 103ce553d88SJim Ingham StopInfoSP stop_info_sp = ThreadPlanCallFunction::GetRealStopInfo(); 10460c4118cSJim Ingham 105b9c1b51eSKate Stone if (stop_info_sp) { 106ce553d88SJim Ingham lldb::addr_t addr = GetStopAddress(); 107b9c1b51eSKate Stone DynamicCheckerFunctions *checkers = 108b9c1b51eSKate Stone m_thread.GetProcess()->GetDynamicCheckers(); 109ce553d88SJim Ingham StreamString s; 110ce553d88SJim Ingham 111ce553d88SJim Ingham if (checkers && checkers->DoCheckersExplainStop(addr, s)) 112ce553d88SJim Ingham stop_info_sp->SetDescription(s.GetData()); 11360c4118cSJim Ingham } 114ce553d88SJim Ingham 115ce553d88SJim Ingham return stop_info_sp; 116f48169bbSJim Ingham } 1178b38565bSLang Hames 1188b38565bSLang Hames void ThreadPlanCallUserExpression::DoTakedown(bool success) { 1198b38565bSLang Hames ThreadPlanCallFunction::DoTakedown(success); 1208b38565bSLang Hames m_user_expression_sp->DidFinishExecuting(); 1218b38565bSLang Hames } 122