102706c32SJason Molenda //===-- HistoryThread.cpp ---------------------------------------*- C++ -*-===// 202706c32SJason Molenda // 302706c32SJason Molenda // The LLVM Compiler Infrastructure 402706c32SJason Molenda // 502706c32SJason Molenda // This file is distributed under the University of Illinois Open Source 602706c32SJason Molenda // License. See LICENSE.TXT for details. 702706c32SJason Molenda // 802706c32SJason Molenda //===----------------------------------------------------------------------===// 902706c32SJason Molenda 1002706c32SJason Molenda #include "lldb/lldb-private.h" 1102706c32SJason Molenda 1202706c32SJason Molenda #include "Plugins/Process/Utility/HistoryUnwind.h" 1302706c32SJason Molenda #include "Plugins/Process/Utility/HistoryThread.h" 1402706c32SJason Molenda #include "Plugins/Process/Utility/RegisterContextHistory.h" 1502706c32SJason Molenda 16ee87e750SJason Molenda #include "lldb/Core/Log.h" 1702706c32SJason Molenda #include "lldb/Target/StackFrameList.h" 1802706c32SJason Molenda #include "lldb/Target/Process.h" 1902706c32SJason Molenda 2002706c32SJason Molenda using namespace lldb; 2102706c32SJason Molenda using namespace lldb_private; 2202706c32SJason Molenda 2302706c32SJason Molenda HistoryThread::HistoryThread (lldb_private::Process &process, 2402706c32SJason Molenda std::vector<lldb::addr_t> pcs, 2502706c32SJason Molenda uint32_t stop_id, 2602706c32SJason Molenda bool stop_id_is_valid) : 2702706c32SJason Molenda Thread (process, LLDB_INVALID_THREAD_ID), 2802706c32SJason Molenda m_framelist_mutex(), 2902706c32SJason Molenda m_framelist(), 3002706c32SJason Molenda m_pcs (pcs), 3102706c32SJason Molenda m_stop_id (stop_id), 32*a7b5afa9SJason Molenda m_stop_id_is_valid (stop_id_is_valid), 33*a7b5afa9SJason Molenda m_extended_unwind_token (LLDB_INVALID_ADDRESS) 3402706c32SJason Molenda { 3502706c32SJason Molenda m_unwinder_ap.reset (new HistoryUnwind (*this, pcs, stop_id, stop_id_is_valid)); 36ee87e750SJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 37ee87e750SJason Molenda if (log) 38ee87e750SJason Molenda log->Printf ("%p HistoryThread::HistoryThread", this); 3902706c32SJason Molenda } 4002706c32SJason Molenda 4102706c32SJason Molenda HistoryThread::~HistoryThread () 4202706c32SJason Molenda { 43ee87e750SJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 44ee87e750SJason Molenda if (log) 45ee87e750SJason Molenda log->Printf ("%p HistoryThread::~HistoryThread (tid=0x%" PRIx64 ")", this, GetID()); 46ee87e750SJason Molenda DestroyThread(); 4702706c32SJason Molenda } 4802706c32SJason Molenda 4902706c32SJason Molenda lldb::RegisterContextSP 5002706c32SJason Molenda HistoryThread::GetRegisterContext () 5102706c32SJason Molenda { 5202706c32SJason Molenda RegisterContextSP rctx ; 5302706c32SJason Molenda if (m_pcs.size() > 0) 5402706c32SJason Molenda { 5502706c32SJason Molenda rctx.reset (new RegisterContextHistory (*this, 0, GetProcess()->GetAddressByteSize(), m_pcs[0])); 5602706c32SJason Molenda } 5702706c32SJason Molenda return rctx; 5802706c32SJason Molenda 5902706c32SJason Molenda } 6002706c32SJason Molenda 6102706c32SJason Molenda lldb::RegisterContextSP 6202706c32SJason Molenda HistoryThread::CreateRegisterContextForFrame (StackFrame *frame) 6302706c32SJason Molenda { 6402706c32SJason Molenda return m_unwinder_ap->CreateRegisterContextForFrame (frame); 6502706c32SJason Molenda } 6602706c32SJason Molenda 6702706c32SJason Molenda lldb::StackFrameListSP 6802706c32SJason Molenda HistoryThread::GetStackFrameList () 6902706c32SJason Molenda { 7002706c32SJason Molenda Mutex::Locker (m_framelist_mutex); 7102706c32SJason Molenda if (m_framelist.get() == NULL) 7202706c32SJason Molenda { 7302706c32SJason Molenda m_framelist.reset (new StackFrameList (*this, StackFrameListSP(), true)); 7402706c32SJason Molenda } 7502706c32SJason Molenda 7602706c32SJason Molenda return m_framelist; 7702706c32SJason Molenda } 78