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