Home | History | Annotate | Download | only in Target
      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_
    121