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