1 //===-- HistoryThread.cpp ---------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/lldb-private.h" 11 12 #include "Plugins/Process/Utility/HistoryUnwind.h" 13 #include "Plugins/Process/Utility/HistoryThread.h" 14 #include "Plugins/Process/Utility/RegisterContextHistory.h" 15 16 #include "lldb/Core/Log.h" 17 #include "lldb/Target/StackFrameList.h" 18 #include "lldb/Target/Process.h" 19 20 using namespace lldb; 21 using namespace lldb_private; 22 23 HistoryThread::HistoryThread (lldb_private::Process &process, 24 lldb::tid_t tid, 25 std::vector<lldb::addr_t> pcs, 26 uint32_t stop_id, 27 bool stop_id_is_valid) : 28 Thread (process, LLDB_INVALID_THREAD_ID), 29 m_framelist_mutex(), 30 m_framelist(), 31 m_pcs (pcs), 32 m_stop_id (stop_id), 33 m_stop_id_is_valid (stop_id_is_valid), 34 m_extended_unwind_token (LLDB_INVALID_ADDRESS), 35 m_queue_name (), 36 m_thread_name (), 37 m_originating_unique_thread_id (tid) 38 { 39 m_unwinder_ap.reset (new HistoryUnwind (*this, pcs, stop_id, stop_id_is_valid)); 40 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 41 if (log) 42 log->Printf ("%p HistoryThread::HistoryThread", this); 43 } 44 45 HistoryThread::~HistoryThread () 46 { 47 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 48 if (log) 49 log->Printf ("%p HistoryThread::~HistoryThread (tid=0x%" PRIx64 ")", this, GetID()); 50 DestroyThread(); 51 } 52 53 lldb::RegisterContextSP 54 HistoryThread::GetRegisterContext () 55 { 56 RegisterContextSP rctx ; 57 if (m_pcs.size() > 0) 58 { 59 rctx.reset (new RegisterContextHistory (*this, 0, GetProcess()->GetAddressByteSize(), m_pcs[0])); 60 } 61 return rctx; 62 63 } 64 65 lldb::RegisterContextSP 66 HistoryThread::CreateRegisterContextForFrame (StackFrame *frame) 67 { 68 return m_unwinder_ap->CreateRegisterContextForFrame (frame); 69 } 70 71 lldb::StackFrameListSP 72 HistoryThread::GetStackFrameList () 73 { 74 Mutex::Locker (m_framelist_mutex); 75 if (m_framelist.get() == NULL) 76 { 77 m_framelist.reset (new StackFrameList (*this, StackFrameListSP(), true)); 78 } 79 80 return m_framelist; 81 } 82 83 uint32_t 84 HistoryThread::GetExtendedBacktraceOriginatingIndexID () 85 { 86 if (m_originating_unique_thread_id != LLDB_INVALID_THREAD_ID) 87 { 88 if (GetProcess()->HasAssignedIndexIDToThread (m_originating_unique_thread_id)) 89 { 90 return GetProcess()->AssignIndexIDToThread (m_originating_unique_thread_id); 91 } 92 } 93 return LLDB_INVALID_THREAD_ID; 94 } 95