Unwind.h revision bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5
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    }
54bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham
55bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham    uint32_t
56bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham    GetFramesUpTo (uint32_t end_idx)
57bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham    {
58bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham        lldb::addr_t cfa;
59bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham        lldb::addr_t pc;
60bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham        uint32_t idx;
61bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham
62bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham        for (idx = 0; idx < end_idx; idx++)
63bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham        {
64bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham            if (!DoGetFrameInfoAtIndex (idx, cfa, pc))
65bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham            {
66bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham                break;
67bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham            }
68bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham        }
69bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham        return idx;
70bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham    }
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    bool
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFrameInfoAtIndex (uint32_t frame_idx,
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         lldb::addr_t& cfa,
75591cf15899706efe8878a0718daec056e1ffd442Jim Ingham                         lldb::addr_t& pc)
76591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    {
77591cf15899706efe8878a0718daec056e1ffd442Jim Ingham        Mutex::Locker locker(m_unwind_mutex);
78591cf15899706efe8878a0718daec056e1ffd442Jim Ingham        return DoGetFrameInfoAtIndex (frame_idx, cfa, pc);
79591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    }
80591cf15899706efe8878a0718daec056e1ffd442Jim Ingham
81591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    lldb::RegisterContextSP
82591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    CreateRegisterContextForFrame (StackFrame *frame)
83591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    {
84591cf15899706efe8878a0718daec056e1ffd442Jim Ingham        Mutex::Locker locker(m_unwind_mutex);
85591cf15899706efe8878a0718daec056e1ffd442Jim Ingham        return DoCreateRegisterContextForFrame (frame);
86591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    }
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Thread &
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetThread()
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return m_thread;
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Classes that inherit from Unwind can see and modify these
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
98591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    virtual void
99591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    DoClear() = 0;
100591cf15899706efe8878a0718daec056e1ffd442Jim Ingham
101591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    virtual uint32_t
102591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    DoGetFrameCount() = 0;
103591cf15899706efe8878a0718daec056e1ffd442Jim Ingham
104591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    virtual bool
105591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    DoGetFrameInfoAtIndex (uint32_t frame_idx,
106591cf15899706efe8878a0718daec056e1ffd442Jim Ingham                         lldb::addr_t& cfa,
107591cf15899706efe8878a0718daec056e1ffd442Jim Ingham                         lldb::addr_t& pc) = 0;
108591cf15899706efe8878a0718daec056e1ffd442Jim Ingham
109591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    virtual lldb::RegisterContextSP
110591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    DoCreateRegisterContextForFrame (StackFrame *frame) = 0;
111591cf15899706efe8878a0718daec056e1ffd442Jim Ingham
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Thread &m_thread;
113591cf15899706efe8878a0718daec056e1ffd442Jim Ingham    Mutex  m_unwind_mutex;
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (Unwind);
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_Unwind_h_
121