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