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 2502706c32SJason Molenda HistoryThread::HistoryThread (lldb_private::Process &process, 268ee9cb58SJason Molenda lldb::tid_t tid, 2702706c32SJason Molenda std::vector<lldb::addr_t> pcs, 2802706c32SJason Molenda uint32_t stop_id, 2902706c32SJason Molenda bool stop_id_is_valid) : 30a8ff543cSJason Molenda Thread (process, tid, true), 3102706c32SJason Molenda m_framelist_mutex(), 3202706c32SJason Molenda m_framelist(), 3302706c32SJason Molenda m_pcs (pcs), 3402706c32SJason Molenda m_stop_id (stop_id), 35a7b5afa9SJason Molenda m_stop_id_is_valid (stop_id_is_valid), 368ee9cb58SJason Molenda m_extended_unwind_token (LLDB_INVALID_ADDRESS), 378ee9cb58SJason Molenda m_queue_name (), 388ee9cb58SJason Molenda m_thread_name (), 39a6e9130dSJason Molenda m_originating_unique_thread_id (tid), 40a6e9130dSJason Molenda m_queue_id (LLDB_INVALID_QUEUE_ID) 4102706c32SJason Molenda { 4202706c32SJason Molenda m_unwinder_ap.reset (new HistoryUnwind (*this, pcs, stop_id, stop_id_is_valid)); 43ee87e750SJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 44ee87e750SJason Molenda if (log) 45324a1036SSaleem Abdulrasool log->Printf ("%p HistoryThread::HistoryThread", 46324a1036SSaleem Abdulrasool static_cast<void*>(this)); 4702706c32SJason Molenda } 4802706c32SJason Molenda 49a8ff543cSJason Molenda // Destructor 50a8ff543cSJason Molenda 5102706c32SJason Molenda HistoryThread::~HistoryThread () 5202706c32SJason Molenda { 53ee87e750SJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 54ee87e750SJason Molenda if (log) 55324a1036SSaleem Abdulrasool log->Printf ("%p HistoryThread::~HistoryThread (tid=0x%" PRIx64 ")", 56324a1036SSaleem Abdulrasool static_cast<void*>(this), GetID()); 57ee87e750SJason Molenda DestroyThread(); 5802706c32SJason Molenda } 5902706c32SJason Molenda 6002706c32SJason Molenda lldb::RegisterContextSP 6102706c32SJason Molenda HistoryThread::GetRegisterContext () 6202706c32SJason Molenda { 6302706c32SJason Molenda RegisterContextSP rctx ; 6402706c32SJason Molenda if (m_pcs.size() > 0) 6502706c32SJason Molenda { 6602706c32SJason Molenda rctx.reset (new RegisterContextHistory (*this, 0, GetProcess()->GetAddressByteSize(), m_pcs[0])); 6702706c32SJason Molenda } 6802706c32SJason Molenda return rctx; 6902706c32SJason Molenda 7002706c32SJason Molenda } 7102706c32SJason Molenda 7202706c32SJason Molenda lldb::RegisterContextSP 7302706c32SJason Molenda HistoryThread::CreateRegisterContextForFrame (StackFrame *frame) 7402706c32SJason Molenda { 7502706c32SJason Molenda return m_unwinder_ap->CreateRegisterContextForFrame (frame); 7602706c32SJason Molenda } 7702706c32SJason Molenda 7802706c32SJason Molenda lldb::StackFrameListSP 7902706c32SJason Molenda HistoryThread::GetStackFrameList () 8002706c32SJason Molenda { 81*d81c4839SJason Molenda Mutex::Locker (m_framelist_mutex); // FIXME do not throw away the lock after we acquire it.. 8202706c32SJason Molenda if (m_framelist.get() == NULL) 8302706c32SJason Molenda { 8402706c32SJason Molenda m_framelist.reset (new StackFrameList (*this, StackFrameListSP(), true)); 8502706c32SJason Molenda } 8602706c32SJason Molenda 8702706c32SJason Molenda return m_framelist; 8802706c32SJason Molenda } 898ee9cb58SJason Molenda 908ee9cb58SJason Molenda uint32_t 918ee9cb58SJason Molenda HistoryThread::GetExtendedBacktraceOriginatingIndexID () 928ee9cb58SJason Molenda { 938ee9cb58SJason Molenda if (m_originating_unique_thread_id != LLDB_INVALID_THREAD_ID) 948ee9cb58SJason Molenda { 958ee9cb58SJason Molenda if (GetProcess()->HasAssignedIndexIDToThread (m_originating_unique_thread_id)) 968ee9cb58SJason Molenda { 978ee9cb58SJason Molenda return GetProcess()->AssignIndexIDToThread (m_originating_unique_thread_id); 988ee9cb58SJason Molenda } 998ee9cb58SJason Molenda } 1008ee9cb58SJason Molenda return LLDB_INVALID_THREAD_ID; 1018ee9cb58SJason Molenda } 102