Thread.h revision b4d7fc0c466d446876e5f2d701f0e574dd0be8e7
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Thread.h ------------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_Thread_h_ 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_Thread_h_ 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Mutex.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/UserID.h" 1620594b1b003f63ed34ebafeec37634ee44552339Jim Ingham#include "lldb/Core/UserSettingsController.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ExecutionContextScope.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrameList.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define LLDB_THREAD_MAX_STOP_EXC_DATA 8 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private { 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2420594b1b003f63ed34ebafeec37634ee44552339Jim Inghamclass ThreadInstanceSettings : public InstanceSettings 2520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham{ 2620594b1b003f63ed34ebafeec37634ee44552339Jim Inghampublic: 2720594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 28334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton ThreadInstanceSettings (const lldb::UserSettingsControllerSP &owner_sp, bool live_instance = true, const char *name = NULL); 2920594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 3020594b1b003f63ed34ebafeec37634ee44552339Jim Ingham ThreadInstanceSettings (const ThreadInstanceSettings &rhs); 3120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 3220594b1b003f63ed34ebafeec37634ee44552339Jim Ingham virtual 3320594b1b003f63ed34ebafeec37634ee44552339Jim Ingham ~ThreadInstanceSettings (); 3420594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 3520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham ThreadInstanceSettings& 3620594b1b003f63ed34ebafeec37634ee44552339Jim Ingham operator= (const ThreadInstanceSettings &rhs); 3720594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 3820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 3920594b1b003f63ed34ebafeec37634ee44552339Jim Ingham void 4020594b1b003f63ed34ebafeec37634ee44552339Jim Ingham UpdateInstanceSettingsVariable (const ConstString &var_name, 4120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham const char *index_value, 4220594b1b003f63ed34ebafeec37634ee44552339Jim Ingham const char *value, 4320594b1b003f63ed34ebafeec37634ee44552339Jim Ingham const ConstString &instance_name, 4420594b1b003f63ed34ebafeec37634ee44552339Jim Ingham const SettingEntry &entry, 45b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton VarSetOperationType op, 4620594b1b003f63ed34ebafeec37634ee44552339Jim Ingham Error &err, 4720594b1b003f63ed34ebafeec37634ee44552339Jim Ingham bool pending); 4820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 49bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice bool 5020594b1b003f63ed34ebafeec37634ee44552339Jim Ingham GetInstanceSettingsValue (const SettingEntry &entry, 5120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham const ConstString &var_name, 525bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice StringList &value, 53bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice Error *err); 5420594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 5520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham RegularExpression * 5620594b1b003f63ed34ebafeec37634ee44552339Jim Ingham GetSymbolsToAvoidRegexp() 5720594b1b003f63ed34ebafeec37634ee44552339Jim Ingham { 5820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham return m_avoid_regexp_ap.get(); 5920594b1b003f63ed34ebafeec37634ee44552339Jim Ingham } 6020594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 6120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham static const ConstString & 6220594b1b003f63ed34ebafeec37634ee44552339Jim Ingham StepAvoidRegexpVarName (); 63745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham 64745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham bool 65745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham GetTraceEnabledState() 66745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham { 67745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham return m_trace_enabled; 68745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham } 69745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham static const ConstString & 70745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham GetTraceThreadVarName (); 7120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 7220594b1b003f63ed34ebafeec37634ee44552339Jim Inghamprotected: 7320594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 7420594b1b003f63ed34ebafeec37634ee44552339Jim Ingham void 7520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings, 7620594b1b003f63ed34ebafeec37634ee44552339Jim Ingham bool pending); 7720594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 780021c97fbd17e38113d2e76b93c94ee05213ee45Johnny Chen const ConstString 7920594b1b003f63ed34ebafeec37634ee44552339Jim Ingham CreateInstanceName (); 8020594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 8120594b1b003f63ed34ebafeec37634ee44552339Jim Inghamprivate: 8220594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 8320594b1b003f63ed34ebafeec37634ee44552339Jim Ingham std::auto_ptr<RegularExpression> m_avoid_regexp_ap; 84745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham bool m_trace_enabled; 8520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham}; 8620594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Thread : 8813d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton public std::tr1::enable_shared_from_this<Thread>, 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public UserID, 9020594b1b003f63ed34ebafeec37634ee44552339Jim Ingham public ExecutionContextScope, 9120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham public ThreadInstanceSettings 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95990de7bb41d3afec6b789155408ff322187d8682Greg Clayton class SettingsController : public UserSettingsController 9620594b1b003f63ed34ebafeec37634ee44552339Jim Ingham { 9720594b1b003f63ed34ebafeec37634ee44552339Jim Ingham public: 9820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 99990de7bb41d3afec6b789155408ff322187d8682Greg Clayton SettingsController (); 10020594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 10120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham virtual 102990de7bb41d3afec6b789155408ff322187d8682Greg Clayton ~SettingsController (); 103d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton 10420594b1b003f63ed34ebafeec37634ee44552339Jim Ingham static SettingEntry global_settings_table[]; 10520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham static SettingEntry instance_settings_table[]; 10620594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 10720594b1b003f63ed34ebafeec37634ee44552339Jim Ingham protected: 10820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 10920594b1b003f63ed34ebafeec37634ee44552339Jim Ingham lldb::InstanceSettingsSP 110d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton CreateInstanceSettings (const char *instance_name); 11120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 11220594b1b003f63ed34ebafeec37634ee44552339Jim Ingham private: 11320594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 11420594b1b003f63ed34ebafeec37634ee44552339Jim Ingham // Class-wide settings. 11520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 116990de7bb41d3afec6b789155408ff322187d8682Greg Clayton DISALLOW_COPY_AND_ASSIGN (SettingsController); 11720594b1b003f63ed34ebafeec37634ee44552339Jim Ingham }; 11820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 11915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham // TODO: You shouldn't just checkpoint the register state alone, so this should get 12015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham // moved to protected. To do that ThreadStateCheckpoint needs to be returned as a token... 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner class RegisterCheckpoint 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RegisterCheckpoint() : 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stack_id (), 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data_sp () 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RegisterCheckpoint (const StackID &stack_id) : 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stack_id (stack_id), 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_data_sp () 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~RegisterCheckpoint() 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham const RegisterCheckpoint& 14215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham operator= (const RegisterCheckpoint &rhs) 14315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham { 14415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham if (this != &rhs) 14515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham { 14615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham this->m_stack_id = rhs.m_stack_id; 14715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham this->m_data_sp = rhs.m_data_sp; 14815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham } 14915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham return *this; 15015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham } 15115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 15215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham RegisterCheckpoint (const RegisterCheckpoint &rhs) : 15315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham m_stack_id (rhs.m_stack_id), 15415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham m_data_sp (rhs.m_data_sp) 15515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham { 15615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham } 15715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const StackID & 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetStackID() 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_stack_id; 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetStackID (const StackID &stack_id) 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_stack_id = stack_id; 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::DataBufferSP & 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetData() 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_data_sp; 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const lldb::DataBufferSP & 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetData() const 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_data_sp; 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner protected: 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StackID m_stack_id; 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::DataBufferSP m_data_sp; 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham struct ThreadStateCheckpoint 18815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham { 18915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham uint32_t orig_stop_id; // Dunno if I need this yet but it is an interesting bit of data. 19015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham lldb::StopInfoSP stop_info_sp; // You have to restore the stop info or you might continue with the wrong signals. 19115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham RegisterCheckpoint register_backup; // You need to restore the registers, of course... 19215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham }; 19315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 1941ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice void 1951ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice UpdateInstanceName (); 1961ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice 197990de7bb41d3afec6b789155408ff322187d8682Greg Clayton static void 1982a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice SettingsInitialize (); 199990de7bb41d3afec6b789155408ff322187d8682Greg Clayton 200990de7bb41d3afec6b789155408ff322187d8682Greg Clayton static void 2012a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice SettingsTerminate (); 202990de7bb41d3afec6b789155408ff322187d8682Greg Clayton 203990de7bb41d3afec6b789155408ff322187d8682Greg Clayton static lldb::UserSettingsControllerSP & 204990de7bb41d3afec6b789155408ff322187d8682Greg Clayton GetSettingsController (); 20520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Thread (Process &process, lldb::tid_t tid); 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ~Thread(); 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process & 21037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton GetProcess() 21137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton { 21237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton return m_process; 21337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton } 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Process & 21637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton GetProcess() const 21737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton { 21837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton return m_process; 21937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton } 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int 222123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton GetResumeSignal () const 223123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton { 224123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton return m_resume_signal; 225123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton } 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 228123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton SetResumeSignal (int signal) 229123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton { 230123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton m_resume_signal = signal; 231123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton } 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::StateType 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetState() const; 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetState (lldb::StateType state); 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::StateType 240123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton GetResumeState () const 241123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton { 242123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton return m_resume_state; 243123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton } 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 246123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton SetResumeState (lldb::StateType state) 247123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton { 248123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton m_resume_state = state; 249123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton } 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This function is called on all the threads before "WillResume" in case 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // a thread needs to change its state before the ThreadList polls all the 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // threads to figure out which ones actually will get to run and how. 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetupForResume (); 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Override this to do platform specific tasks before resume, but always 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // call the Thread::WillResume at the end of your work. 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WillResume (lldb::StateType resume_state); 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This clears generic thread state after a resume. If you subclass this, 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // be sure to call it. 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidResume (); 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner RefreshStateAfterStop() = 0; 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WillStop (); 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ShouldStop (Event *event_ptr); 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 277b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton Vote 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ShouldReportStop (Event *event_ptr); 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 280b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton Vote 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ShouldReportRun (Event *event_ptr); 2823c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham 283649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham // Return whether this thread matches the specification in ThreadSpec. This is a virtual 284649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham // method because at some point we may extend the thread spec with a platform specific 285649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham // dictionary of attributes, which then only the platform specific Thread implementation 286649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham // would know how to match. For now, this just calls through to the ThreadSpec's 287649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham // ThreadPassesBasicTests method. 2883c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham virtual bool 2893c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham MatchesSpec (const ThreadSpec *spec); 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2916297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham lldb::StopInfoSP 292643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton GetStopInfo (); 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham // This sets the stop reason to a "blank" stop reason, so you can call functions on the thread 29515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham // without having the called function run with whatever stop reason you stopped with. 29615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham void 29715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham SetStopInfoToNothing(); 29815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadStoppedForAReason (); 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3027826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice static const char * 3037826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice RunModeAsCString (lldb::RunMode mode); 3047826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 3057826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice static const char * 3067826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice StopReasonAsCString (lldb::StopReason reason); 3077826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual const char * 30937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton GetInfo () 31037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton { 31137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton return NULL; 31237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton } 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual const char * 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetName () 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual const char * 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetQueueName () 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual uint32_t 327fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham GetStackFrameCount() 328fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham { 329fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham return GetStackFrameList().GetNumFrames(); 330fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham } 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual lldb::StackFrameSP 333fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham GetStackFrameAtIndex (uint32_t idx) 334fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham { 335fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham return GetStackFrameList().GetFrameAtIndex(idx); 336fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham } 33708d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton 33808d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton virtual lldb::StackFrameSP 33908d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton GetFrameWithConcreteFrameIndex (uint32_t unwind_idx); 3405c4b1607e8783a3d3f1f28fa66fcaa89ac246bd1Jim Ingham 3415c4b1607e8783a3d3f1f28fa66fcaa89ac246bd1Jim Ingham virtual lldb::StackFrameSP 342b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton GetFrameWithStackID (const StackID &stack_id) 343fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham { 344fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham return GetStackFrameList().GetFrameWithStackID (stack_id); 345fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham } 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 347c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton uint32_t 348fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham GetSelectedFrameIndex () 349fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham { 350fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham return GetStackFrameList().GetSelectedFrameIndex(); 351fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham } 352c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::StackFrameSP 354fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham GetSelectedFrame () 355fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham { 356fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham return GetStackFrameAtIndex (GetStackFrameList().GetSelectedFrameIndex()); 357fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham } 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t 360fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham SetSelectedFrame (lldb_private::StackFrame *frame) 361fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham { 362fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham return GetStackFrameList().SetSelectedFrame(frame); 363fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham } 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 366fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham SetSelectedFrameByIndex (uint32_t frame_idx) 367fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham { 368fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham GetStackFrameList().SetSelectedFrameByIndex(frame_idx); 369fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham } 370fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham 371fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham void 372fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham SetDefaultFileAndLineToSelectedFrame() 373fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham { 374fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham GetStackFrameList().SetDefaultFileAndLineToSelectedFrame(); 375fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham } 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37708d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton virtual lldb::RegisterContextSP 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetRegisterContext () = 0; 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38008d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton virtual lldb::RegisterContextSP 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CreateRegisterContextForFrame (StackFrame *frame) = 0; 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 384782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton ClearStackFrames (); 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 387a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton DumpUsingSettingsFormat (Stream &strm, uint32_t frame_idx); 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Thread Plan Providers: 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This section provides the basic thread plans that the Process control 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // machinery uses to run the target. ThreadPlan.h provides more details on 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // how this mechanism works. 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The thread provides accessors to a set of plans that perform basic operations. 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The idea is that particular Platform plugins can override these methods to 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // provide the implementation of these basic operations appropriate to their 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // environment. 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Queues the base plan for a thread. 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The version returned by Process does some things that are useful, 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// like handle breakpoints and signals, so if you return a plugin specific 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// one you probably want to call through to the Process one for anything 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// your plugin doesn't explicitly handle. 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the newly queued thread plan, or NULL if the plan could not be queued. 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueFundamentalPlan (bool abort_other_plans); 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Queues the plan used to step over a breakpoint at the current PC of \a thread. 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The default version returned by Process handles trap based breakpoints, and 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// will disable the breakpoint, single step over it, then re-enable it. 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the newly queued thread plan, or NULL if the plan could not be queued. 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForStepOverBreakpointPlan (bool abort_other_plans); 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Queues the plan used to step one instruction from the current PC of \a thread. 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] step_over 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we step over calls to functions, false if we step in. 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] stop_other_threads 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we will stop other threads while we single step this one. 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the newly queued thread plan, or NULL if the plan could not be queued. 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForStepSingleInstruction (bool step_over, 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool abort_other_plans, 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads); 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Queues the plan used to step through an address range, stepping into or over 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// function calls depending on the value of StepType. 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] type 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Type of step to do, only eStepTypeInto and eStepTypeOver are supported by this plan. 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] range 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The address range to step through. 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] addr_context 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// When dealing with stepping through inlined functions the current PC is not enough information to know 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// what "step" means. For instance a series of nested inline functions might start at the same address. 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The \a addr_context provides the current symbol context the step 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// is supposed to be out of. 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Currently unused. 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] stop_other_threads 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we will stop other threads while we single step this one. 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the newly queued thread plan, or NULL if the plan could not be queued. 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForStepRange (bool abort_other_plans, 482b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton StepType type, 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const AddressRange &range, 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const SymbolContext &addr_context, 4858f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton lldb::RunMode stop_other_threads, 4868f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton bool avoid_code_without_debug_info); 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Queue the plan used to step out of the function at the current PC of 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \a thread. 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] addr_context 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// When dealing with stepping through inlined functions the current PC is not enough information to know 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// what "step" means. For instance a series of nested inline functions might start at the same address. 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The \a addr_context provides the current symbol context the step 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// is supposed to be out of. 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // FIXME: Currently unused. 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] first_insn 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if this is the first instruction of a function. 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] stop_other_threads 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we will stop other threads while we single step this one. 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] stop_vote 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] run_vote 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// See standard meanings for the stop & run votes in ThreadPlan.h. 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the newly queued thread plan, or NULL if the plan could not be queued. 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForStepOut (bool abort_other_plans, 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext *addr_context, 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool first_insn, 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads, 521b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton Vote stop_vote, // = eVoteYes, 522b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton Vote run_vote, // = eVoteNoOpinion); 5231ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton uint32_t frame_idx); 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Gets the plan used to step through the code that steps from a function 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// call site at the current PC into the actual function call. 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] stop_other_threads 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we will stop other threads while we single step this one. 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the newly queued thread plan, or NULL if the plan could not be queued. 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForStepThrough (bool abort_other_plans, 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads); 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Gets the plan used to continue from the current PC. 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// This is a simple plan, mostly useful as a backstop when you are continuing 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// for some particular purpose. 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] target_addr 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The address to which we're running. 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] stop_other_threads 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we will stop other threads while we single step this one. 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the newly queued thread plan, or NULL if the plan could not be queued. 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForRunToAddress (bool abort_other_plans, 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address &target_addr, 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads); 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForStepUntil (bool abort_other_plans, 5681ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton lldb::addr_t *address_list, 5691ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton size_t num_addresses, 5701ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton bool stop_others, 5711ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton uint32_t frame_idx); 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ThreadPlan * 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlanForCallFunction (bool abort_other_plans, 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address& function, 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t arg, 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads, 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool discard_on_error = false); 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Thread Plan accessors: 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Gets the plan which will execute next on the plan stack. 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the next executed plan. 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadPlan * 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetCurrentPlan (); 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 593f9f40c20b210eea72ab042c63178ca000f005ed9Jim Inghamprivate: 594f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham bool 595f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham PlanIsBasePlan (ThreadPlan *plan_ptr) 596f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham { 597f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham if (m_plan_stack.size() == 0) 598f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return false; 599f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham return m_plan_stack[0].get() == plan_ptr; 600f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham } 601f9f40c20b210eea72ab042c63178ca000f005ed9Jim Inghampublic: 602f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 6041586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham /// Gets the outer-most plan that was popped off the plan stack in the 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// most recent stop. Useful for printing the stop reason accurately. 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the last completed plan. 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::ThreadPlanSP 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetCompletedPlan (); 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 6141586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham /// Gets the outer-most return value from the completed plans 6151586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham /// 6161586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham /// @return 6171586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham /// A ValueObjectSP, either empty if there is no return value, 6181586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham /// or containing the return value. 6191586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham //------------------------------------------------------------------ 6201586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham lldb::ValueObjectSP 6211586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham GetReturnValueObject (); 6221586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham 6231586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham //------------------------------------------------------------------ 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Checks whether the given plan is in the completed plans for this 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// stop. 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] plan 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Pointer to the plan you're checking. 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Returns true if the input plan is in the completed plan stack, 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// false otherwise. 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner IsThreadPlanDone (ThreadPlan *plan); 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Checks whether the given plan is in the discarded plans for this 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// stop. 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] plan 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Pointer to the plan you're checking. 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Returns true if the input plan is in the discarded plan stack, 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// false otherwise. 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WasThreadPlanDiscarded (ThreadPlan *plan); 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Queues a generic thread plan. 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] plan_sp 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The plan to queue. 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] abort_other_plans 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// \b true if we discard the currently queued plans and replace them with this one. 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Otherwise this plan will go on the end of the plan stack. 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @return 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// A pointer to the last completed plan. 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner QueueThreadPlan (lldb::ThreadPlanSP &plan_sp, bool abort_other_plans); 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Discards the plans queued on the plan stack of the current thread. This is 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// arbitrated by the "Master" ThreadPlans, using the "OkayToDiscard" call. 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // But if \a force is true, all thread plans are discarded. 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DiscardThreadPlans (bool force); 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 677ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham /// Discards the plans queued on the plan stack of the current thread up to and 678ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham /// including up_to_plan_sp. 679ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham // 680ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham // @param[in] up_to_plan_sp 681ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham // Discard all plans up to and including this one. 682ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham //------------------------------------------------------------------ 683ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham void 684ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham DiscardThreadPlansUpToPlan (lldb::ThreadPlanSP &up_to_plan_sp); 685ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham 686ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham //------------------------------------------------------------------ 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// Prints the current plan stack. 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// @param[in] s 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// The stream to which to dump the plan stack info. 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /// 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DumpThreadPlans (Stream *s) const; 69520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham 69615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham virtual bool 69715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham CheckpointThreadState (ThreadStateCheckpoint &saved_state); 69815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 69915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham virtual bool 70015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham RestoreThreadStateFromCheckpoint (ThreadStateCheckpoint &saved_state); 70115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 702745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham void 703745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham EnableTracer (bool value, bool single_step); 704745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham 705745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham void 706745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham SetTracer (lldb::ThreadPlanTracerSP &tracer_sp); 707745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham 70820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham //------------------------------------------------------------------ 70920594b1b003f63ed34ebafeec37634ee44552339Jim Ingham /// The regular expression returned determines symbols that this 71020594b1b003f63ed34ebafeec37634ee44552339Jim Ingham /// thread won't stop in during "step-in" operations. 71120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham /// 71220594b1b003f63ed34ebafeec37634ee44552339Jim Ingham /// @return 71320594b1b003f63ed34ebafeec37634ee44552339Jim Ingham /// A pointer to a regular expression to compare against symbols, 71420594b1b003f63ed34ebafeec37634ee44552339Jim Ingham /// or NULL if all symbols are allowed. 71520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham /// 71620594b1b003f63ed34ebafeec37634ee44552339Jim Ingham //------------------------------------------------------------------ 71720594b1b003f63ed34ebafeec37634ee44552339Jim Ingham RegularExpression * 71820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham GetSymbolsToAvoidRegexp() 71920594b1b003f63ed34ebafeec37634ee44552339Jim Ingham { 72020594b1b003f63ed34ebafeec37634ee44552339Jim Ingham return ThreadInstanceSettings::GetSymbolsToAvoidRegexp(); 72120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham } 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the thread index ID. The index ID that is guaranteed to not be 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // re-used by a process. They start at 1 and increase with each new thread. 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This allows easy command line access by a unique ID that is easier to 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // type than the actual system thread ID. 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetIndexID () const; 729cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // lldb::ExecutionContextScope pure virtual functions 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual Target * 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateTarget (); 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual Process * 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateProcess (); 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual Thread * 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateThread (); 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual StackFrame * 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateStackFrame (); 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 746a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton CalculateExecutionContext (ExecutionContext &exe_ctx); 747ccd584dccb920cdb028de69950774c3bcdc025ecJim Ingham 748ccd584dccb920cdb028de69950774c3bcdc025ecJim Ingham lldb::StackFrameSP 749ccd584dccb920cdb028de69950774c3bcdc025ecJim Ingham GetStackFrameSPForStackFramePtr (StackFrame *stack_frame_ptr); 750abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 751abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton size_t 752abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton GetStatus (Stream &strm, 753abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t start_frame, 754abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t num_frames, 755abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t num_frames_with_source); 756abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton 757abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton size_t 758abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton GetStackFrameStatus (Stream& strm, 759abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t first_frame, 760abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t num_frames, 761abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton bool show_frame_info, 762abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t num_frames_with_source, 763abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t source_lines_before, 764abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton uint32_t source_lines_after); 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 76732f4fdde0882395aec2ea56d1adcce78759105b7Greg Clayton 76832f4fdde0882395aec2ea56d1adcce78759105b7Greg Clayton friend class ThreadPlan; 76913d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton friend class ThreadList; 770782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton friend class StackFrameList; 771cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham 772cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham // This is necessary to make sure thread assets get destroyed while the thread is still in good shape 773cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham // to call virtual thread methods. This must be called by classes that derive from Thread in their destructor. 774cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham virtual void DestroyThread (); 77532f4fdde0882395aec2ea56d1adcce78759105b7Greg Clayton 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PushPlan (lldb::ThreadPlanSP &plan_sp); 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PopPlan (); 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DiscardPlan (); 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadPlan *GetPreviousPlan (ThreadPlan *plan); 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham // When you implement this method, make sure you don't overwrite the m_actual_stop_info if it claims to be 78815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham // valid. The stop info may be a "checkpointed and restored" stop info, so if it is still around it is right 78915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham // even if you have not calculated this yourself, or if it disagrees with what you might have calculated. 790643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton virtual lldb::StopInfoSP 791643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton GetPrivateStopReason () = 0; 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef std::vector<lldb::ThreadPlanSP> plan_stack; 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham void 79615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham SetStopInfo (const lldb::StopInfoSP &stop_info_sp); 79715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 79815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham virtual bool 799e426d855032b9b1962b98028b42e3a4e88975b03Peter Collingbourne SaveFrameZeroState (RegisterCheckpoint &checkpoint); 80015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 80115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham virtual bool 802e426d855032b9b1962b98028b42e3a4e88975b03Peter Collingbourne RestoreSaveFrameZero (const RegisterCheckpoint &checkpoint); 80315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 80471219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham virtual lldb_private::Unwind * 80537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton GetUnwinder (); 80671219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham 807782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton StackFrameList & 808782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton GetStackFrameList (); 80915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 810149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham lldb::StateType GetTemporaryResumeState() 811149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham { 812149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham return m_temporary_resume_state; 813149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham } 814149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham 815149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham lldb::StateType SetTemporaryResumeState(lldb::StateType resume_state) 816149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham { 817149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham lldb::StateType old_temp_resume_state = m_temporary_resume_state; 818149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham m_temporary_resume_state = resume_state; 819149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham return old_temp_resume_state; 820149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham } 821149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham 82215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham struct ThreadState 8236297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham { 82415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham uint32_t orig_stop_id; 82515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham lldb::StopInfoSP stop_info_sp; 82615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham RegisterCheckpoint register_backup; 82715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham }; 8286297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Classes that inherit from Process can see and modify these 83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Process & m_process; ///< The process that owns this thread. 833643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton lldb::StopInfoSP m_actual_stop_info_sp; ///< The private stop reason for this thread 83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t m_index_id; ///< A unique 1 based index assigned to each thread for easy UI/command line access. 83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::RegisterContextSP m_reg_context_sp; ///< The register context for this thread's current register state. 83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::StateType m_state; ///< The state of our process. 837782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton mutable Mutex m_state_mutex; ///< Multithreaded protection for m_state. 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner plan_stack m_plan_stack; ///< The stack of plans this thread is executing. 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner plan_stack m_completed_plan_stack; ///< Plans that have been completed by this stop. They get deleted when the thread resumes. 84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner plan_stack m_discarded_plan_stack; ///< Plans that have been discarded by this stop. They get deleted when the thread resumes. 841c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton lldb::StackFrameListSP m_curr_frames_sp; ///< The stack frames that get lazily populated after a thread stops. 8425205f0b6585a127acc6ed210021abb6091220a89Greg Clayton lldb::StackFrameListSP m_prev_frames_sp; ///< The previous stack frames from the last time this thread stopped. 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int m_resume_signal; ///< The signal that should be used when continuing this thread. 844149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham lldb::StateType m_resume_state; ///< This state is used to force a thread to be suspended from outside the ThreadPlan logic. 845149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham lldb::StateType m_temporary_resume_state; ///< This state records what the thread was told to do by the thread plan logic for the current resume. 846149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham /// It gets set in Thread::WillResume. 84771219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham std::auto_ptr<lldb_private::Unwind> m_unwinder_ap; 848cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham bool m_destroy_called; // This is used internally to make sure derived Thread classes call DestroyThread. 84915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham uint32_t m_thread_stop_reason_stop_id; // This is the stop id for which the StopInfo is valid. Can use this so you know that 85015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham // the thread's m_actual_stop_info_sp is current and you don't have to fetch it again 85115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate: 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // For Thread only 85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 85615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DISALLOW_COPY_AND_ASSIGN (Thread); 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // liblldb_Thread_h_ 864