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