124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- ThreadPlanCallFunction.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_ThreadPlanCallFunction_h_ 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_ThreadPlanCallFunction_h_ 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlan.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private { 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ThreadPlanCallFunction : public ThreadPlan 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham // Create a thread plan to call a function at the address passed in the "function" 26016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham // argument. If you plan to call GetReturnValueObject, then pass in the 27016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham // return type, otherwise just pass in an invalid ClangASTType. 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadPlanCallFunction (Thread &thread, 304f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec const Address &function, 31016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham const ClangASTType &return_type, 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t arg, 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool stop_other_threads, 34b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham bool unwind_on_error = true, 35b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham bool ignore_breakpoints = false, 363aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan lldb::addr_t *this_arg = 0, 373aa7da5cb3327792415de44405e0896c6bdc305bSean Callanan lldb::addr_t *cmd_arg = 0); 38989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 39989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton ThreadPlanCallFunction (Thread &thread, 404f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec const Address &function, 41016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham const ClangASTType &return_type, 42989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton bool stop_other_threads, 43b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham bool unwind_on_error, 44b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham bool ignore_breakpoints, 45989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton lldb::addr_t *arg1_ptr = NULL, 46989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton lldb::addr_t *arg2_ptr = NULL, 47989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton lldb::addr_t *arg3_ptr = NULL, 48989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton lldb::addr_t *arg4_ptr = NULL, 49989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton lldb::addr_t *arg5_ptr = NULL, 50989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton lldb::addr_t *arg6_ptr = NULL); 51989816b9505219cd67ce044d655c54ac86ecf64bGreg Clayton 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~ThreadPlanCallFunction (); 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetDescription (Stream *s, lldb::DescriptionLevel level); 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ValidatePlan (Stream *error); 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ShouldStop (Event *event_ptr); 6389e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham 6489e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham virtual Vote 6589e248f04ecb87d0df4a4b96158c3fac0a3e43c7Jim Ingham ShouldReportStop(Event *event_ptr); 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StopOthers (); 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetStopOthers (bool new_value); 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual lldb::StateType 74745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham GetPlanRunState (); 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DidPush (); 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner WillStop (); 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual bool 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner MischiefManaged (); 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 852f085c6ca2895663687dca704589478ff040b849Greg Clayton // To get the return value from a function call you must create a 862f085c6ca2895663687dca704589478ff040b849Greg Clayton // lldb::ValueSP that contains a valid clang type in its context and call 872f085c6ca2895663687dca704589478ff040b849Greg Clayton // RequestReturnValue. The ValueSP will be stored and when the function is 882f085c6ca2895663687dca704589478ff040b849Greg Clayton // done executing, the object will check if there is a requested return 892f085c6ca2895663687dca704589478ff040b849Greg Clayton // value. If there is, the return value will be retrieved using the 902f085c6ca2895663687dca704589478ff040b849Greg Clayton // ABI::GetReturnValue() for the ABI in the process. Then after the thread 912f085c6ca2895663687dca704589478ff040b849Greg Clayton // plan is complete, you can call "GetReturnValue()" to retrieve the value 922f085c6ca2895663687dca704589478ff040b849Greg Clayton // that was extracted. 932f085c6ca2895663687dca704589478ff040b849Greg Clayton 94016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham virtual lldb::ValueObjectSP 95016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham GetReturnValueObject () 962f085c6ca2895663687dca704589478ff040b849Greg Clayton { 97016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham return m_return_valobj_sp; 982f085c6ca2895663687dca704589478ff040b849Greg Clayton } 992f085c6ca2895663687dca704589478ff040b849Greg Clayton 1000ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // Return the stack pointer that the function received 1010ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // on entry. Any stack address below this should be 1020ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // considered invalid after the function has been 1030ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan // cleaned up. 1040ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t 1050ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan GetFunctionStackPointer() 1060ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan { 1070ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan return m_function_sp; 1080ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan } 1090ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan 1103e2ef48cd65658162791134b34c3c1fb9e8c8991Jim Ingham // Classes that derive from ClangFunction, and implement 1113e2ef48cd65658162791134b34c3c1fb9e8c8991Jim Ingham // their own WillPop methods should call this so that the 1123e2ef48cd65658162791134b34c3c1fb9e8c8991Jim Ingham // thread state gets restored if the plan gets discarded. 1136c9662e0e5840b557fcd4bd990620e106e4a18e2Jim Ingham virtual void 1146c9662e0e5840b557fcd4bd990620e106e4a18e2Jim Ingham WillPop (); 1152370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham 1162370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham // If the thread plan stops mid-course, this will be the stop reason that interrupted us. 1172370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham // Once DoTakedown is called, this will be the real stop reason at the end of the function call. 11804cc48eb5cff32268a822b57f87590c9dc2643f8Jim Ingham // If it hasn't been set for one or the other of these reasons, we'll return the PrivateStopReason. 1192370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham // This is needed because we want the CallFunction thread plans not to show up as the stop reason. 1202370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham // But if something bad goes wrong, it is nice to be able to tell the user what really happened. 12104cc48eb5cff32268a822b57f87590c9dc2643f8Jim Ingham 1222370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham virtual lldb::StopInfoSP 1232370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham GetRealStopInfo() 1242370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham { 12504cc48eb5cff32268a822b57f87590c9dc2643f8Jim Ingham if (m_real_stop_info_sp) 12604cc48eb5cff32268a822b57f87590c9dc2643f8Jim Ingham return m_real_stop_info_sp; 12704cc48eb5cff32268a822b57f87590c9dc2643f8Jim Ingham else 12804cc48eb5cff32268a822b57f87590c9dc2643f8Jim Ingham return GetPrivateStopInfo (); 1292370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham } 130ba560cc7d03c9f7d9df81e60201c5ec75cff5232Jim Ingham 131ba560cc7d03c9f7d9df81e60201c5ec75cff5232Jim Ingham lldb::addr_t 132ba560cc7d03c9f7d9df81e60201c5ec75cff5232Jim Ingham GetStopAddress () 133ba560cc7d03c9f7d9df81e60201c5ec75cff5232Jim Ingham { 134ba560cc7d03c9f7d9df81e60201c5ec75cff5232Jim Ingham return m_stop_address; 135ba560cc7d03c9f7d9df81e60201c5ec75cff5232Jim Ingham } 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13776b258db0611dad2f5b5ae51721a4bc0abd580aeJim Ingham virtual bool 13876b258db0611dad2f5b5ae51721a4bc0abd580aeJim Ingham RestoreThreadState(); 13976b258db0611dad2f5b5ae51721a4bc0abd580aeJim Ingham 1407c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Inghamprotected: 141cce607b039a7636f50f53b3ed52f6e8db99fffd5Jim Ingham void ReportRegisterState (const char *message); 1427c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham 1437c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham virtual bool 1447c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham DoPlanExplainsStop (Event *event_ptr); 1457c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate: 1471e58cef33bbfd953e2c9e7dc872c4c74e0d75352Jim Ingham 1481e58cef33bbfd953e2c9e7dc872c4c74e0d75352Jim Ingham bool 1491e58cef33bbfd953e2c9e7dc872c4c74e0d75352Jim Ingham ConstructorSetup (Thread &thread, 1501e58cef33bbfd953e2c9e7dc872c4c74e0d75352Jim Ingham ABI *& abi, 1511e58cef33bbfd953e2c9e7dc872c4c74e0d75352Jim Ingham lldb::addr_t &start_load_addr, 1521e58cef33bbfd953e2c9e7dc872c4c74e0d75352Jim Ingham lldb::addr_t &function_load_addr); 1531e58cef33bbfd953e2c9e7dc872c4c74e0d75352Jim Ingham 15407f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan void 155038fa8e30621e0e55faed3479387d811986f28b7Jim Ingham DoTakedown (bool success); 15614a97ff7ccb8d40fee3c6ff136a2c602819174ddSean Callanan 15714a97ff7ccb8d40fee3c6ff136a2c602819174ddSean Callanan void 15807f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan SetBreakpoints (); 15907f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 16007f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan void 16107f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan ClearBreakpoints (); 16207f3d8d674350e5efc7f762f18c82c8c6f2abb10Sean Callanan 16394fb5432f10882f8917acb7849abdba7c61277acSean Callanan bool 16494fb5432f10882f8917acb7849abdba7c61277acSean Callanan BreakpointsExplainStop (); 16594fb5432f10882f8917acb7849abdba7c61277acSean Callanan 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool m_valid; 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool m_stop_other_threads; 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address m_function_addr; 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address m_start_addr; 1700ddf806dd9e71637846bf0ad46e1b2df7d02cbceSean Callanan lldb::addr_t m_function_sp; 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Thread::RegisterCheckpoint m_register_backup; 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::ThreadPlanSP m_subplan_sp; 17329756d452be39535ded2cff50d9db4df46fe6400Sean Callanan LanguageRuntime *m_cxx_language_runtime; 17429756d452be39535ded2cff50d9db4df46fe6400Sean Callanan LanguageRuntime *m_objc_language_runtime; 17515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham Thread::ThreadStateCheckpoint m_stored_thread_state; 1762370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham lldb::StopInfoSP m_real_stop_info_sp; // In general we want to hide call function 1772370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham // thread plans, but for reporting purposes, 1782370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham // it's nice to know the real stop reason. 1792370a97fe5bea6fa9d82f40bb34d37d3d3bda317Jim Ingham // This gets set in DoTakedown. 18023ed3ad96930e0b4d587bd429dca99f1f5f8bd16Jim Ingham StreamString m_constructor_errors; 181016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham ClangASTType m_return_type; 182016ef8886cd429f8a53bff967e601f831e409eaaJim Ingham lldb::ValueObjectSP m_return_valobj_sp; // If this contains a valid pointer, use the ABI to extract values when complete 183cce607b039a7636f50f53b3ed52f6e8db99fffd5Jim Ingham bool m_takedown_done; // We want to ensure we only do the takedown once. This ensures that. 184ba560cc7d03c9f7d9df81e60201c5ec75cff5232Jim Ingham lldb::addr_t m_stop_address; // This is the address we stopped at. Also set in DoTakedown; 185b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham bool m_unwind_on_error; 186b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham bool m_ignore_breakpoints; 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DISALLOW_COPY_AND_ASSIGN (ThreadPlanCallFunction); 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // liblldb_ThreadPlanCallFunction_h_ 194