Home | History | Annotate | Download | only in Target
      1 //===-- StackFrameList.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_StackFrameList_h_
     11 #define liblldb_StackFrameList_h_
     12 
     13 // C Includes
     14 // C++ Includes
     15 #include <vector>
     16 
     17 // Other libraries and framework includes
     18 // Project includes
     19 #include "lldb/Host/Mutex.h"
     20 #include "lldb/Target/StackFrame.h"
     21 
     22 namespace lldb_private {
     23 
     24 class StackFrameList
     25 {
     26 public:
     27     //------------------------------------------------------------------
     28     // Constructors and Destructors
     29     //------------------------------------------------------------------
     30     StackFrameList (Thread &thread,
     31                     const lldb::StackFrameListSP &prev_frames_sp,
     32                     bool show_inline_frames);
     33 
     34     ~StackFrameList();
     35 
     36     uint32_t
     37     GetNumFrames (bool can_create = true);
     38 
     39     lldb::StackFrameSP
     40     GetFrameAtIndex (uint32_t idx);
     41 
     42     lldb::StackFrameSP
     43     GetFrameWithConcreteFrameIndex (uint32_t unwind_idx);
     44 
     45     lldb::StackFrameSP
     46     GetFrameWithStackID (const StackID &stack_id);
     47 
     48     // Mark a stack frame as the current frame
     49     uint32_t
     50     SetSelectedFrame (lldb_private::StackFrame *frame);
     51 
     52     uint32_t
     53     GetSelectedFrameIndex () const;
     54 
     55     // Mark a stack frame as the current frame using the frame index
     56     bool
     57     SetSelectedFrameByIndex (uint32_t idx);
     58 
     59     uint32_t
     60     GetVisibleStackFrameIndex(uint32_t idx)
     61     {
     62         if (m_current_inlined_depth < UINT32_MAX)
     63             return idx - m_current_inlined_depth;
     64         else
     65             return idx;
     66     }
     67 
     68     void
     69     CalculateCurrentInlinedDepth ();
     70 
     71     void
     72     SetDefaultFileAndLineToSelectedFrame();
     73 
     74     void
     75     Clear ();
     76 
     77     void
     78     InvalidateFrames (uint32_t start_idx);
     79 
     80     void
     81     Dump (Stream *s);
     82 
     83     lldb::StackFrameSP
     84     GetStackFrameSPForStackFramePtr (StackFrame *stack_frame_ptr);
     85 
     86     size_t
     87     GetStatus (Stream &strm,
     88                uint32_t first_frame,
     89                uint32_t num_frames,
     90                bool show_frame_info,
     91                uint32_t num_frames_with_source);
     92 
     93 protected:
     94 
     95     friend class Thread;
     96 
     97     bool
     98     SetFrameAtIndex (uint32_t idx, lldb::StackFrameSP &frame_sp);
     99 
    100     static void
    101     Merge (std::unique_ptr<StackFrameList>& curr_ap,
    102            lldb::StackFrameListSP& prev_sp);
    103 
    104     void
    105     GetFramesUpTo (uint32_t end_idx);
    106 
    107     bool
    108     GetAllFramesFetched()
    109     {
    110         return m_concrete_frames_fetched == UINT32_MAX;
    111     }
    112 
    113     void
    114     SetAllFramesFetched ()
    115     {
    116         m_concrete_frames_fetched = UINT32_MAX;
    117     }
    118 
    119     bool
    120     DecrementCurrentInlinedDepth ();
    121 
    122     void
    123     ResetCurrentInlinedDepth();
    124 
    125     uint32_t
    126     GetCurrentInlinedDepth ();
    127 
    128     void
    129     SetCurrentInlinedDepth (uint32_t new_depth);
    130 
    131     //------------------------------------------------------------------
    132     // Classes that inherit from StackFrameList can see and modify these
    133     //------------------------------------------------------------------
    134     typedef std::vector<lldb::StackFrameSP> collection;
    135     typedef collection::iterator iterator;
    136     typedef collection::const_iterator const_iterator;
    137 
    138     Thread &m_thread;
    139     lldb::StackFrameListSP m_prev_frames_sp;
    140     mutable Mutex m_mutex;
    141     collection m_frames;
    142     uint32_t m_selected_frame_idx;
    143     uint32_t m_concrete_frames_fetched;
    144     uint32_t m_current_inlined_depth;
    145     lldb::addr_t m_current_inlined_pc;
    146     bool m_show_inlined_frames;
    147 
    148 private:
    149     //------------------------------------------------------------------
    150     // For StackFrameList only
    151     //------------------------------------------------------------------
    152     DISALLOW_COPY_AND_ASSIGN (StackFrameList);
    153 };
    154 
    155 } // namespace lldb_private
    156 
    157 #endif  // liblldb_StackFrameList_h_
    158