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 23a8ff543cSJason Molenda // Constructor 24a8ff543cSJason Molenda 25*16ff8604SSaleem Abdulrasool HistoryThread::HistoryThread(lldb_private::Process &process, lldb::tid_t tid, std::vector<lldb::addr_t> pcs, 26*16ff8604SSaleem Abdulrasool uint32_t stop_id, bool stop_id_is_valid) 27*16ff8604SSaleem Abdulrasool : Thread(process, tid, true), 2802706c32SJason Molenda m_framelist_mutex(), 2902706c32SJason Molenda m_framelist(), 3002706c32SJason Molenda m_pcs(pcs), 3102706c32SJason Molenda m_stop_id(stop_id), 32a7b5afa9SJason Molenda m_stop_id_is_valid(stop_id_is_valid), 338ee9cb58SJason Molenda m_extended_unwind_token(LLDB_INVALID_ADDRESS), 348ee9cb58SJason Molenda m_queue_name(), 358ee9cb58SJason Molenda m_thread_name(), 36a6e9130dSJason Molenda m_originating_unique_thread_id(tid), 37a6e9130dSJason Molenda m_queue_id(LLDB_INVALID_QUEUE_ID) 3802706c32SJason Molenda { 39f0e65fc5SEric Christopher m_unwinder_ap.reset(new HistoryUnwind(*this, pcs, stop_id_is_valid)); 40ee87e750SJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OBJECT)); 41ee87e750SJason Molenda if (log) 42*16ff8604SSaleem Abdulrasool log->Printf("%p HistoryThread::HistoryThread", static_cast<void *>(this)); 4302706c32SJason Molenda } 4402706c32SJason Molenda 45a8ff543cSJason Molenda // Destructor 46a8ff543cSJason Molenda 4702706c32SJason Molenda HistoryThread::~HistoryThread () 4802706c32SJason Molenda { 49ee87e750SJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 50ee87e750SJason Molenda if (log) 51324a1036SSaleem Abdulrasool log->Printf ("%p HistoryThread::~HistoryThread (tid=0x%" PRIx64 ")", 52324a1036SSaleem Abdulrasool static_cast<void*>(this), GetID()); 53ee87e750SJason Molenda DestroyThread(); 5402706c32SJason Molenda } 5502706c32SJason Molenda 5602706c32SJason Molenda lldb::RegisterContextSP 5702706c32SJason Molenda HistoryThread::GetRegisterContext () 5802706c32SJason Molenda { 5902706c32SJason Molenda RegisterContextSP rctx ; 6002706c32SJason Molenda if (m_pcs.size() > 0) 6102706c32SJason Molenda { 6202706c32SJason Molenda rctx.reset (new RegisterContextHistory (*this, 0, GetProcess()->GetAddressByteSize(), m_pcs[0])); 6302706c32SJason Molenda } 6402706c32SJason Molenda return rctx; 6502706c32SJason Molenda 6602706c32SJason Molenda } 6702706c32SJason Molenda 6802706c32SJason Molenda lldb::RegisterContextSP 6902706c32SJason Molenda HistoryThread::CreateRegisterContextForFrame (StackFrame *frame) 7002706c32SJason Molenda { 7102706c32SJason Molenda return m_unwinder_ap->CreateRegisterContextForFrame (frame); 7202706c32SJason Molenda } 7302706c32SJason Molenda 7402706c32SJason Molenda lldb::StackFrameListSP 7502706c32SJason Molenda HistoryThread::GetStackFrameList () 7602706c32SJason Molenda { 77*16ff8604SSaleem Abdulrasool // FIXME do not throw away the lock after we acquire it.. 78*16ff8604SSaleem Abdulrasool std::unique_lock<std::mutex> lock(m_framelist_mutex); 79*16ff8604SSaleem Abdulrasool lock.release(); 8002706c32SJason Molenda if (m_framelist.get() == NULL) 8102706c32SJason Molenda { 8202706c32SJason Molenda m_framelist.reset (new StackFrameList (*this, StackFrameListSP(), true)); 8302706c32SJason Molenda } 8402706c32SJason Molenda 8502706c32SJason Molenda return m_framelist; 8602706c32SJason Molenda } 878ee9cb58SJason Molenda 888ee9cb58SJason Molenda uint32_t 898ee9cb58SJason Molenda HistoryThread::GetExtendedBacktraceOriginatingIndexID () 908ee9cb58SJason Molenda { 918ee9cb58SJason Molenda if (m_originating_unique_thread_id != LLDB_INVALID_THREAD_ID) 928ee9cb58SJason Molenda { 938ee9cb58SJason Molenda if (GetProcess()->HasAssignedIndexIDToThread (m_originating_unique_thread_id)) 948ee9cb58SJason Molenda { 958ee9cb58SJason Molenda return GetProcess()->AssignIndexIDToThread (m_originating_unique_thread_id); 968ee9cb58SJason Molenda } 978ee9cb58SJason Molenda } 988ee9cb58SJason Molenda return LLDB_INVALID_THREAD_ID; 998ee9cb58SJason Molenda } 100