1254721Semaste//===-- ThreadPlanCallUserExpression.cpp ------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#include "lldb/Target/ThreadPlanCallUserExpression.h"
11254721Semaste
12254721Semaste// C Includes
13254721Semaste// C++ Includes
14254721Semaste// Other libraries and framework includes
15254721Semaste#include "llvm/Support/MachO.h"
16254721Semaste// Project includes
17254721Semaste#include "lldb/lldb-private-log.h"
18254721Semaste#include "lldb/Breakpoint/Breakpoint.h"
19254721Semaste#include "lldb/Breakpoint/BreakpointLocation.h"
20254721Semaste#include "lldb/Core/Address.h"
21254721Semaste#include "lldb/Core/Log.h"
22254721Semaste#include "lldb/Core/Stream.h"
23254721Semaste#include "lldb/Expression/ClangUserExpression.h"
24254721Semaste#include "lldb/Target/LanguageRuntime.h"
25254721Semaste#include "lldb/Target/Process.h"
26254721Semaste#include "lldb/Target/RegisterContext.h"
27254721Semaste#include "lldb/Target/StopInfo.h"
28254721Semaste#include "lldb/Target/Target.h"
29254721Semaste#include "lldb/Target/Thread.h"
30254721Semaste#include "lldb/Target/ThreadPlanRunToAddress.h"
31254721Semaste
32254721Semasteusing namespace lldb;
33254721Semasteusing namespace lldb_private;
34254721Semaste
35254721Semaste//----------------------------------------------------------------------
36254721Semaste// ThreadPlanCallUserExpression: Plan to call a single function
37254721Semaste//----------------------------------------------------------------------
38254721Semaste
39254721SemasteThreadPlanCallUserExpression::ThreadPlanCallUserExpression (Thread &thread,
40254721Semaste                                                Address &function,
41263367Semaste                                                llvm::ArrayRef<lldb::addr_t> args,
42263367Semaste                                                const EvaluateExpressionOptions &options,
43254721Semaste                                                ClangUserExpression::ClangUserExpressionSP &user_expression_sp) :
44263367Semaste    ThreadPlanCallFunction (thread, function, ClangASTType(), args, options),
45254721Semaste    m_user_expression_sp (user_expression_sp)
46254721Semaste{
47254721Semaste    // User expressions are generally "User generated" so we should set them up to stop when done.
48254721Semaste    SetIsMasterPlan (true);
49254721Semaste    SetOkayToDiscard(false);
50254721Semaste}
51254721Semaste
52254721SemasteThreadPlanCallUserExpression::~ThreadPlanCallUserExpression ()
53254721Semaste{
54254721Semaste}
55254721Semaste
56254721Semastevoid
57254721SemasteThreadPlanCallUserExpression::GetDescription (Stream *s, lldb::DescriptionLevel level)
58254721Semaste{
59254721Semaste    ThreadPlanCallFunction::GetDescription (s, level);
60254721Semaste}
61254721Semaste
62254721SemasteStopInfoSP
63254721SemasteThreadPlanCallUserExpression::GetRealStopInfo()
64254721Semaste{
65254721Semaste    StopInfoSP stop_info_sp = ThreadPlanCallFunction::GetRealStopInfo();
66254721Semaste
67254721Semaste    if (stop_info_sp)
68254721Semaste    {
69254721Semaste        lldb::addr_t addr = GetStopAddress();
70254721Semaste        DynamicCheckerFunctions *checkers = m_thread.GetProcess()->GetDynamicCheckers();
71254721Semaste        StreamString s;
72254721Semaste
73254721Semaste        if (checkers && checkers->DoCheckersExplainStop(addr, s))
74254721Semaste            stop_info_sp->SetDescription(s.GetData());
75254721Semaste    }
76254721Semaste
77254721Semaste    return stop_info_sp;
78254721Semaste}
79