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