ThreadPlanCallFunction.h revision 2f085c6ca2895663687dca704589478ff040b849
1579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata//===-- ThreadPlanCallFunction.h --------------------------------*- C++ -*-===//
2579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata//
3579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata//                     The LLVM Compiler Infrastructure
4579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata//
5579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata// This file is distributed under the University of Illinois Open Source
6579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata// License. See LICENSE.TXT for details.
7579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata//
8b370df27c76fd875f3312be487868528121a4838Enrico Granata//===----------------------------------------------------------------------===//
9b370df27c76fd875f3312be487868528121a4838Enrico Granata
10b370df27c76fd875f3312be487868528121a4838Enrico Granata#ifndef liblldb_ThreadPlanCallFunction_h_
110d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata#define liblldb_ThreadPlanCallFunction_h_
120d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata
1383410e5e9e040ea5c6691f933aa9a6c4dcea4d8bEnrico Granata// C Includes
140d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata// C++ Includes
15b370df27c76fd875f3312be487868528121a4838Enrico Granata// Other libraries and framework includes
160d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata// Project includes
17b370df27c76fd875f3312be487868528121a4838Enrico Granata#include "lldb/lldb-private.h"
18b370df27c76fd875f3312be487868528121a4838Enrico Granata#include "lldb/Target/Thread.h"
19b370df27c76fd875f3312be487868528121a4838Enrico Granata#include "lldb/Target/ThreadPlan.h"
20b370df27c76fd875f3312be487868528121a4838Enrico Granata
21b370df27c76fd875f3312be487868528121a4838Enrico Granatanamespace lldb_private {
22b370df27c76fd875f3312be487868528121a4838Enrico Granata
23b370df27c76fd875f3312be487868528121a4838Enrico Granataclass ThreadPlanCallFunction : public ThreadPlan
24b370df27c76fd875f3312be487868528121a4838Enrico Granata{
25b370df27c76fd875f3312be487868528121a4838Enrico Granatapublic:
26b370df27c76fd875f3312be487868528121a4838Enrico Granata    ThreadPlanCallFunction (Thread &thread,
27f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata                            Address &function,
28b370df27c76fd875f3312be487868528121a4838Enrico Granata                            lldb::addr_t arg,
29f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata                            bool stop_other_threads,
300d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata                            bool discard_on_error = true,
31b370df27c76fd875f3312be487868528121a4838Enrico Granata                            lldb::addr_t *this_arg = 0,
32f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata                            lldb::addr_t *cmd_arg = 0);
33f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata
34f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    ThreadPlanCallFunction (Thread &thread,
35f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata                            Address &function,
36f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata                            bool stop_other_threads,
37f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata                            bool discard_on_error,
38b370df27c76fd875f3312be487868528121a4838Enrico Granata                            lldb::addr_t *arg1_ptr = NULL,
39b370df27c76fd875f3312be487868528121a4838Enrico Granata                            lldb::addr_t *arg2_ptr = NULL,
40b370df27c76fd875f3312be487868528121a4838Enrico Granata                            lldb::addr_t *arg3_ptr = NULL,
410d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata                            lldb::addr_t *arg4_ptr = NULL,
42b370df27c76fd875f3312be487868528121a4838Enrico Granata                            lldb::addr_t *arg5_ptr = NULL,
43b370df27c76fd875f3312be487868528121a4838Enrico Granata                            lldb::addr_t *arg6_ptr = NULL);
44b370df27c76fd875f3312be487868528121a4838Enrico Granata
45b370df27c76fd875f3312be487868528121a4838Enrico Granata    virtual
46b370df27c76fd875f3312be487868528121a4838Enrico Granata    ~ThreadPlanCallFunction ();
47b370df27c76fd875f3312be487868528121a4838Enrico Granata
480d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata    virtual void
49f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    GetDescription (Stream *s, lldb::DescriptionLevel level);
50b370df27c76fd875f3312be487868528121a4838Enrico Granata
51b370df27c76fd875f3312be487868528121a4838Enrico Granata    virtual bool
52b370df27c76fd875f3312be487868528121a4838Enrico Granata    ValidatePlan (Stream *error);
53b370df27c76fd875f3312be487868528121a4838Enrico Granata
54b370df27c76fd875f3312be487868528121a4838Enrico Granata    virtual bool
550d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata    PlanExplainsStop ();
56b370df27c76fd875f3312be487868528121a4838Enrico Granata
57b370df27c76fd875f3312be487868528121a4838Enrico Granata    virtual bool
58f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    ShouldStop (Event *event_ptr);
59b370df27c76fd875f3312be487868528121a4838Enrico Granata
60b370df27c76fd875f3312be487868528121a4838Enrico Granata    virtual bool
61b370df27c76fd875f3312be487868528121a4838Enrico Granata    StopOthers ();
62b370df27c76fd875f3312be487868528121a4838Enrico Granata
63b370df27c76fd875f3312be487868528121a4838Enrico Granata    virtual void
64f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    SetStopOthers (bool new_value);
65b370df27c76fd875f3312be487868528121a4838Enrico Granata
66f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    virtual lldb::StateType
670d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata    GetPlanRunState ();
68b370df27c76fd875f3312be487868528121a4838Enrico Granata
69f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    virtual void
70f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    DidPush ();
71b370df27c76fd875f3312be487868528121a4838Enrico Granata
72b370df27c76fd875f3312be487868528121a4838Enrico Granata    virtual bool
730d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata    WillStop ();
74b370df27c76fd875f3312be487868528121a4838Enrico Granata
75b370df27c76fd875f3312be487868528121a4838Enrico Granata    virtual bool
76b370df27c76fd875f3312be487868528121a4838Enrico Granata    MischiefManaged ();
770d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata
78b370df27c76fd875f3312be487868528121a4838Enrico Granata    virtual bool
79b370df27c76fd875f3312be487868528121a4838Enrico Granata    IsMasterPlan()
80b370df27c76fd875f3312be487868528121a4838Enrico Granata    {
81579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata        return true;
82579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata    }
83579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata
84579a296e7566b7b6d24b51e383bca1fe1e62086fEnrico Granata    // To get the return value from a function call you must create a
85b370df27c76fd875f3312be487868528121a4838Enrico Granata    // lldb::ValueSP that contains a valid clang type in its context and call
86b370df27c76fd875f3312be487868528121a4838Enrico Granata    // RequestReturnValue. The ValueSP will be stored and when the function is
87b370df27c76fd875f3312be487868528121a4838Enrico Granata    // done executing, the object will check if there is a requested return
88f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    // value. If there is, the return value will be retrieved using the
89b370df27c76fd875f3312be487868528121a4838Enrico Granata    // ABI::GetReturnValue() for the ABI in the process. Then after the thread
90f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    // plan is complete, you can call "GetReturnValue()" to retrieve the value
910d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata    // that was extracted.
92b370df27c76fd875f3312be487868528121a4838Enrico Granata
93f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    const lldb::ValueSP &
94f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    GetReturnValue ()
95f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    {
96f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata        return m_return_value_sp;
97f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    }
98f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata
99b370df27c76fd875f3312be487868528121a4838Enrico Granata    void
100b370df27c76fd875f3312be487868528121a4838Enrico Granata    RequestReturnValue (lldb::ValueSP &return_value_sp)
101b370df27c76fd875f3312be487868528121a4838Enrico Granata    {
1020d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata        m_return_value_sp = return_value_sp;
103b370df27c76fd875f3312be487868528121a4838Enrico Granata    }
104b370df27c76fd875f3312be487868528121a4838Enrico Granata
105b370df27c76fd875f3312be487868528121a4838Enrico Granata    // Return the stack pointer that the function received
106b370df27c76fd875f3312be487868528121a4838Enrico Granata    // on entry.  Any stack address below this should be
1070d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata    // considered invalid after the function has been
108f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    // cleaned up.
109b370df27c76fd875f3312be487868528121a4838Enrico Granata    lldb::addr_t
110b370df27c76fd875f3312be487868528121a4838Enrico Granata    GetFunctionStackPointer()
1110d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata    {
112b370df27c76fd875f3312be487868528121a4838Enrico Granata        return m_function_sp;
113b370df27c76fd875f3312be487868528121a4838Enrico Granata    }
114f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata
115b370df27c76fd875f3312be487868528121a4838Enrico Granata    // Classes that derive from ClangFunction, and implement
116b370df27c76fd875f3312be487868528121a4838Enrico Granata    // their own WillPop methods should call this so that the
117b370df27c76fd875f3312be487868528121a4838Enrico Granata    // thread state gets restored if the plan gets discarded.
118b370df27c76fd875f3312be487868528121a4838Enrico Granata    virtual void
119b370df27c76fd875f3312be487868528121a4838Enrico Granata    WillPop ();
120b370df27c76fd875f3312be487868528121a4838Enrico Granata
121f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granataprotected:
122b370df27c76fd875f3312be487868528121a4838Enrico Granata    void ReportRegisterState (const char *message);
123b370df27c76fd875f3312be487868528121a4838Enrico Granataprivate:
124b370df27c76fd875f3312be487868528121a4838Enrico Granata    void
125b370df27c76fd875f3312be487868528121a4838Enrico Granata    DoTakedown ();
126b370df27c76fd875f3312be487868528121a4838Enrico Granata
127b370df27c76fd875f3312be487868528121a4838Enrico Granata    void
128b370df27c76fd875f3312be487868528121a4838Enrico Granata    SetBreakpoints ();
129f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata
130b370df27c76fd875f3312be487868528121a4838Enrico Granata    void
131f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    ClearBreakpoints ();
1320d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata
133b370df27c76fd875f3312be487868528121a4838Enrico Granata    bool
134f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    BreakpointsExplainStop ();
135f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata
136f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    bool                                            m_valid;
137f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    bool                                            m_stop_other_threads;
138f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    Address                                         m_function_addr;
139f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    Address                                         m_start_addr;
140b370df27c76fd875f3312be487868528121a4838Enrico Granata    lldb::addr_t                                    m_function_sp;
141b370df27c76fd875f3312be487868528121a4838Enrico Granata    Process                                        &m_process;
142b370df27c76fd875f3312be487868528121a4838Enrico Granata    Thread                                         &m_thread;
1430d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata    Thread::RegisterCheckpoint                      m_register_backup;
144b370df27c76fd875f3312be487868528121a4838Enrico Granata    lldb::ThreadPlanSP                              m_subplan_sp;
145b370df27c76fd875f3312be487868528121a4838Enrico Granata    LanguageRuntime                                *m_cxx_language_runtime;
146b370df27c76fd875f3312be487868528121a4838Enrico Granata    LanguageRuntime                                *m_objc_language_runtime;
147b370df27c76fd875f3312be487868528121a4838Enrico Granata    Thread::ThreadStateCheckpoint                   m_stored_thread_state;
1480d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata    lldb::ValueSP                                   m_return_value_sp;  // If this contains a valid pointer, use the ABI to extract values when complete
149f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata    bool                                            m_takedown_done;    // We want to ensure we only do the takedown once.  This ensures that.
150b370df27c76fd875f3312be487868528121a4838Enrico Granata
151b370df27c76fd875f3312be487868528121a4838Enrico Granata    DISALLOW_COPY_AND_ASSIGN (ThreadPlanCallFunction);
1520d235d5864e996d95f485df1a0df406126e1ccdeEnrico Granata};
153b370df27c76fd875f3312be487868528121a4838Enrico Granata
154b370df27c76fd875f3312be487868528121a4838Enrico Granata} // namespace lldb_private
155f2a84671ff78bee1f82b60698f3ee9791585f8acEnrico Granata
156b370df27c76fd875f3312be487868528121a4838Enrico Granata#endif  // liblldb_ThreadPlanCallFunction_h_
157b370df27c76fd875f3312be487868528121a4838Enrico Granata