• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     //------------------------------------------------------------------
Unwind(Thread & thread)28     Unwind(Thread &thread) :
29         m_thread (thread),
30         m_unwind_mutex()
31     {
32     }
33 
34 public:
35     virtual
~Unwind()36     ~Unwind()
37     {
38     }
39 
40     void
Clear()41     Clear()
42     {
43         Mutex::Locker locker(m_unwind_mutex);
44         DoClear();
45 
46     }
47 
48     uint32_t
GetFrameCount()49     GetFrameCount()
50     {
51         Mutex::Locker locker(m_unwind_mutex);
52         return DoGetFrameCount();
53     }
54 
55     uint32_t
GetFramesUpTo(uint32_t end_idx)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
GetFrameInfoAtIndex(uint32_t frame_idx,lldb::addr_t & cfa,lldb::addr_t & pc)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
CreateRegisterContextForFrame(StackFrame * frame)82     CreateRegisterContextForFrame (StackFrame *frame)
83     {
84         Mutex::Locker locker(m_unwind_mutex);
85         return DoCreateRegisterContextForFrame (frame);
86     }
87 
88     Thread &
GetThread()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_
121