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                                                llvm::ArrayRef<lldb::addr_t> args,
42                                                const EvaluateExpressionOptions &options,
43                                                ClangUserExpression::ClangUserExpressionSP &user_expression_sp) :
44    ThreadPlanCallFunction (thread, function, ClangASTType(), args, options),
45    m_user_expression_sp (user_expression_sp)
46{
47    // User expressions are generally "User generated" so we should set them up to stop when done.
48    SetIsMasterPlan (true);
49    SetOkayToDiscard(false);
50}
51
52ThreadPlanCallUserExpression::~ThreadPlanCallUserExpression ()
53{
54}
55
56void
57ThreadPlanCallUserExpression::GetDescription (Stream *s, lldb::DescriptionLevel level)
58{
59    ThreadPlanCallFunction::GetDescription (s, level);
60}
61
62StopInfoSP
63ThreadPlanCallUserExpression::GetRealStopInfo()
64{
65    StopInfoSP stop_info_sp = ThreadPlanCallFunction::GetRealStopInfo();
66
67    if (stop_info_sp)
68    {
69        lldb::addr_t addr = GetStopAddress();
70        DynamicCheckerFunctions *checkers = m_thread.GetProcess()->GetDynamicCheckers();
71        StreamString s;
72
73        if (checkers && checkers->DoCheckersExplainStop(addr, s))
74            stop_info_sp->SetDescription(s.GetData());
75    }
76
77    return stop_info_sp;
78}
79