1360f53f3c216ee4fb433da0a367168785328a856Jim Ingham//===-- ThreadPlanCallUserExpression.cpp ------------------------------*- C++ -*-===// 2360f53f3c216ee4fb433da0a367168785328a856Jim Ingham// 3360f53f3c216ee4fb433da0a367168785328a856Jim Ingham// The LLVM Compiler Infrastructure 4360f53f3c216ee4fb433da0a367168785328a856Jim Ingham// 5360f53f3c216ee4fb433da0a367168785328a856Jim Ingham// This file is distributed under the University of Illinois Open Source 6360f53f3c216ee4fb433da0a367168785328a856Jim Ingham// License. See LICENSE.TXT for details. 7360f53f3c216ee4fb433da0a367168785328a856Jim Ingham// 8360f53f3c216ee4fb433da0a367168785328a856Jim Ingham//===----------------------------------------------------------------------===// 9360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 10360f53f3c216ee4fb433da0a367168785328a856Jim Ingham#include "lldb/Target/ThreadPlanCallUserExpression.h" 11360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 12360f53f3c216ee4fb433da0a367168785328a856Jim Ingham// C Includes 13360f53f3c216ee4fb433da0a367168785328a856Jim Ingham// C++ Includes 14360f53f3c216ee4fb433da0a367168785328a856Jim Ingham// Other libraries and framework includes 15360f53f3c216ee4fb433da0a367168785328a856Jim Ingham#include "llvm/Support/MachO.h" 16360f53f3c216ee4fb433da0a367168785328a856Jim Ingham// Project includes 17360f53f3c216ee4fb433da0a367168785328a856Jim Ingham#include "lldb/lldb-private-log.h" 18360f53f3c216ee4fb433da0a367168785328a856Jim Ingham#include "lldb/Breakpoint/Breakpoint.h" 19360f53f3c216ee4fb433da0a367168785328a856Jim Ingham#include "lldb/Breakpoint/BreakpointLocation.h" 20360f53f3c216ee4fb433da0a367168785328a856Jim Ingham#include "lldb/Core/Address.h" 21360f53f3c216ee4fb433da0a367168785328a856Jim Ingham#include "lldb/Core/Log.h" 22360f53f3c216ee4fb433da0a367168785328a856Jim Ingham#include "lldb/Core/Stream.h" 23360f53f3c216ee4fb433da0a367168785328a856Jim Ingham#include "lldb/Expression/ClangUserExpression.h" 24360f53f3c216ee4fb433da0a367168785328a856Jim Ingham#include "lldb/Target/LanguageRuntime.h" 25360f53f3c216ee4fb433da0a367168785328a856Jim Ingham#include "lldb/Target/Process.h" 26360f53f3c216ee4fb433da0a367168785328a856Jim Ingham#include "lldb/Target/RegisterContext.h" 27360f53f3c216ee4fb433da0a367168785328a856Jim Ingham#include "lldb/Target/StopInfo.h" 28360f53f3c216ee4fb433da0a367168785328a856Jim Ingham#include "lldb/Target/Target.h" 29360f53f3c216ee4fb433da0a367168785328a856Jim Ingham#include "lldb/Target/Thread.h" 30360f53f3c216ee4fb433da0a367168785328a856Jim Ingham#include "lldb/Target/ThreadPlanRunToAddress.h" 31360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 32360f53f3c216ee4fb433da0a367168785328a856Jim Inghamusing namespace lldb; 33360f53f3c216ee4fb433da0a367168785328a856Jim Inghamusing namespace lldb_private; 34360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 35360f53f3c216ee4fb433da0a367168785328a856Jim Ingham//---------------------------------------------------------------------- 36360f53f3c216ee4fb433da0a367168785328a856Jim Ingham// ThreadPlanCallUserExpression: Plan to call a single function 37360f53f3c216ee4fb433da0a367168785328a856Jim Ingham//---------------------------------------------------------------------- 38360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 39360f53f3c216ee4fb433da0a367168785328a856Jim InghamThreadPlanCallUserExpression::ThreadPlanCallUserExpression (Thread &thread, 40360f53f3c216ee4fb433da0a367168785328a856Jim Ingham Address &function, 41360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::addr_t arg, 42360f53f3c216ee4fb433da0a367168785328a856Jim Ingham bool stop_other_threads, 43b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham bool unwind_on_error, 44b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham bool ignore_breakpoints, 45360f53f3c216ee4fb433da0a367168785328a856Jim Ingham lldb::addr_t *this_arg, 463aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan lldb::addr_t *cmd_arg, 47360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ClangUserExpression::ClangUserExpressionSP &user_expression_sp) : 48b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham ThreadPlanCallFunction (thread, function, ClangASTType(), arg, stop_other_threads, unwind_on_error, ignore_breakpoints, this_arg, cmd_arg), 49360f53f3c216ee4fb433da0a367168785328a856Jim Ingham m_user_expression_sp (user_expression_sp) 50360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{ 51110b55f22f8cda703c4fb6f1c2affb8ccbef215bJim Ingham // User expressions are generally "User generated" so we should set them up to stop when done. 52110b55f22f8cda703c4fb6f1c2affb8ccbef215bJim Ingham SetIsMasterPlan (true); 53110b55f22f8cda703c4fb6f1c2affb8ccbef215bJim Ingham SetOkayToDiscard(false); 54360f53f3c216ee4fb433da0a367168785328a856Jim Ingham} 55360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 56360f53f3c216ee4fb433da0a367168785328a856Jim InghamThreadPlanCallUserExpression::~ThreadPlanCallUserExpression () 57360f53f3c216ee4fb433da0a367168785328a856Jim Ingham{ 58360f53f3c216ee4fb433da0a367168785328a856Jim Ingham} 59360f53f3c216ee4fb433da0a367168785328a856Jim Ingham 60360f53f3c216ee4fb433da0a367168785328a856Jim Inghamvoid 61360f53f3c216ee4fb433da0a367168785328a856Jim InghamThreadPlanCallUserExpression::GetDescription (Stream *s, lldb::DescriptionLevel level) 62ba560cc7d03c9f7d9df81e60201c5ec75cff5232Jim Ingham{ 63360f53f3c216ee4fb433da0a367168785328a856Jim Ingham ThreadPlanCallFunction::GetDescription (s, level); 64360f53f3c216ee4fb433da0a367168785328a856Jim Ingham} 65ba560cc7d03c9f7d9df81e60201c5ec75cff5232Jim Ingham 66ba560cc7d03c9f7d9df81e60201c5ec75cff5232Jim InghamStopInfoSP 67ba560cc7d03c9f7d9df81e60201c5ec75cff5232Jim InghamThreadPlanCallUserExpression::GetRealStopInfo() 68ba560cc7d03c9f7d9df81e60201c5ec75cff5232Jim Ingham{ 69ba560cc7d03c9f7d9df81e60201c5ec75cff5232Jim Ingham StopInfoSP stop_info_sp = ThreadPlanCallFunction::GetRealStopInfo(); 70ba560cc7d03c9f7d9df81e60201c5ec75cff5232Jim Ingham 7104cc48eb5cff32268a822b57f87590c9dc2643f8Jim Ingham if (stop_info_sp) 7204cc48eb5cff32268a822b57f87590c9dc2643f8Jim Ingham { 7304cc48eb5cff32268a822b57f87590c9dc2643f8Jim Ingham lldb::addr_t addr = GetStopAddress(); 7404cc48eb5cff32268a822b57f87590c9dc2643f8Jim Ingham DynamicCheckerFunctions *checkers = m_thread.GetProcess()->GetDynamicCheckers(); 7504cc48eb5cff32268a822b57f87590c9dc2643f8Jim Ingham StreamString s; 7604cc48eb5cff32268a822b57f87590c9dc2643f8Jim Ingham 7704cc48eb5cff32268a822b57f87590c9dc2643f8Jim Ingham if (checkers && checkers->DoCheckersExplainStop(addr, s)) 7804cc48eb5cff32268a822b57f87590c9dc2643f8Jim Ingham stop_info_sp->SetDescription(s.GetData()); 7904cc48eb5cff32268a822b57f87590c9dc2643f8Jim Ingham } 80ba560cc7d03c9f7d9df81e60201c5ec75cff5232Jim Ingham 81ba560cc7d03c9f7d9df81e60201c5ec75cff5232Jim Ingham return stop_info_sp; 82ba560cc7d03c9f7d9df81e60201c5ec75cff5232Jim Ingham} 83