Unwind.h revision 591cf15899706efe8878a0718daec056e1ffd442
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Unwind.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_Unwind_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_Unwind_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"
18591cf15899706efe8878a0718daec056e1ffd442Jim Ingham#include "lldb/Host/Mutex.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Unwind
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Classes that inherit from Unwind can see and modify these
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Unwind(Thread &thread) :
29591cf15899706efe8878a0718daec056e1ffd442Jim Ingham        m_thread (thread),
30591cf15899706efe8878a0718daec056e1ffd442Jim Ingham        m_unwind_mutex()
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~Unwind()
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    void
41591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    Clear()
42591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    {
43591cf15899706efe8878a0718daec056e1ffd442Jim Ingham        Mutex::Locker locker(m_unwind_mutex);
44591cf15899706efe8878a0718daec056e1ffd442Jim Ingham        DoClear();
45591cf15899706efe8878a0718daec056e1ffd442Jim Ingham
46591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    }
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    uint32_t
49591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    GetFrameCount()
50591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    {
51591cf15899706efe8878a0718daec056e1ffd442Jim Ingham        Mutex::Locker locker(m_unwind_mutex);
52591cf15899706efe8878a0718daec056e1ffd442Jim Ingham        return DoGetFrameCount();
53591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    }
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    bool
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFrameInfoAtIndex (uint32_t frame_idx,
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         lldb::addr_t& cfa,
58591cf15899706efe8878a0718daec056e1ffd442Jim Ingham                         lldb::addr_t& pc)
59591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    {
60591cf15899706efe8878a0718daec056e1ffd442Jim Ingham        Mutex::Locker locker(m_unwind_mutex);
61591cf15899706efe8878a0718daec056e1ffd442Jim Ingham        return DoGetFrameInfoAtIndex (frame_idx, cfa, pc);
62591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    }
63591cf15899706efe8878a0718daec056e1ffd442Jim Ingham
64591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    lldb::RegisterContextSP
65591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    CreateRegisterContextForFrame (StackFrame *frame)
66591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    {
67591cf15899706efe8878a0718daec056e1ffd442Jim Ingham        Mutex::Locker locker(m_unwind_mutex);
68591cf15899706efe8878a0718daec056e1ffd442Jim Ingham        return DoCreateRegisterContextForFrame (frame);
69591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    }
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Thread &
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetThread()
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_thread;
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Classes that inherit from Unwind can see and modify these
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
81591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    virtual void
82591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    DoClear() = 0;
83591cf15899706efe8878a0718daec056e1ffd442Jim Ingham
84591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    virtual uint32_t
85591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    DoGetFrameCount() = 0;
86591cf15899706efe8878a0718daec056e1ffd442Jim Ingham
87591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    virtual bool
88591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    DoGetFrameInfoAtIndex (uint32_t frame_idx,
89591cf15899706efe8878a0718daec056e1ffd442Jim Ingham                         lldb::addr_t& cfa,
90591cf15899706efe8878a0718daec056e1ffd442Jim Ingham                         lldb::addr_t& pc) = 0;
91591cf15899706efe8878a0718daec056e1ffd442Jim Ingham
92591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    virtual lldb::RegisterContextSP
93591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    DoCreateRegisterContextForFrame (StackFrame *frame) = 0;
94591cf15899706efe8878a0718daec056e1ffd442Jim Ingham
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Thread &m_thread;
96591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    Mutex  m_unwind_mutex;
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (Unwind);
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_Unwind_h_
104