164777Snyan//===-- StackFrameList.h ----------------------------------------*- C++ -*-===//
264777Snyan//
364777Snyan//                     The LLVM Compiler Infrastructure
464777Snyan//
564777Snyan// This file is distributed under the University of Illinois Open Source
664777Snyan// License. See LICENSE.TXT for details.
764777Snyan//
864777Snyan//===----------------------------------------------------------------------===//
964777Snyan
1064777Snyan#ifndef liblldb_StackFrameList_h_
1164777Snyan#define liblldb_StackFrameList_h_
1264777Snyan
1364777Snyan// C Includes
1464777Snyan// C++ Includes
1564777Snyan#include <vector>
1664777Snyan
1764777Snyan// Other libraries and framework includes
1864777Snyan// Project includes
1964777Snyan#include "lldb/Host/Mutex.h"
2064777Snyan#include "lldb/Target/StackFrame.h"
2164777Snyan
2264777Snyannamespace lldb_private {
2364777Snyan
2464777Snyanclass StackFrameList
2564777Snyan{
2664777Snyanpublic:
2764777Snyan    //------------------------------------------------------------------
2864777Snyan    // Constructors and Destructors
2964777Snyan    //------------------------------------------------------------------
3064777Snyan    StackFrameList (Thread &thread,
3164777Snyan                    const lldb::StackFrameListSP &prev_frames_sp,
3264777Snyan                    bool show_inline_frames);
3364777Snyan
3464777Snyan    ~StackFrameList();
3564777Snyan
3664777Snyan    uint32_t
3764777Snyan    GetNumFrames (bool can_create = true);
3864777Snyan
3964777Snyan    lldb::StackFrameSP
4064777Snyan    GetFrameAtIndex (uint32_t idx);
4164777Snyan
4264777Snyan    lldb::StackFrameSP
4364777Snyan    GetFrameWithConcreteFrameIndex (uint32_t unwind_idx);
4464777Snyan
4564777Snyan    lldb::StackFrameSP
4664777Snyan    GetFrameWithStackID (const StackID &stack_id);
4764777Snyan
4864777Snyan    // Mark a stack frame as the current frame
4964777Snyan    uint32_t
5064777Snyan    SetSelectedFrame (lldb_private::StackFrame *frame);
5164777Snyan
5264777Snyan    uint32_t
5364777Snyan    GetSelectedFrameIndex () const;
5464777Snyan
5564777Snyan    // Mark a stack frame as the current frame using the frame index
5664777Snyan    bool
5792739Salfred    SetSelectedFrameByIndex (uint32_t idx);
5892739Salfred
5992739Salfred    uint32_t
6092739Salfred    GetVisibleStackFrameIndex(uint32_t idx)
6192739Salfred    {
6292739Salfred        if (m_current_inlined_depth < UINT32_MAX)
6392739Salfred            return idx - m_current_inlined_depth;
6492739Salfred        else
6592739Salfred            return idx;
6692739Salfred    }
6792739Salfred
6892739Salfred    void
6992739Salfred    CalculateCurrentInlinedDepth ();
7092739Salfred
7192739Salfred    void
7264777Snyan    SetDefaultFileAndLineToSelectedFrame();
7364777Snyan
7492739Salfred    void
7592739Salfred    Clear ();
7664777Snyan
7764777Snyan    void
7864777Snyan    InvalidateFrames (uint32_t start_idx);
7964777Snyan
8064777Snyan    void
8164777Snyan    Dump (Stream *s);
8264777Snyan
8364777Snyan    lldb::StackFrameSP
8464777Snyan    GetStackFrameSPForStackFramePtr (StackFrame *stack_frame_ptr);
8564777Snyan
8664777Snyan    size_t
8764777Snyan    GetStatus (Stream &strm,
8864777Snyan               uint32_t first_frame,
8964777Snyan               uint32_t num_frames,
9064777Snyan               bool show_frame_info,
9164777Snyan               uint32_t num_frames_with_source,
9264777Snyan               const char *frame_marker = NULL);
9364777Snyan
9464777Snyanprotected:
9564777Snyan
9664777Snyan    friend class Thread;
9764777Snyan
9864777Snyan    bool
9964777Snyan    SetFrameAtIndex (uint32_t idx, lldb::StackFrameSP &frame_sp);
10064777Snyan
10164777Snyan    static void
10264777Snyan    Merge (std::unique_ptr<StackFrameList>& curr_ap,
10364777Snyan           lldb::StackFrameListSP& prev_sp);
10464777Snyan
10564777Snyan    void
10664777Snyan    GetFramesUpTo (uint32_t end_idx);
10764777Snyan
10864777Snyan    bool
10964777Snyan    GetAllFramesFetched()
11064777Snyan    {
11164777Snyan        return m_concrete_frames_fetched == UINT32_MAX;
11264777Snyan    }
11364777Snyan
11464777Snyan    void
11564777Snyan    SetAllFramesFetched ()
11664777Snyan    {
11764777Snyan        m_concrete_frames_fetched = UINT32_MAX;
11864777Snyan    }
11964777Snyan
12064777Snyan    bool
12164777Snyan    DecrementCurrentInlinedDepth ();
12264777Snyan
12364777Snyan    void
12464777Snyan    ResetCurrentInlinedDepth();
12564777Snyan
12664777Snyan    uint32_t
12764777Snyan    GetCurrentInlinedDepth ();
12864777Snyan
12964777Snyan    void
13064777Snyan    SetCurrentInlinedDepth (uint32_t new_depth);
13164777Snyan
13264777Snyan    //------------------------------------------------------------------
13364777Snyan    // Classes that inherit from StackFrameList can see and modify these
13464777Snyan    //------------------------------------------------------------------
13564777Snyan    typedef std::vector<lldb::StackFrameSP> collection;
13664777Snyan    typedef collection::iterator iterator;
13764777Snyan    typedef collection::const_iterator const_iterator;
13864777Snyan
13964777Snyan    Thread &m_thread;
14064777Snyan    lldb::StackFrameListSP m_prev_frames_sp;
14164777Snyan    mutable Mutex m_mutex;
14264777Snyan    collection m_frames;
14364777Snyan    uint32_t m_selected_frame_idx;
14464777Snyan    uint32_t m_concrete_frames_fetched;
14564777Snyan    uint32_t m_current_inlined_depth;
14664777Snyan    lldb::addr_t m_current_inlined_pc;
14764777Snyan    bool m_show_inlined_frames;
14864777Snyan
14964777Snyanprivate:
15064777Snyan    //------------------------------------------------------------------
15164777Snyan    // For StackFrameList only
15264777Snyan    //------------------------------------------------------------------
15364777Snyan    DISALLOW_COPY_AND_ASSIGN (StackFrameList);
15464777Snyan};
15564777Snyan
15664777Snyan} // namespace lldb_private
15764777Snyan
15864777Snyan#endif  // liblldb_StackFrameList_h_
15964777Snyan