1//===-- ThreadPlanCallUserExpression.cpp ------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Target/ThreadPlanCallUserExpression.h"
11
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15#include "llvm/Support/MachO.h"
16// Project includes
17#include "lldb/lldb-private-log.h"
18#include "lldb/Breakpoint/Breakpoint.h"
19#include "lldb/Breakpoint/BreakpointLocation.h"
20#include "lldb/Core/Address.h"
21#include "lldb/Core/Log.h"
22#include "lldb/Core/Stream.h"
23#include "lldb/Expression/ClangUserExpression.h"
24#include "lldb/Target/LanguageRuntime.h"
25#include "lldb/Target/Process.h"
26#include "lldb/Target/RegisterContext.h"
27#include "lldb/Target/StopInfo.h"
28#include "lldb/Target/Target.h"
29#include "lldb/Target/Thread.h"
30#include "lldb/Target/ThreadPlanRunToAddress.h"
31
32using namespace lldb;
33using namespace lldb_private;
34
35//----------------------------------------------------------------------
36// ThreadPlanCallUserExpression: Plan to call a single function
37//----------------------------------------------------------------------
38
39ThreadPlanCallUserExpression::ThreadPlanCallUserExpression (Thread &thread,
40                                                Address &function,
41                                                lldb::addr_t arg,
42                                                bool stop_other_threads,
43                                                bool unwind_on_error,
44                                                bool ignore_breakpoints,
45                                                lldb::addr_t *this_arg,
46                                                lldb::addr_t *cmd_arg,
47                                                ClangUserExpression::ClangUserExpressionSP &user_expression_sp) :
48    ThreadPlanCallFunction (thread, function, ClangASTType(), arg, stop_other_threads, unwind_on_error, ignore_breakpoints, this_arg, cmd_arg),
49    m_user_expression_sp (user_expression_sp)
50{
51    // User expressions are generally "User generated" so we should set them up to stop when done.
52    SetIsMasterPlan (true);
53    SetOkayToDiscard(false);
54}
55
56ThreadPlanCallUserExpression::~ThreadPlanCallUserExpression ()
57{
58}
59
60void
61ThreadPlanCallUserExpression::GetDescription (Stream *s, lldb::DescriptionLevel level)
62{
63    ThreadPlanCallFunction::GetDescription (s, level);
64}
65
66StopInfoSP
67ThreadPlanCallUserExpression::GetRealStopInfo()
68{
69    StopInfoSP stop_info_sp = ThreadPlanCallFunction::GetRealStopInfo();
70
71    if (stop_info_sp)
72    {
73        lldb::addr_t addr = GetStopAddress();
74        DynamicCheckerFunctions *checkers = m_thread.GetProcess()->GetDynamicCheckers();
75        StreamString s;
76
77        if (checkers && checkers->DoCheckersExplainStop(addr, s))
78            stop_info_sp->SetDescription(s.GetData());
79    }
80
81    return stop_info_sp;
82}
83