]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/llvm/tools/lldb/include/lldb/Target/Unwind.h
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / llvm / tools / lldb / include / lldb / Target / Unwind.h
1 //===-- Unwind.h ------------------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef liblldb_Unwind_h_
11 #define liblldb_Unwind_h_
12
13 // C Includes
14 // C++ Includes
15 // Other libraries and framework includes
16 // Project includes
17 #include "lldb/lldb-private.h"
18 #include "lldb/Host/Mutex.h"
19
20 namespace lldb_private {
21
22 class Unwind 
23 {
24 protected:
25     //------------------------------------------------------------------
26     // Classes that inherit from Unwind can see and modify these
27     //------------------------------------------------------------------
28     Unwind(Thread &thread) :
29         m_thread (thread),
30         m_unwind_mutex()
31     {
32     }
33
34 public:
35     virtual
36     ~Unwind()
37     {
38     }
39
40     void
41     Clear()
42     {
43         Mutex::Locker locker(m_unwind_mutex);
44         DoClear();
45     
46     }
47
48     uint32_t
49     GetFrameCount()
50     {
51         Mutex::Locker locker(m_unwind_mutex);
52         return DoGetFrameCount();
53     }
54     
55     uint32_t
56     GetFramesUpTo (uint32_t end_idx)
57     {
58         lldb::addr_t cfa;
59         lldb::addr_t pc;
60         uint32_t idx;
61         
62         for (idx = 0; idx < end_idx; idx++)
63         {
64             if (!DoGetFrameInfoAtIndex (idx, cfa, pc))
65             {
66                 break;
67             }
68         }
69         return idx;
70     }
71
72     bool
73     GetFrameInfoAtIndex (uint32_t frame_idx,
74                          lldb::addr_t& cfa, 
75                          lldb::addr_t& pc)
76     {
77         Mutex::Locker locker(m_unwind_mutex);
78         return DoGetFrameInfoAtIndex (frame_idx, cfa, pc);
79     }
80     
81     lldb::RegisterContextSP
82     CreateRegisterContextForFrame (StackFrame *frame)
83     {
84         Mutex::Locker locker(m_unwind_mutex);
85         return DoCreateRegisterContextForFrame (frame);
86     }
87     
88     Thread &
89     GetThread()
90     {
91         return m_thread;
92     }
93
94 protected:
95     //------------------------------------------------------------------
96     // Classes that inherit from Unwind can see and modify these
97     //------------------------------------------------------------------
98     virtual void
99     DoClear() = 0;
100
101     virtual uint32_t
102     DoGetFrameCount() = 0;
103
104     virtual bool
105     DoGetFrameInfoAtIndex (uint32_t frame_idx,
106                          lldb::addr_t& cfa, 
107                          lldb::addr_t& pc) = 0;
108     
109     virtual lldb::RegisterContextSP
110     DoCreateRegisterContextForFrame (StackFrame *frame) = 0;
111
112     Thread &m_thread;
113     Mutex  m_unwind_mutex;
114 private:
115     DISALLOW_COPY_AND_ASSIGN (Unwind);
116 };
117
118 } // namespace lldb_private
119
120 #endif  // liblldb_Unwind_h_