Unwind.h revision bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Unwind.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_Unwind_h_ 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_Unwind_h_ 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h" 18591cf15899706efe8878a0718daec056e1ffd442Jim Ingham#include "lldb/Host/Mutex.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private { 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Unwind 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Classes that inherit from Unwind can see and modify these 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Unwind(Thread &thread) : 29591cf15899706efe8878a0718daec056e1ffd442Jim Ingham m_thread (thread), 30591cf15899706efe8878a0718daec056e1ffd442Jim Ingham m_unwind_mutex() 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic: 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ~Unwind() 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40591cf15899706efe8878a0718daec056e1ffd442Jim Ingham void 41591cf15899706efe8878a0718daec056e1ffd442Jim Ingham Clear() 42591cf15899706efe8878a0718daec056e1ffd442Jim Ingham { 43591cf15899706efe8878a0718daec056e1ffd442Jim Ingham Mutex::Locker locker(m_unwind_mutex); 44591cf15899706efe8878a0718daec056e1ffd442Jim Ingham DoClear(); 45591cf15899706efe8878a0718daec056e1ffd442Jim Ingham 46591cf15899706efe8878a0718daec056e1ffd442Jim Ingham } 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48591cf15899706efe8878a0718daec056e1ffd442Jim Ingham uint32_t 49591cf15899706efe8878a0718daec056e1ffd442Jim Ingham GetFrameCount() 50591cf15899706efe8878a0718daec056e1ffd442Jim Ingham { 51591cf15899706efe8878a0718daec056e1ffd442Jim Ingham Mutex::Locker locker(m_unwind_mutex); 52591cf15899706efe8878a0718daec056e1ffd442Jim Ingham return DoGetFrameCount(); 53591cf15899706efe8878a0718daec056e1ffd442Jim Ingham } 54bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham 55bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham uint32_t 56bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham GetFramesUpTo (uint32_t end_idx) 57bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham { 58bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham lldb::addr_t cfa; 59bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham lldb::addr_t pc; 60bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham uint32_t idx; 61bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham 62bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham for (idx = 0; idx < end_idx; idx++) 63bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham { 64bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham if (!DoGetFrameInfoAtIndex (idx, cfa, pc)) 65bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham { 66bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham break; 67bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham } 68bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham } 69bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham return idx; 70bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham } 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72591cf15899706efe8878a0718daec056e1ffd442Jim Ingham bool 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetFrameInfoAtIndex (uint32_t frame_idx, 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::addr_t& cfa, 75591cf15899706efe8878a0718daec056e1ffd442Jim Ingham lldb::addr_t& pc) 76591cf15899706efe8878a0718daec056e1ffd442Jim Ingham { 77591cf15899706efe8878a0718daec056e1ffd442Jim Ingham Mutex::Locker locker(m_unwind_mutex); 78591cf15899706efe8878a0718daec056e1ffd442Jim Ingham return DoGetFrameInfoAtIndex (frame_idx, cfa, pc); 79591cf15899706efe8878a0718daec056e1ffd442Jim Ingham } 80591cf15899706efe8878a0718daec056e1ffd442Jim Ingham 81591cf15899706efe8878a0718daec056e1ffd442Jim Ingham lldb::RegisterContextSP 82591cf15899706efe8878a0718daec056e1ffd442Jim Ingham CreateRegisterContextForFrame (StackFrame *frame) 83591cf15899706efe8878a0718daec056e1ffd442Jim Ingham { 84591cf15899706efe8878a0718daec056e1ffd442Jim Ingham Mutex::Locker locker(m_unwind_mutex); 85591cf15899706efe8878a0718daec056e1ffd442Jim Ingham return DoCreateRegisterContextForFrame (frame); 86591cf15899706efe8878a0718daec056e1ffd442Jim Ingham } 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Thread & 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetThread() 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_thread; 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected: 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Classes that inherit from Unwind can see and modify these 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //------------------------------------------------------------------ 98591cf15899706efe8878a0718daec056e1ffd442Jim Ingham virtual void 99591cf15899706efe8878a0718daec056e1ffd442Jim Ingham DoClear() = 0; 100591cf15899706efe8878a0718daec056e1ffd442Jim Ingham 101591cf15899706efe8878a0718daec056e1ffd442Jim Ingham virtual uint32_t 102591cf15899706efe8878a0718daec056e1ffd442Jim Ingham DoGetFrameCount() = 0; 103591cf15899706efe8878a0718daec056e1ffd442Jim Ingham 104591cf15899706efe8878a0718daec056e1ffd442Jim Ingham virtual bool 105591cf15899706efe8878a0718daec056e1ffd442Jim Ingham DoGetFrameInfoAtIndex (uint32_t frame_idx, 106591cf15899706efe8878a0718daec056e1ffd442Jim Ingham lldb::addr_t& cfa, 107591cf15899706efe8878a0718daec056e1ffd442Jim Ingham lldb::addr_t& pc) = 0; 108591cf15899706efe8878a0718daec056e1ffd442Jim Ingham 109591cf15899706efe8878a0718daec056e1ffd442Jim Ingham virtual lldb::RegisterContextSP 110591cf15899706efe8878a0718daec056e1ffd442Jim Ingham DoCreateRegisterContextForFrame (StackFrame *frame) = 0; 111591cf15899706efe8878a0718daec056e1ffd442Jim Ingham 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Thread &m_thread; 113591cf15899706efe8878a0718daec056e1ffd442Jim Ingham Mutex m_unwind_mutex; 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate: 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DISALLOW_COPY_AND_ASSIGN (Unwind); 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // liblldb_Unwind_h_ 121