1b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham//===-- AppleThreadPlanStepThroughObjCTrampoline.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
10b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#ifndef lldb_AppleThreadPlanStepThroughObjCTrampoline_h_
11b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#define lldb_AppleThreadPlanStepThroughObjCTrampoline_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1754e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton#include "lldb/lldb-types.h"
1854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton#include "lldb/lldb-enumerations.h"
191831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham#include "lldb/Core/Value.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlan.h"
21b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "AppleObjCTrampolineHandler.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Inghamclass AppleThreadPlanStepThroughObjCTrampoline : public ThreadPlan
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner	//------------------------------------------------------------------
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner	// Constructors and Destructors
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner	//------------------------------------------------------------------
32b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham	AppleThreadPlanStepThroughObjCTrampoline(Thread &thread,
336507dd90b5d27662537caee49a3a3cc236f85a53Jim Ingham                                             AppleObjCTrampolineHandler *trampoline_handler,
341831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham                                             ValueList &values,
356507dd90b5d27662537caee49a3a3cc236f85a53Jim Ingham                                             lldb::addr_t isa_addr,
366507dd90b5d27662537caee49a3a3cc236f85a53Jim Ingham                                             lldb::addr_t sel_addr,
376507dd90b5d27662537caee49a3a3cc236f85a53Jim Ingham                                             bool stop_others);
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham	virtual ~AppleThreadPlanStepThroughObjCTrampoline();
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetDescription (Stream *s,
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    lldb::DescriptionLevel level);
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ValidatePlan (Stream *error);
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb::StateType
49745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    GetPlanRunState ();
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ShouldStop (Event *event_ptr);
53b6b7f3e32208a9cce03aace3e05eabefd2693c2cJim Ingham
54b6b7f3e32208a9cce03aace3e05eabefd2693c2cJim Ingham    virtual bool
55b6b7f3e32208a9cce03aace3e05eabefd2693c2cJim Ingham    StopOthers()
56b6b7f3e32208a9cce03aace3e05eabefd2693c2cJim Ingham    {
57b6b7f3e32208a9cce03aace3e05eabefd2693c2cJim Ingham        return m_stop_others;
58b6b7f3e32208a9cce03aace3e05eabefd2693c2cJim Ingham    }
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The base class MischiefManaged does some cleanup - so you have to call it
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // in your MischiefManaged derived class.
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    MischiefManaged ();
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DidPush();
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
681831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    static bool
691831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    PreResumeInitializeClangFunction(void *myself);
701831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WillStop();
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner	//------------------------------------------------------------------
78b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham	// Classes that inherit from AppleThreadPlanStepThroughObjCTrampoline can see and modify these
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner	//------------------------------------------------------------------
807c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    virtual bool
817c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    DoPlanExplainsStop (Event *event_ptr);
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
841831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    bool
851831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    InitializeClangFunction ();
861831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner	//------------------------------------------------------------------
88b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham	// For AppleThreadPlanStepThroughObjCTrampoline only
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner	//------------------------------------------------------------------
906507dd90b5d27662537caee49a3a3cc236f85a53Jim Ingham    AppleObjCTrampolineHandler *m_trampoline_handler; // FIXME - ensure this doesn't go away on us?  SP maybe?
916507dd90b5d27662537caee49a3a3cc236f85a53Jim Ingham    lldb::addr_t m_args_addr;     // Stores the address for our step through function result structure.
921831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    //lldb::addr_t m_object_addr;  // This is only for Description.
931831e78a6253392fca1c99e555e7adaa3f372647Jim Ingham    ValueList    m_input_values;
946507dd90b5d27662537caee49a3a3cc236f85a53Jim Ingham    lldb::addr_t m_isa_addr;     // isa_addr and sel_addr are the keys we will use to cache the implementation.
956507dd90b5d27662537caee49a3a3cc236f85a53Jim Ingham    lldb::addr_t m_sel_addr;
966e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton    lldb::ThreadPlanSP m_func_sp;       // This is the function call plan.  We fill it at start, then set it
976e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton                                        // to NULL when this plan is done.  That way we know to go to:
986e0101c86555a06b3bd4cb6104b35abfae0b0057Greg Clayton    lldb::ThreadPlanSP m_run_to_sp;     // The plan that runs to the target.
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ClangFunction *m_impl_function;  // This is a pointer to a impl function that
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                     // is owned by the client that pushes this plan.
1016507dd90b5d27662537caee49a3a3cc236f85a53Jim Ingham    bool m_stop_others;
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton} // namespace lldb_private
10554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton
106b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#endif	// lldb_AppleThreadPlanStepThroughObjCTrampoline_h_
107