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, 248ee9cb58SJason Molenda lldb::tid_t tid, 2502706c32SJason Molenda std::vector<lldb::addr_t> pcs, 2602706c32SJason Molenda uint32_t stop_id, 2702706c32SJason Molenda bool stop_id_is_valid) : 2802706c32SJason Molenda Thread (process, LLDB_INVALID_THREAD_ID), 2902706c32SJason Molenda m_framelist_mutex(), 3002706c32SJason Molenda m_framelist(), 3102706c32SJason Molenda m_pcs (pcs), 3202706c32SJason Molenda m_stop_id (stop_id), 33a7b5afa9SJason Molenda m_stop_id_is_valid (stop_id_is_valid), 348ee9cb58SJason Molenda m_extended_unwind_token (LLDB_INVALID_ADDRESS), 358ee9cb58SJason Molenda m_queue_name (), 368ee9cb58SJason Molenda m_thread_name (), 37*a6e9130dSJason Molenda m_originating_unique_thread_id (tid), 38*a6e9130dSJason Molenda m_queue_id (LLDB_INVALID_QUEUE_ID) 3902706c32SJason Molenda { 4002706c32SJason Molenda m_unwinder_ap.reset (new HistoryUnwind (*this, pcs, stop_id, stop_id_is_valid)); 41ee87e750SJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 42ee87e750SJason Molenda if (log) 43ee87e750SJason Molenda log->Printf ("%p HistoryThread::HistoryThread", this); 4402706c32SJason Molenda } 4502706c32SJason Molenda 4602706c32SJason Molenda HistoryThread::~HistoryThread () 4702706c32SJason Molenda { 48ee87e750SJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 49ee87e750SJason Molenda if (log) 50ee87e750SJason Molenda log->Printf ("%p HistoryThread::~HistoryThread (tid=0x%" PRIx64 ")", this, GetID()); 51ee87e750SJason Molenda DestroyThread(); 5202706c32SJason Molenda } 5302706c32SJason Molenda 5402706c32SJason Molenda lldb::RegisterContextSP 5502706c32SJason Molenda HistoryThread::GetRegisterContext () 5602706c32SJason Molenda { 5702706c32SJason Molenda RegisterContextSP rctx ; 5802706c32SJason Molenda if (m_pcs.size() > 0) 5902706c32SJason Molenda { 6002706c32SJason Molenda rctx.reset (new RegisterContextHistory (*this, 0, GetProcess()->GetAddressByteSize(), m_pcs[0])); 6102706c32SJason Molenda } 6202706c32SJason Molenda return rctx; 6302706c32SJason Molenda 6402706c32SJason Molenda } 6502706c32SJason Molenda 6602706c32SJason Molenda lldb::RegisterContextSP 6702706c32SJason Molenda HistoryThread::CreateRegisterContextForFrame (StackFrame *frame) 6802706c32SJason Molenda { 6902706c32SJason Molenda return m_unwinder_ap->CreateRegisterContextForFrame (frame); 7002706c32SJason Molenda } 7102706c32SJason Molenda 7202706c32SJason Molenda lldb::StackFrameListSP 7302706c32SJason Molenda HistoryThread::GetStackFrameList () 7402706c32SJason Molenda { 7502706c32SJason Molenda Mutex::Locker (m_framelist_mutex); 7602706c32SJason Molenda if (m_framelist.get() == NULL) 7702706c32SJason Molenda { 7802706c32SJason Molenda m_framelist.reset (new StackFrameList (*this, StackFrameListSP(), true)); 7902706c32SJason Molenda } 8002706c32SJason Molenda 8102706c32SJason Molenda return m_framelist; 8202706c32SJason Molenda } 838ee9cb58SJason Molenda 848ee9cb58SJason Molenda uint32_t 858ee9cb58SJason Molenda HistoryThread::GetExtendedBacktraceOriginatingIndexID () 868ee9cb58SJason Molenda { 878ee9cb58SJason Molenda if (m_originating_unique_thread_id != LLDB_INVALID_THREAD_ID) 888ee9cb58SJason Molenda { 898ee9cb58SJason Molenda if (GetProcess()->HasAssignedIndexIDToThread (m_originating_unique_thread_id)) 908ee9cb58SJason Molenda { 918ee9cb58SJason Molenda return GetProcess()->AssignIndexIDToThread (m_originating_unique_thread_id); 928ee9cb58SJason Molenda } 938ee9cb58SJason Molenda } 948ee9cb58SJason Molenda return LLDB_INVALID_THREAD_ID; 958ee9cb58SJason Molenda } 96