124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- StackFrameList.h ----------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_StackFrameList_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_StackFrameList_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Mutex.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass StackFrameList
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
30f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton    StackFrameList (Thread &thread,
315205f0b6585a127acc6ed210021abb6091220a89Greg Clayton                    const lldb::StackFrameListSP &prev_frames_sp,
32f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton                    bool show_inline_frames);
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~StackFrameList();
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
375205f0b6585a127acc6ed210021abb6091220a89Greg Clayton    GetNumFrames (bool can_create = true);
38bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::StackFrameSP
40782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton    GetFrameAtIndex (uint32_t idx);
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4208d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton    lldb::StackFrameSP
4308d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton    GetFrameWithConcreteFrameIndex (uint32_t unwind_idx);
445c4b1607e8783a3d3f1f28fa66fcaa89ac246bd1Jim Ingham
455c4b1607e8783a3d3f1f28fa66fcaa89ac246bd1Jim Ingham    lldb::StackFrameSP
46b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    GetFrameWithStackID (const StackID &stack_id);
4708d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Mark a stack frame as the current frame
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
50c833295baeec641086f536e78050388af36784f8Jim Ingham    SetSelectedFrame (lldb_private::StackFrame *frame);
51fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
53c833295baeec641086f536e78050388af36784f8Jim Ingham    GetSelectedFrameIndex () const;
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Mark a stack frame as the current frame using the frame index
56bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham    bool
57c833295baeec641086f536e78050388af36784f8Jim Ingham    SetSelectedFrameByIndex (uint32_t idx);
580c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham
590c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    uint32_t
600c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    GetVisibleStackFrameIndex(uint32_t idx)
610c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    {
620c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham        if (m_current_inlined_depth < UINT32_MAX)
630c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham            return idx - m_current_inlined_depth;
640c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham        else
650c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham            return idx;
660c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    }
670c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham
680c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    void
690c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    CalculateCurrentInlinedDepth ();
700c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
72fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    SetDefaultFileAndLineToSelectedFrame();
73fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham
74fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    void
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear ();
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    InvalidateFrames (uint32_t start_idx);
791d66ef5d31a8326d5495f56b0cfbf2fd1bff67d8Greg Clayton
801d66ef5d31a8326d5495f56b0cfbf2fd1bff67d8Greg Clayton    void
811d66ef5d31a8326d5495f56b0cfbf2fd1bff67d8Greg Clayton    Dump (Stream *s);
82ccd584dccb920cdb028de69950774c3bcdc025ecJim Ingham
83ccd584dccb920cdb028de69950774c3bcdc025ecJim Ingham    lldb::StackFrameSP
84ccd584dccb920cdb028de69950774c3bcdc025ecJim Ingham    GetStackFrameSPForStackFramePtr (StackFrame *stack_frame_ptr);
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    size_t
87abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    GetStatus (Stream &strm,
88abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton               uint32_t first_frame,
89abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton               uint32_t num_frames,
90abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton               bool show_frame_info,
91a7d3dc75ec4f46033c3f991f11fb58a058091a85Greg Clayton               uint32_t num_frames_with_source);
92abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton
931d66ef5d31a8326d5495f56b0cfbf2fd1bff67d8Greg Claytonprotected:
94782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton
955205f0b6585a127acc6ed210021abb6091220a89Greg Clayton    friend class Thread;
965205f0b6585a127acc6ed210021abb6091220a89Greg Clayton
97782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton    bool
981d66ef5d31a8326d5495f56b0cfbf2fd1bff67d8Greg Clayton    SetFrameAtIndex (uint32_t idx, lldb::StackFrameSP &frame_sp);
99782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton
1005205f0b6585a127acc6ed210021abb6091220a89Greg Clayton    static void
101102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    Merge (std::unique_ptr<StackFrameList>& curr_ap,
1025205f0b6585a127acc6ed210021abb6091220a89Greg Clayton           lldb::StackFrameListSP& prev_sp);
1035205f0b6585a127acc6ed210021abb6091220a89Greg Clayton
104bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham    void
105bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham    GetFramesUpTo (uint32_t end_idx);
106bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham
107bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham    bool
108bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham    GetAllFramesFetched()
109bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham    {
110bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham        return m_concrete_frames_fetched == UINT32_MAX;
111bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham    }
112bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham
113bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham    void
114bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham    SetAllFramesFetched ()
115bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham    {
116bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham        m_concrete_frames_fetched = UINT32_MAX;
117bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham    }
118bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham
1190c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    bool
1200c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    DecrementCurrentInlinedDepth ();
1210c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham
1220c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    void
1230c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    ResetCurrentInlinedDepth();
1240c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham
1250c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    uint32_t
1260c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    GetCurrentInlinedDepth ();
1270c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham
1289b124c6bc79c0f650ac52d65d6366f45f30ee31dJim Ingham    void
1299b124c6bc79c0f650ac52d65d6366f45f30ee31dJim Ingham    SetCurrentInlinedDepth (uint32_t new_depth);
1309b124c6bc79c0f650ac52d65d6366f45f30ee31dJim Ingham
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Classes that inherit from StackFrameList can see and modify these
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::vector<lldb::StackFrameSP> collection;
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef collection::iterator iterator;
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef collection::const_iterator const_iterator;
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
138782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton    Thread &m_thread;
1395205f0b6585a127acc6ed210021abb6091220a89Greg Clayton    lldb::StackFrameListSP m_prev_frames_sp;
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    mutable Mutex m_mutex;
1411d66ef5d31a8326d5495f56b0cfbf2fd1bff67d8Greg Clayton    collection m_frames;
142c833295baeec641086f536e78050388af36784f8Jim Ingham    uint32_t m_selected_frame_idx;
143bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham    uint32_t m_concrete_frames_fetched;
1440c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    uint32_t m_current_inlined_depth;
1450c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    lldb::addr_t m_current_inlined_pc;
146782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton    bool m_show_inlined_frames;
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // For StackFrameList only
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (StackFrameList);
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_StackFrameList_h_
158